From 784ab04d40b0e1c8c5a69db8c79e6b2c86e4b6ea Mon Sep 17 00:00:00 2001 From: bill-auger Date: Oct 08 2021 05:24:00 +0000 Subject: [PATCH 1/23] [iceweasel]: update branding checksum --- diff --git a/libre/iceweasel/PKGBUILD b/libre/iceweasel/PKGBUILD index e09263d..9d13a0a 100644 --- a/libre/iceweasel/PKGBUILD +++ b/libre/iceweasel/PKGBUILD @@ -87,7 +87,7 @@ sha256sums=('299a472373021cc9194449c9f4bb962d5f74ef05e8af0448c589761ea34fbc84' 'SKIP' 'd7c7a65c4b7ec9ea40df129724ffb369d3f775b0514e3c267c52eec6d284b5e6' '9cdc2602661717712092d28bb494e5b48e518cb930898aca85eaf21f91f7ef58') -sha256sums+=('b3cf2d984a979a1daf997efaa46358c601a7b3e957cbc21f4155ea0a72def8e5' +sha256sums+=('5552a56e40aef9fa174676f2b303208d905f519d2bb868d9cefe0950a2f65373' 'SKIP' '6ebbf18792cb57067f500fd4575c341d4708c5c0a232d676471f87dfa590621b' 'afeaeb6e9a6af901b57e25d85014e5c792efe4ff9dabb58663377f487b9d2887' From e69e247f97e6a193677b81277b0639bec066808f Mon Sep 17 00:00:00 2001 From: grizzlyuser Date: Oct 08 2021 05:26:52 +0000 Subject: [PATCH 2/23] libre/iceweasel: Update to 93.0 according to upstreams Arch Linux ARM has removed the patch and webrtc disable flag --- diff --git a/libre/iceweasel/0001-Use-remoting-name-for-GDK-application-names.patch b/libre/iceweasel/0001-Use-remoting-name-for-GDK-application-names.patch index 6060c34..c1feb3f 100644 --- a/libre/iceweasel/0001-Use-remoting-name-for-GDK-application-names.patch +++ b/libre/iceweasel/0001-Use-remoting-name-for-GDK-application-names.patch @@ -9,10 +9,10 @@ Subject: [PATCH] Use remoting name for GDK application names 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp -index 055be3e7a3554..f660bd26e331c 100644 +index bb14d84338334..f5c0222987fb0 100644 --- a/toolkit/xre/nsAppRunner.cpp +++ b/toolkit/xre/nsAppRunner.cpp -@@ -4304,11 +4304,7 @@ int XREMain::XRE_mainStartup(bool* aExitFlag) { +@@ -4299,11 +4299,7 @@ int XREMain::XRE_mainStartup(bool* aExitFlag) { // consistently. // Set program name to the one defined in application.ini. diff --git a/libre/iceweasel/9001-FSDG-always-sync-remote-settings-with-local-dump.patch b/libre/iceweasel/9001-FSDG-always-sync-remote-settings-with-local-dump.patch index de515a4..9fcaef7 100644 --- a/libre/iceweasel/9001-FSDG-always-sync-remote-settings-with-local-dump.patch +++ b/libre/iceweasel/9001-FSDG-always-sync-remote-settings-with-local-dump.patch @@ -318,10 +318,12 @@ index ef91781ac6..8736951968 100644 const params = { ...filters, _expected: expectedTimestamp ?? 0, -@@ -166,6 +166,9 @@ var Utils = { +@@ -273,7 +264,10 @@ var Utils = { + .map(([k, v]) => `${k}=${encodeURIComponent(v)}`) .join("&"); } - const response = await fetch(url); +- const response = await Utils.fetch(url); ++ const response = await fetch(url); + const responseDate = new Date().toUTCString() + response.headers.set("Date", responseDate); + response.headers.set("Last-Modified", responseDate); diff --git a/libre/iceweasel/PKGBUILD b/libre/iceweasel/PKGBUILD index 9d13a0a..a418503 100644 --- a/libre/iceweasel/PKGBUILD +++ b/libre/iceweasel/PKGBUILD @@ -47,10 +47,10 @@ pkgname=iceweasel epoch=1 -pkgver=92.0 +pkgver=93.0 pkgrel=1 pkgrel+=.parabola1 -_brandingver=91.0-1 +_brandingver=93.0-1 pkgdesc="Standalone web browser derived from Mozilla Firefox" arch=(x86_64) arch+=(i686 armv7h) @@ -79,25 +79,23 @@ source+=(https://repo.parabola.nu/other/iceweasel/${pkgname}_${_brandingver}.bra 9003-FSDG-misc.patch process-json-files.py vendor.js.in) -source_armv7h=(arm.patch - build-arm-libopus.patch) +source_armv7h=(build-arm-libopus.patch) source_i686=('avoid-libxul-OOM-python-check.patch' 'rust-static-disable-network-test-on-static-libraries.patch') -sha256sums=('299a472373021cc9194449c9f4bb962d5f74ef05e8af0448c589761ea34fbc84' +sha256sums=('a78f080f5849bc284b84299f3540934a12e961a7ea368b592ae6576ea1f97102' 'SKIP' - 'd7c7a65c4b7ec9ea40df129724ffb369d3f775b0514e3c267c52eec6d284b5e6' + 'bb9769a8fe720abea2bba5b895c70c4fba0d44bb553399d83350268edf85cdeb' '9cdc2602661717712092d28bb494e5b48e518cb930898aca85eaf21f91f7ef58') -sha256sums+=('5552a56e40aef9fa174676f2b303208d905f519d2bb868d9cefe0950a2f65373' +sha256sums+=('d0f9afefbaaf838bbdd4067df0bbcd03e0e0a60a3e3addecdcc62ffb9c432015' 'SKIP' - '6ebbf18792cb57067f500fd4575c341d4708c5c0a232d676471f87dfa590621b' + '362d38ac2d99da2eec85bb5723239e7044e302503956488d0df31132409b993d' 'afeaeb6e9a6af901b57e25d85014e5c792efe4ff9dabb58663377f487b9d2887' '39e3a5e1ad137e21f842a44d7e3bd24050292d2b41fe59b4e7c7dfed52a195dd' '9386f1c50506cd20ab6d212335d5e4417faeb2aea371dd46f2d107d171e80b83' 'c93ce98e1cb64033079343ff1f3037fab6a3bc6d3eb5bc14c5edb70e2d45965d') sha256sums_i686=('2f0c81a38c4578f68f5456b618fe84a78974072821488173eb55e0e72287e353' '10c5276eab2e87f400a6ec15d7ffbef3b0407ee888dea36f1128927ca55b9041') -sha256sums_armv7h=('bc00516032330760444939c516a60c78f868631e1b37f075f0fe71a53737b966' - '2d4d91f7e35d0860225084e37ec320ca6cae669f6c9c8fe7735cdbd542e3a7c9') +sha256sums_armv7h=('2d4d91f7e35d0860225084e37ec320ca6cae669f6c9c8fe7735cdbd542e3a7c9') validpgpkeys=('14F26682D0916CDD81E37B6D61B7B526D98F0353') # Mozilla Software Releases validpgpkeys+=('BFA8008A8265677063B11BF47171986E4B745536') # Andreas Grapentin validpgpkeys+=('3954A7AB837D0EA9CFA9798925DB7D9B5A8D4B40') # bill-auger @@ -198,7 +196,6 @@ END cat >>../mozconfig < Date: Oct 08 2021 05:28:29 +0000 Subject: [PATCH 3/23] [iceweasel]: update branding checksum --- diff --git a/libre/iceweasel/PKGBUILD b/libre/iceweasel/PKGBUILD index a418503..96b248a 100644 --- a/libre/iceweasel/PKGBUILD +++ b/libre/iceweasel/PKGBUILD @@ -86,7 +86,7 @@ sha256sums=('a78f080f5849bc284b84299f3540934a12e961a7ea368b592ae6576ea1f97102' 'SKIP' 'bb9769a8fe720abea2bba5b895c70c4fba0d44bb553399d83350268edf85cdeb' '9cdc2602661717712092d28bb494e5b48e518cb930898aca85eaf21f91f7ef58') -sha256sums+=('d0f9afefbaaf838bbdd4067df0bbcd03e0e0a60a3e3addecdcc62ffb9c432015' +sha256sums+=('2b2dcb5f15dba7f4ce8bc19de260dbc75219a93b107931bb0f6aff705c579fe5' 'SKIP' '362d38ac2d99da2eec85bb5723239e7044e302503956488d0df31132409b993d' 'afeaeb6e9a6af901b57e25d85014e5c792efe4ff9dabb58663377f487b9d2887' From d9fe50a454470a940fd1e95a723fd27e0b253264 Mon Sep 17 00:00:00 2001 From: David P Date: Oct 11 2021 22:27:51 +0000 Subject: [PATCH 4/23] updpkg: libre/linux-libre 5.14.11-1 Signed-off-by: David P --- diff --git a/libre/linux-libre/0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch b/libre/linux-libre/0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch index c5e5b05..46cfcfa 100644 --- a/libre/linux-libre/0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch +++ b/libre/linux-libre/0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch @@ -1,7 +1,7 @@ -From 90de407f12e8ed9cb361678882c2af236b06107e Mon Sep 17 00:00:00 2001 +From f76db6fc04fadf872a138740592b4e8ec9ba9149 Mon Sep 17 00:00:00 2001 From: "Jan Alexander Steffens (heftig)" Date: Mon, 16 Sep 2019 04:53:20 +0200 -Subject: [PATCH 1/2] ZEN: Add sysctl and CONFIG to disallow unprivileged +Subject: [PATCH 1/6] ZEN: Add sysctl and CONFIG to disallow unprivileged CLONE_NEWUSER Our default behavior continues to match the vanilla kernel. @@ -14,10 +14,10 @@ Our default behavior continues to match the vanilla kernel. 5 files changed, 53 insertions(+) diff --git a/include/linux/user_namespace.h b/include/linux/user_namespace.h -index bfa6463f8a95..27aa2bd5e50a 100644 +index eb70cabe6e7f..dda54e3bc47c 100644 --- a/include/linux/user_namespace.h +++ b/include/linux/user_namespace.h -@@ -116,6 +116,8 @@ void put_ucounts(struct ucounts *ucounts); +@@ -137,6 +137,8 @@ static inline void set_rlimit_ucount_max(struct user_namespace *ns, #ifdef CONFIG_USER_NS @@ -26,7 +26,7 @@ index bfa6463f8a95..27aa2bd5e50a 100644 static inline struct user_namespace *get_user_ns(struct user_namespace *ns) { if (ns) -@@ -149,6 +151,8 @@ extern bool current_in_userns(const struct user_namespace *target_ns); +@@ -170,6 +172,8 @@ extern bool current_in_userns(const struct user_namespace *target_ns); struct ns_common *ns_get_owner(struct ns_common *ns); #else @@ -36,10 +36,10 @@ index bfa6463f8a95..27aa2bd5e50a 100644 { return &init_user_ns; diff --git a/init/Kconfig b/init/Kconfig -index a61c92066c2e..6a2920f2e2ad 100644 +index 55f9f7738ebb..33c6a820ac08 100644 --- a/init/Kconfig +++ b/init/Kconfig -@@ -1195,6 +1195,22 @@ config USER_NS +@@ -1198,6 +1198,22 @@ config USER_NS If unsure, say N. @@ -63,7 +63,7 @@ index a61c92066c2e..6a2920f2e2ad 100644 bool "PID Namespaces" default y diff --git a/kernel/fork.c b/kernel/fork.c -index 567fee340500..f8ad32116152 100644 +index cbba21e3a58d..7267d46c29ea 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -98,6 +98,10 @@ @@ -77,7 +77,7 @@ index 567fee340500..f8ad32116152 100644 #include #include #include -@@ -1871,6 +1875,10 @@ static __latent_entropy struct task_struct *copy_process( +@@ -1877,6 +1881,10 @@ static __latent_entropy struct task_struct *copy_process( if ((clone_flags & (CLONE_NEWUSER|CLONE_FS)) == (CLONE_NEWUSER|CLONE_FS)) return ERR_PTR(-EINVAL); @@ -88,7 +88,7 @@ index 567fee340500..f8ad32116152 100644 /* * Thread groups must share signals as well, and detached threads * can only be started up within the thread group. -@@ -2973,6 +2981,12 @@ int ksys_unshare(unsigned long unshare_flags) +@@ -2981,6 +2989,12 @@ int ksys_unshare(unsigned long unshare_flags) if (unshare_flags & CLONE_NEWNS) unshare_flags |= CLONE_FS; @@ -102,10 +102,10 @@ index 567fee340500..f8ad32116152 100644 if (err) goto bad_unshare_out; diff --git a/kernel/sysctl.c b/kernel/sysctl.c -index d4a78e08f6d8..0260dfe2daff 100644 +index 272f4a272f8c..760e8a2d815d 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c -@@ -103,6 +103,9 @@ +@@ -105,6 +105,9 @@ #ifdef CONFIG_LOCKUP_DETECTOR #include #endif @@ -115,7 +115,7 @@ index d4a78e08f6d8..0260dfe2daff 100644 #if defined(CONFIG_SYSCTL) -@@ -1896,6 +1899,15 @@ static struct ctl_table kern_table[] = { +@@ -1908,6 +1911,15 @@ static struct ctl_table kern_table[] = { .proc_handler = proc_dointvec, }, #endif @@ -132,7 +132,7 @@ index d4a78e08f6d8..0260dfe2daff 100644 { .procname = "tainted", diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c -index 27670ab7a4ed..300c72d2a381 100644 +index ef82d401dde8..5a6c2e07174b 100644 --- a/kernel/user_namespace.c +++ b/kernel/user_namespace.c @@ -21,6 +21,13 @@ @@ -150,5 +150,5 @@ index 27670ab7a4ed..300c72d2a381 100644 static DEFINE_MUTEX(userns_state_mutex); -- -2.32.0 +2.33.0 diff --git a/libre/linux-libre/0002-Bluetooth-btusb-Add-support-for-IMC-Networks-Mediate.patch b/libre/linux-libre/0002-Bluetooth-btusb-Add-support-for-IMC-Networks-Mediate.patch new file mode 100644 index 0000000..09a894e --- /dev/null +++ b/libre/linux-libre/0002-Bluetooth-btusb-Add-support-for-IMC-Networks-Mediate.patch @@ -0,0 +1,79 @@ +From 810821eb3b1894f2cfcc29cffd42d193b8fe54a6 Mon Sep 17 00:00:00 2001 +From: Wai Paulo Valerio Wang +Date: Thu, 8 Jul 2021 04:00:59 +0800 +Subject: [PATCH 2/6] Bluetooth: btusb: Add support for IMC Networks Mediatek + Chip + +This add supports for IMC Networks Wireless_Device Media Chip +which contains the MT7921 chipset. + +$ lsusb + +Bus 001 Device 004: ID 13d3:3563 IMC Networks Wireless_Device + +$ cat /sys/kernel/debug/usb/devices + +T: Bus=01 Lev=01 Prnt=01 Port=03 Cnt=03 Dev#= 4 Spd=480 MxCh= 0 +D: Ver= 2.10 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs= 1 +P: Vendor=13d3 ProdID=3563 Rev= 1.00 +S: Manufacturer=MediaTek Inc. +S: Product=Wireless_Device +S: SerialNumber=000000000 +C:* #Ifs= 3 Cfg#= 1 Atr=e0 MxPwr=100mA +A: FirstIf#= 0 IfCount= 3 Cls=e0(wlcon) Sub=01 Prot=01 +I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=125us +E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms +E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms +I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms +I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms +I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms +I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms +I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms +I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms +I: If#= 1 Alt= 6 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 63 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 63 Ivl=1ms +I:* If#= 2 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none) +E: Ad=8a(I) Atr=03(Int.) MxPS= 64 Ivl=125us +E: Ad=0a(O) Atr=03(Int.) MxPS= 64 Ivl=125us +I: If#= 2 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none) +E: Ad=8a(I) Atr=03(Int.) MxPS= 512 Ivl=125us +E: Ad=0a(O) Atr=03(Int.) MxPS= 512 Ivl=125us + +Signed-off-by: Wai Paulo Valerio Wang +Signed-off-by: Marcel Holtmann +For: https://bugs.archlinux.org/task/72138 +--- + drivers/bluetooth/btusb.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c +index bd37d6fb88c2..e13a510e1698 100644 +--- a/drivers/bluetooth/btusb.c ++++ b/drivers/bluetooth/btusb.c +@@ -414,6 +414,9 @@ static const struct usb_device_id blacklist_table[] = { + { USB_DEVICE(0x04ca, 0x3802), .driver_info = BTUSB_MEDIATEK | + BTUSB_WIDEBAND_SPEECH | + BTUSB_VALID_LE_STATES }, ++ { USB_DEVICE(0x13d3, 0x3563), .driver_info = BTUSB_MEDIATEK | ++ BTUSB_WIDEBAND_SPEECH | ++ BTUSB_VALID_LE_STATES }, + + /* Additional Realtek 8723AE Bluetooth devices */ + { USB_DEVICE(0x0930, 0x021d), .driver_info = BTUSB_REALTEK }, +-- +2.33.0 + diff --git a/libre/linux-libre/0002-Bluetooth-btusb-check-conditions-before-enabling-USB.patch b/libre/linux-libre/0002-Bluetooth-btusb-check-conditions-before-enabling-USB.patch deleted file mode 100644 index 574623c..0000000 --- a/libre/linux-libre/0002-Bluetooth-btusb-check-conditions-before-enabling-USB.patch +++ /dev/null @@ -1,85 +0,0 @@ -From bdb12383a58d6989a0b1c2f925890948146bbc90 Mon Sep 17 00:00:00 2001 -From: Pauli Virtanen -Date: Mon, 26 Jul 2021 21:02:06 +0300 -Subject: [PATCH 2/2] Bluetooth: btusb: check conditions before enabling USB - ALT 3 for WBS -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Some USB BT adapters don't satisfy the MTU requirement mentioned in -commit e848dbd364ac ("Bluetooth: btusb: Add support USB ALT 3 for WBS") -and have ALT 3 setting that produces no/garbled audio. Some adapters -with larger MTU were also reported to have problems with ALT 3. - -Add a flag and check it and MTU before selecting ALT 3, falling back to -ALT 1. Enable the flag for Realtek, restoring the previous behavior for -non-Realtek devices. - -Tested with USB adapters (mtu<72, no/garbled sound with ALT3, ALT1 -works) BCM20702A1 0b05:17cb, CSR8510A10 0a12:0001, and (mtu>=72, ALT3 -works) RTL8761BU 0bda:8771, Intel AX200 8087:0029 (after disabling -ALT6). Also got reports for (mtu>=72, ALT 3 reported to produce bad -audio) Intel 8087:0a2b. - -Signed-off-by: Pauli Virtanen -Fixes: e848dbd364ac ("Bluetooth: btusb: Add support USB ALT 3 for WBS") -Tested-by: Michał Kępień - -Fixes: https://bugs.archlinux.org/task/71567 ---- - drivers/bluetooth/btusb.c | 22 ++++++++++++++-------- - 1 file changed, 14 insertions(+), 8 deletions(-) - -diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c -index 6d23308119d1..e8062d0b7d4d 100644 ---- a/drivers/bluetooth/btusb.c -+++ b/drivers/bluetooth/btusb.c -@@ -516,6 +516,7 @@ static const struct dmi_system_id btusb_needs_reset_resume_table[] = { - #define BTUSB_HW_RESET_ACTIVE 12 - #define BTUSB_TX_WAIT_VND_EVT 13 - #define BTUSB_WAKEUP_DISABLE 14 -+#define BTUSB_USE_ALT3_FOR_WBS 15 - - struct btusb_data { - struct hci_dev *hdev; -@@ -1748,16 +1749,20 @@ static void btusb_work(struct work_struct *work) - /* Bluetooth USB spec recommends alt 6 (63 bytes), but - * many adapters do not support it. Alt 1 appears to - * work for all adapters that do not have alt 6, and -- * which work with WBS at all. -+ * which work with WBS at all. Some devices prefer -+ * alt 3 (HCI payload >= 60 Bytes let air packet -+ * data satisfy 60 bytes), requiring -+ * MTU >= 3 (packets) * 25 (size) - 3 (headers) = 72 -+ * see also Core spec 5, vol 4, B 2.1.1 & Table 2.1. - */ -- new_alts = btusb_find_altsetting(data, 6) ? 6 : 1; -- /* Because mSBC frames do not need to be aligned to the -- * SCO packet boundary. If support the Alt 3, use the -- * Alt 3 for HCI payload >= 60 Bytes let air packet -- * data satisfy 60 bytes. -- */ -- if (new_alts == 1 && btusb_find_altsetting(data, 3)) -+ if (btusb_find_altsetting(data, 6)) -+ new_alts = 6; -+ else if (test_bit(BTUSB_USE_ALT3_FOR_WBS, &data->flags) && -+ hdev->sco_mtu >= 72 && -+ btusb_find_altsetting(data, 3)) - new_alts = 3; -+ else -+ new_alts = 1; - } - - if (btusb_switch_alt_setting(hdev, new_alts) < 0) -@@ -4733,6 +4738,7 @@ static int btusb_probe(struct usb_interface *intf, - * (DEVICE_REMOTE_WAKEUP) - */ - set_bit(BTUSB_WAKEUP_DISABLE, &data->flags); -+ set_bit(BTUSB_USE_ALT3_FOR_WBS, &data->flags); - } - - if (!reset) --- -2.32.0 - diff --git a/libre/linux-libre/0003-Bluetooth-btusb-Add-support-for-Foxconn-Mediatek-Chi.patch b/libre/linux-libre/0003-Bluetooth-btusb-Add-support-for-Foxconn-Mediatek-Chi.patch new file mode 100644 index 0000000..4af5a53 --- /dev/null +++ b/libre/linux-libre/0003-Bluetooth-btusb-Add-support-for-Foxconn-Mediatek-Chi.patch @@ -0,0 +1,71 @@ +From 38c2ca84b97f9d6021c2607e214f99acd84dac2d Mon Sep 17 00:00:00 2001 +From: Aaron Ma +Date: Fri, 23 Jul 2021 01:17:18 +0800 +Subject: [PATCH 3/6] Bluetooth: btusb: Add support for Foxconn Mediatek Chip + +Add support for another Foxconn / Hon Hai device with MT7921 chip. + +T: Bus=05 Lev=01 Prnt=01 Port=03 Cnt=02 Dev#= 3 Spd=480 MxCh= 0 +D: Ver= 2.10 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs= 1 +P: Vendor=0489 ProdID=e0cd Rev= 1.00 +S: Manufacturer=MediaTek Inc. +S: Product=Wireless_Device +S: SerialNumber=000000000 +C:* #Ifs= 3 Cfg#= 1 Atr=e0 MxPwr=100mA +A: FirstIf#= 0 IfCount= 3 Cls=e0(wlcon) Sub=01 Prot=01 +I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=125us +E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms +E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms +I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms +I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms +I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms +I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms +I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms +I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms +I: If#= 1 Alt= 6 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 63 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 63 Ivl=1ms +I:* If#= 2 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none) +E: Ad=8a(I) Atr=03(Int.) MxPS= 64 Ivl=125us +E: Ad=0a(O) Atr=03(Int.) MxPS= 64 Ivl=125us +I: If#= 2 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none) +E: Ad=8a(I) Atr=03(Int.) MxPS= 512 Ivl=125us +E: Ad=0a(O) Atr=03(Int.) MxPS= 512 Ivl=125us + +Signed-off-by: Aaron Ma +Signed-off-by: Marcel Holtmann +For: https://bugs.archlinux.org/task/72138 +--- + drivers/bluetooth/btusb.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c +index e13a510e1698..aac732cc9612 100644 +--- a/drivers/bluetooth/btusb.c ++++ b/drivers/bluetooth/btusb.c +@@ -417,6 +417,9 @@ static const struct usb_device_id blacklist_table[] = { + { USB_DEVICE(0x13d3, 0x3563), .driver_info = BTUSB_MEDIATEK | + BTUSB_WIDEBAND_SPEECH | + BTUSB_VALID_LE_STATES }, ++ { USB_DEVICE(0x0489, 0xe0cd), .driver_info = BTUSB_MEDIATEK | ++ BTUSB_WIDEBAND_SPEECH | ++ BTUSB_VALID_LE_STATES }, + + /* Additional Realtek 8723AE Bluetooth devices */ + { USB_DEVICE(0x0930, 0x021d), .driver_info = BTUSB_REALTEK }, +-- +2.33.0 + diff --git a/libre/linux-libre/0004-ALSA-pcm-Check-mmap-capability-of-runtime-dma-buffer.patch b/libre/linux-libre/0004-ALSA-pcm-Check-mmap-capability-of-runtime-dma-buffer.patch new file mode 100644 index 0000000..64b8717 --- /dev/null +++ b/libre/linux-libre/0004-ALSA-pcm-Check-mmap-capability-of-runtime-dma-buffer.patch @@ -0,0 +1,64 @@ +From ab60c2d0242fc428a436c25c1144f6acd9d6f419 Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Mon, 9 Aug 2021 09:18:27 +0200 +Subject: [PATCH 4/6] ALSA: pcm: Check mmap capability of runtime dma buffer at + first + +Currently we check only the substream->dma_buffer as the preset of the +buffer configuration for verifying the availability of mmap. But a +few drivers rather set up the buffer in the own way without the +standard buffer preallocation using substream->dma_buffer, and they +miss the proper checks. (Now it's working more or less fine as most +of them are running only on x86). + +Actually, they may set up the runtime dma_buffer (referred via +snd_pcm_get_dma_buf()) at the open callback, though. That is, this +could have been used as the primary source. + +This patch changes the hw_support_mmap() function to check the runtime +dma buffer at first. It's usually NULL with the standard buffer +preallocation, and in that case, we continue checking +substream->dma_buffer as fallback. + +Signed-off-by: Takashi Iwai +Fixes: https://bugs.archlinux.org/task/72059 +--- + sound/core/pcm_native.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c +index 71323d807dbf..dc9fa312fadd 100644 +--- a/sound/core/pcm_native.c ++++ b/sound/core/pcm_native.c +@@ -243,13 +243,18 @@ int snd_pcm_info_user(struct snd_pcm_substream *substream, + + static bool hw_support_mmap(struct snd_pcm_substream *substream) + { ++ struct snd_dma_buffer *dmabuf; ++ + if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP)) + return false; + + if (substream->ops->mmap || substream->ops->page) + return true; + +- switch (substream->dma_buffer.dev.type) { ++ dmabuf = snd_pcm_get_dma_buf(substream); ++ if (!dmabuf) ++ dmabuf = &substream->dma_buffer; ++ switch (dmabuf->dev.type) { + case SNDRV_DMA_TYPE_UNKNOWN: + /* we can't know the device, so just assume that the driver does + * everything right +@@ -259,7 +264,7 @@ static bool hw_support_mmap(struct snd_pcm_substream *substream) + case SNDRV_DMA_TYPE_VMALLOC: + return true; + default: +- return dma_can_mmap(substream->dma_buffer.dev.dev); ++ return dma_can_mmap(dmabuf->dev.dev); + } + } + +-- +2.33.0 + diff --git a/libre/linux-libre/0005-ALSA-pci-rme-Set-up-buffer-type-properly.patch b/libre/linux-libre/0005-ALSA-pci-rme-Set-up-buffer-type-properly.patch new file mode 100644 index 0000000..f1d7db9 --- /dev/null +++ b/libre/linux-libre/0005-ALSA-pci-rme-Set-up-buffer-type-properly.patch @@ -0,0 +1,75 @@ +From 7b0c23ec626e579ffa7ef239cac20dc7fa1797e9 Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Mon, 9 Aug 2021 09:18:28 +0200 +Subject: [PATCH 5/6] ALSA: pci: rme: Set up buffer type properly + +Although the regression of the mmap was fixed in the recent commit +dc0dc8a73e8e ("ALSA: pcm: Fix mmap breakage without explicit buffer +setup"), RME9652 and HDSP drivers have still potential issues with +their mmap handling. Namely, they use the default mmap handler +without the standard buffer preallocation, and PCM core wouldn't use +the coherent DMA mapping. It's practically OK on x86, but on some +exotic architectures, it wouldn't work. + +This patch addresses the potential breakage by replacing the buffer +setup with the proper macro. It also simplifies the source code, +too. + +Signed-off-by: Takashi Iwai +Fixes: https://bugs.archlinux.org/task/72059 +--- + sound/pci/rme9652/hdsp.c | 6 ++---- + sound/pci/rme9652/rme9652.c | 6 ++---- + 2 files changed, 4 insertions(+), 8 deletions(-) + +diff --git a/sound/pci/rme9652/hdsp.c b/sound/pci/rme9652/hdsp.c +index 8457a4bbc3df..22b8b3357918 100644 +--- a/sound/pci/rme9652/hdsp.c ++++ b/sound/pci/rme9652/hdsp.c +@@ -4518,8 +4518,7 @@ static int snd_hdsp_playback_open(struct snd_pcm_substream *substream) + snd_pcm_set_sync(substream); + + runtime->hw = snd_hdsp_playback_subinfo; +- runtime->dma_area = hdsp->playback_buffer; +- runtime->dma_bytes = HDSP_DMA_AREA_BYTES; ++ snd_pcm_set_runtime_buffer(substream, &hdsp->playback_dma_buf); + + hdsp->playback_pid = current->pid; + hdsp->playback_substream = substream; +@@ -4595,8 +4594,7 @@ static int snd_hdsp_capture_open(struct snd_pcm_substream *substream) + snd_pcm_set_sync(substream); + + runtime->hw = snd_hdsp_capture_subinfo; +- runtime->dma_area = hdsp->capture_buffer; +- runtime->dma_bytes = HDSP_DMA_AREA_BYTES; ++ snd_pcm_set_runtime_buffer(substream, &hdsp->capture_dma_buf); + + hdsp->capture_pid = current->pid; + hdsp->capture_substream = substream; +diff --git a/sound/pci/rme9652/rme9652.c b/sound/pci/rme9652/rme9652.c +index f1aad38760d6..9ad2533925c4 100644 +--- a/sound/pci/rme9652/rme9652.c ++++ b/sound/pci/rme9652/rme9652.c +@@ -2279,8 +2279,7 @@ static int snd_rme9652_playback_open(struct snd_pcm_substream *substream) + snd_pcm_set_sync(substream); + + runtime->hw = snd_rme9652_playback_subinfo; +- runtime->dma_area = rme9652->playback_buffer; +- runtime->dma_bytes = RME9652_DMA_AREA_BYTES; ++ snd_pcm_set_runtime_buffer(substream, &rme9652->playback_dma_buf); + + if (rme9652->capture_substream == NULL) { + rme9652_stop(rme9652); +@@ -2339,8 +2338,7 @@ static int snd_rme9652_capture_open(struct snd_pcm_substream *substream) + snd_pcm_set_sync(substream); + + runtime->hw = snd_rme9652_capture_subinfo; +- runtime->dma_area = rme9652->capture_buffer; +- runtime->dma_bytes = RME9652_DMA_AREA_BYTES; ++ snd_pcm_set_runtime_buffer(substream, &rme9652->capture_dma_buf); + + if (rme9652->playback_substream == NULL) { + rme9652_stop(rme9652); +-- +2.33.0 + diff --git a/libre/linux-libre/0006-ALSA-pci-cs46xx-Fix-set-up-buffer-type-properly.patch b/libre/linux-libre/0006-ALSA-pci-cs46xx-Fix-set-up-buffer-type-properly.patch new file mode 100644 index 0000000..0305e70 --- /dev/null +++ b/libre/linux-libre/0006-ALSA-pci-cs46xx-Fix-set-up-buffer-type-properly.patch @@ -0,0 +1,95 @@ +From b5ed7b38f5551c5dfca87ab29d679f3d6d327557 Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Mon, 9 Aug 2021 09:18:29 +0200 +Subject: [PATCH 6/6] ALSA: pci: cs46xx: Fix set up buffer type properly + +CS46xx driver switches the buffer depending on the number of periods, +and in some cases it switches to the own buffer without updating the +buffer type properly. This may cause a problem with the mmap on +exotic architectures that require the own mmap call for the coherent +DMA buffer. + +This patch addresses the potential breakage by replacing the buffer +setup with the proper macro. It also simplifies the source code, +too. + +Signed-off-by: Takashi Iwai +Fixes: https://bugs.archlinux.org/task/72059 +--- + sound/pci/cs46xx/cs46xx_lib.c | 30 ++++++++---------------------- + 1 file changed, 8 insertions(+), 22 deletions(-) + +diff --git a/sound/pci/cs46xx/cs46xx_lib.c b/sound/pci/cs46xx/cs46xx_lib.c +index 1e1eb17f8e07..d43927dcd61e 100644 +--- a/sound/pci/cs46xx/cs46xx_lib.c ++++ b/sound/pci/cs46xx/cs46xx_lib.c +@@ -1121,9 +1121,7 @@ static int snd_cs46xx_playback_hw_params(struct snd_pcm_substream *substream, + if (params_periods(hw_params) == CS46XX_FRAGS) { + if (runtime->dma_area != cpcm->hw_buf.area) + snd_pcm_lib_free_pages(substream); +- runtime->dma_area = cpcm->hw_buf.area; +- runtime->dma_addr = cpcm->hw_buf.addr; +- runtime->dma_bytes = cpcm->hw_buf.bytes; ++ snd_pcm_set_runtime_buffer(substream, &cpcm->hw_buf); + + + #ifdef CONFIG_SND_CS46XX_NEW_DSP +@@ -1143,11 +1141,8 @@ static int snd_cs46xx_playback_hw_params(struct snd_pcm_substream *substream, + #endif + + } else { +- if (runtime->dma_area == cpcm->hw_buf.area) { +- runtime->dma_area = NULL; +- runtime->dma_addr = 0; +- runtime->dma_bytes = 0; +- } ++ if (runtime->dma_area == cpcm->hw_buf.area) ++ snd_pcm_set_runtime_buffer(substream, NULL); + err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params)); + if (err < 0) { + #ifdef CONFIG_SND_CS46XX_NEW_DSP +@@ -1196,9 +1191,7 @@ static int snd_cs46xx_playback_hw_free(struct snd_pcm_substream *substream) + if (runtime->dma_area != cpcm->hw_buf.area) + snd_pcm_lib_free_pages(substream); + +- runtime->dma_area = NULL; +- runtime->dma_addr = 0; +- runtime->dma_bytes = 0; ++ snd_pcm_set_runtime_buffer(substream, NULL); + + return 0; + } +@@ -1287,16 +1280,11 @@ static int snd_cs46xx_capture_hw_params(struct snd_pcm_substream *substream, + if (runtime->periods == CS46XX_FRAGS) { + if (runtime->dma_area != chip->capt.hw_buf.area) + snd_pcm_lib_free_pages(substream); +- runtime->dma_area = chip->capt.hw_buf.area; +- runtime->dma_addr = chip->capt.hw_buf.addr; +- runtime->dma_bytes = chip->capt.hw_buf.bytes; ++ snd_pcm_set_runtime_buffer(substream, &chip->capt.hw_buf); + substream->ops = &snd_cs46xx_capture_ops; + } else { +- if (runtime->dma_area == chip->capt.hw_buf.area) { +- runtime->dma_area = NULL; +- runtime->dma_addr = 0; +- runtime->dma_bytes = 0; +- } ++ if (runtime->dma_area == chip->capt.hw_buf.area) ++ snd_pcm_set_runtime_buffer(substream, NULL); + err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params)); + if (err < 0) + return err; +@@ -1313,9 +1301,7 @@ static int snd_cs46xx_capture_hw_free(struct snd_pcm_substream *substream) + + if (runtime->dma_area != chip->capt.hw_buf.area) + snd_pcm_lib_free_pages(substream); +- runtime->dma_area = NULL; +- runtime->dma_addr = 0; +- runtime->dma_bytes = 0; ++ snd_pcm_set_runtime_buffer(substream, NULL); + + return 0; + } +-- +2.33.0 + diff --git a/libre/linux-libre/PKGBUILD b/libre/linux-libre/PKGBUILD index a1fbb70..fabfb34 100644 --- a/libre/linux-libre/PKGBUILD +++ b/libre/linux-libre/PKGBUILD @@ -14,7 +14,7 @@ _replacesoldkernels=() # '%' gets replaced with kernel suffix _replacesoldmodules=() # '%' gets replaced with kernel suffix pkgbase=linux-libre -pkgver=5.13.8 +pkgver=5.14.11 pkgrel=1 pkgdesc='Linux-libre' rcnver=5.11.11 @@ -28,7 +28,7 @@ makedepends=( ) makedepends_armv7h=(uboot-tools vboot-utils dtc) # required by linux-libre-chromebook options=('!strip') -_srcname=linux-5.13 +_srcname=linux-5.14 source=( "https://linux-libre.fsfla.org/pub/linux-libre/releases/${_srcname##*-}-gnu/linux-libre-${_srcname##*-}-gnu.tar.xz"{,.sign} "https://linux-libre.fsfla.org/pub/linux-libre/releases/$pkgver-gnu/patch-${_srcname##*-}-gnu-$pkgver-gnu.xz"{,.sign} @@ -46,7 +46,11 @@ source=( 0002-fix-Atmel-maXTouch-touchscreen-support.patch # Arch Linux patches 0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch - 0002-Bluetooth-btusb-check-conditions-before-enabling-USB.patch + 0002-Bluetooth-btusb-Add-support-for-IMC-Networks-Mediate.patch + 0003-Bluetooth-btusb-Add-support-for-Foxconn-Mediatek-Chi.patch + 0004-ALSA-pcm-Check-mmap-capability-of-runtime-dma-buffer.patch + 0005-ALSA-pci-rme-Set-up-buffer-type-properly.patch + 0006-ALSA-pci-cs46xx-Fix-set-up-buffer-type-properly.patch ) source_i686=( # avoid using zstd compression in ultra mode (exhausts virtual memory) @@ -72,9 +76,9 @@ validpgpkeys=( '474402C8C582DAFBE389C427BCB7CF877E7D47A7' # Alexandre Oliva '6DB9C4B4F0D8C0DC432CF6E4227CA7C556B2BA78' # David P. ) -sha512sums=('a24f2db9316297127447b3d7fd7a1e9e7b9a8bdb5e59e6e341568cbf877c4b65d2ccdb27ec1c23b07af6c365b2930b040bcef0d989202b503bc55b107c04d121' +sha512sums=('18798d032184ce141216ad72fcbb5ddb340809fe8d953acb50700aa0b47d36fca104dcedc7521fb3aea913d8fbeb4bd3eab1cf2c955388e6996c4154eac67d0c' 'SKIP' - '53a9a1abfb8ae6e73337986ed780034d5ecf4d89bf1bbf7d4c2b5b04b527b00296c7c427045c8ab454a175db1ab272c76ef115edd4b88f4f530cbd884e604bb5' + '951cdb68af3bbf3b841376f82fd9c82dfd7a159cae8564e5d772f99f3170deafcabc00cb0ecfa6e7669c22087577f2eafa47d3b50bc8ea6ee5edbc65821986e1' 'SKIP' '13cb5bc42542e7b8bb104d5f68253f6609e463b6799800418af33eb0272cc269aaa36163c3e6f0aacbdaaa1d05e2827a4a7c4a08a029238439ed08b89c564bb3' 'SKIP' @@ -82,8 +86,8 @@ sha512sums=('a24f2db9316297127447b3d7fd7a1e9e7b9a8bdb5e59e6e341568cbf877c4b65d2c 'SKIP' '267295aa0cea65684968420c68b32f1a66a22d018b9d2b2c1ef14267bcf4cb68aaf7099d073cbfefe6c25c8608bdcbbd45f7ac8893fdcecbf1e621abdfe9ecc1' 'SKIP' - '929fd5c34b07a63b5e50296523a6b3686ac9014a74ed5e41b0b1f0b169306ee2dace9e9259b4222c84fb1edb9a96e09bcd3d7f0e5611bef93f5c8754a67a3367' - 'e78d10fe5d709e714dfc2e56a487de7d03e0fcaca17d48cd279659ab930f44ef903683d3f6f10b1330f59f15e80c7571f6bd3d47d75fdaed7d93999346b8af57' + '4e9ac0b6d4dd3a8074259e71dab9db90b44bc0231d134c4dce798fee13b15bfdda2bf0926d3a1f98e596ab633f2ba3640d92ccab5ae6defffad9dd352fd35112' + '6032a527651f9e8053728cec73afa50aa056264b402372899927848a287ad27291335afe00848f0d41a7adb7d662c3a26def7c5c91777bed3ed325c4ec41a035' '51e8b4da770067e8257d292622d865cb16ac57fdfd8967bdfb74efec197dae9eab958e5637a728640ae60885bdde41c06c8076227a4f83db0b752215f91f3a87' '53103bf55b957b657039510527df0df01279dec59cda115a4d6454e4135025d4546167fa30bdc99107f232561c1e096d8328609ab5a876cf7017176f92ad3e0b' '167bc73c6c1c63931806238905dc44c7d87c5a5c0f6293159f2133dfe717fb44081018d810675716d1605ec7dff5e8333b87b19e09e2de21d0448e447437873b' @@ -91,8 +95,12 @@ sha512sums=('a24f2db9316297127447b3d7fd7a1e9e7b9a8bdb5e59e6e341568cbf877c4b65d2c '143dea30c6da00e504c99984a98a0eb2411f558fcdd9dfa7f607d6c14e9e7dffff9cb00121d9317044b07e3e210808286598c785ee854084b993ec9cb14d8232' '02af4dd2a007e41db0c63822c8ab3b80b5d25646af1906dc85d0ad9bb8bbf5236f8e381d7f91cf99ed4b0978c50aee37cb9567cdeef65b7ec3d91b882852b1af' 'b8fe56e14006ab866970ddbd501c054ae37186ddc065bb869cf7d18db8c0d455118d5bda3255fb66a0dde38b544655cfe9040ffe46e41d19830b47959b2fb168' - 'fac53c8ce68e9f56c8930a9392c89377c909f6a43a318010194949def91a104f34f46c2b32457e571435a8b326c47a48737ceb6255644bb6d42c59b27b07449a' - '722d92b750f0a5af39b850c18ff0c57dac0165e3c0219415843ec5207945971448790fec3fca570b62c8726c89b0ca6b7a5b16fd503e4581b3a63b3adfcf2c50') + 'dba36283b9ea3db5fcc9a72051a8e9cf4d409ec59769e6da9db4d321b72972242670210ad961a37f62aba68f7262e9f2f6308cfe62cda9fa050c72363a0c404a' + '693ac0e0e32cd0ab6c485deb43d6408dc9fc31234e4113206cf901a302eddf1a965f97f82ed7186f6426c085176ce95c48e116e9824d92bfd1f6656447da18dc' + 'c4a19ccec8b7636f1b5b1cf8e135e46d3aa4d233af4a1e72c2aaa83536505013f0c83602fe05ce08212b4327bebfb4f8a84b57c0d81509f0b48df5dfcc334254' + '4d81c2995e7cc5fc36929eb5bf9cc68ec02cb24147f18a88da79facd3e25182b156ca4430bf2765ff1e4c6be237d3a3e527498cd49d75217a5e16b62a478be6d' + '12c0da7fbd4e4e6ffc473ecd6dffee1dd61c201dad854347400c8f551adc35c033d6fa623cc5c1b2fe7930cdab868a8c99c6874ee171c9143e0f370398759c96' + '7f6fd402d8c29ee4f6c98ed2236318ab3f57f3dd47a92911e1b556df251b67fc83f7256223f06d1fefa849a3ceb5e40d247d2d5664ddd7cd9749bab4bc1ecb36') sha512sums_i686=('3a346ff5e0fdefafd28bc3dd0e4b6cd68e3f0014e59d1611d99f2edb8d074fd32649eeb0894a7e340e4f907b5cfc0e08e0753e0427a68dc113bb22835a892968') sha512sums_armv7h=('a4aa00ca3f03d524d3fb6379116c4e4e7908e7c30f6347f55be256c44d806d8db5f04c96369d5a725e45b7390e9fde842f388cdc5d5699d80ec5d1519f7367f4' 'SKIP' @@ -171,6 +179,7 @@ prepare() { echo "Setting config..." cp ../config.$CARCH .config make olddefconfig + diff -u ../config .config || : make -s kernelrelease > version echo "Prepared $pkgbase version $( Date: Oct 12 2021 00:44:56 +0000 Subject: [PATCH 5/23] updpkg: libre/linux-libre-lts 5.10.72-1 Signed-off-by: David P --- diff --git a/libre/linux-libre-lts/0002-gcc-plugins-modern-gcc-plugin-infrastructure-requres.patch b/libre/linux-libre-lts/0002-gcc-plugins-modern-gcc-plugin-infrastructure-requres.patch new file mode 100644 index 0000000..8e6cee0 --- /dev/null +++ b/libre/linux-libre-lts/0002-gcc-plugins-modern-gcc-plugin-infrastructure-requres.patch @@ -0,0 +1,76 @@ +From 50b29ce228d0622eae2b9854c5e4b9334c540a7a Mon Sep 17 00:00:00 2001 +From: Levente Polyak +Date: Thu, 1 Sep 2021 22:19:19 +0200 +Subject: [PATCH] gcc-plugins: modern gcc plugin infrastructure requres c++11 + std + +Bump the used std to c++11 to avoid detection failure. This fixes the +support check on modern gcc plugin infrastructure that requires a +minimum standard of c++11 to compile. + +This effectively requires GCC 4.8.1. + +Signed-off-by: Levente Polyak +--- + scripts/gcc-plugin.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/scripts/gcc-plugin.sh b/scripts/gcc-plugin.sh +index b79fd0bea838..7abc00f60a8b 100755 +--- a/scripts/gcc-plugin.sh ++++ b/scripts/gcc-plugin.sh +@@ -8,7 +8,7 @@ srctree=$(dirname "$0") + gccplugins_dir=$($* -print-file-name=plugin) + + # we need a c++ compiler that supports the designated initializer GNU extension +-$HOSTCC -c -x c++ -std=gnu++98 - -fsyntax-only -I $srctree/gcc-plugins -I $gccplugins_dir/include 2>/dev/null </dev/null < +Date: Sat Dec 26 13:21:58 2020 -0500 + + gcc-plugins: fix gcc 11 indigestion with plugins... + + Fedora Rawhide has started including gcc 11,and the g++ compiler + throws a wobbly when it hits scripts/gcc-plugins: + + HOSTCXX scripts/gcc-plugins/latent_entropy_plugin.so + In file included from /usr/include/c++/11/type_traits:35, + from /usr/lib/gcc/x86_64-redhat-linux/11/plugin/include/system.h:244, + from /usr/lib/gcc/x86_64-redhat-linux/11/plugin/include/gcc-plugin.h:28, + from scripts/gcc-plugins/gcc-common.h:7, + from scripts/gcc-plugins/latent_entropy_plugin.c:78: + /usr/include/c++/11/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO + C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options. + 32 | #error This file requires compiler and library support \ + + In fact, it works just fine with c++11, which has been in gcc since 4.8, + and we now require 4.9 as a minimum. + + Signed-off-by: Valdis Kletnieks + Acked-by: Josh Poimboeuf + Signed-off-by: Kees Cook + Link: https://lore.kernel.org/r/82487.1609006918@turing-police + +diff --git a/scripts/gcc-plugins/Makefile b/scripts/gcc-plugins/Makefile +index d66949bfeba4..b5487cce69e8 100644 +--- a/scripts/gcc-plugins/Makefile ++++ b/scripts/gcc-plugins/Makefile +@@ -22,9 +22,9 @@ always-y += $(GCC_PLUGIN) + GCC_PLUGINS_DIR = $(shell $(CC) -print-file-name=plugin) + + plugin_cxxflags = -Wp,-MMD,$(depfile) $(KBUILD_HOSTCXXFLAGS) -fPIC \ +- -I $(GCC_PLUGINS_DIR)/include -I $(obj) -std=gnu++98 \ ++ -I $(GCC_PLUGINS_DIR)/include -I $(obj) -std=gnu++11 \ + -fno-rtti -fno-exceptions -fasynchronous-unwind-tables \ +- -ggdb -Wno-narrowing -Wno-unused-variable -Wno-c++11-compat \ ++ -ggdb -Wno-narrowing -Wno-unused-variable \ + -Wno-format-diag + + plugin_ldflags = -shared diff --git a/libre/linux-libre-lts/PKGBUILD b/libre/linux-libre-lts/PKGBUILD index 31f8eed..55a4c7d 100644 --- a/libre/linux-libre-lts/PKGBUILD +++ b/libre/linux-libre-lts/PKGBUILD @@ -9,18 +9,16 @@ # Based on linux-lts package -# NOTE: Don't build htmldocs due to an error in sphinx (armv7h only) - _replacesarchkernel=('linux%') # '%' gets replaced with kernel suffix _replacesoldkernels=() # '%' gets replaced with kernel suffix _replacesoldmodules=() # '%' gets replaced with kernel suffix pkgbase=linux-libre-lts -pkgver=5.10.56 +pkgver=5.10.72 pkgrel=1 pkgdesc='LTS Linux-libre' -rcnver=5.10.56 -rcnrel=armv7-x45 +rcnver=5.10.72 +rcnrel=armv7-x53 url='https://linux-libre.fsfla.org/' arch=(i686 x86_64 armv7h) license=(GPL2) @@ -31,8 +29,8 @@ makedepends=( options=('!strip') _srcname=linux-5.10 source=( - "https://linux-libre.fsfla.org/pub/linux-libre/releases/${_srcname##*-}-gnu/linux-libre-${_srcname##*-}-gnu.tar.xz"{,.sign} - "https://linux-libre.fsfla.org/pub/linux-libre/releases/$pkgver-gnu/patch-${_srcname##*-}-gnu-$pkgver-gnu.xz"{,.sign} + "https://linux-libre.fsfla.org/pub/linux-libre/releases/${_srcname##*-}-gnu1/linux-libre-${_srcname##*-}-gnu1.tar.xz"{,.sign} + "https://linux-libre.fsfla.org/pub/linux-libre/releases/$pkgver-gnu1/patch-${_srcname##*-}-gnu1-$pkgver-gnu1.xz"{,.sign} "https://repo.parabola.nu/other/linux-libre/logos/logo_linux_"{clut224.ppm,vga16.ppm,mono.pbm}{,.sig} config.i686 config.x86_64 config.armv7h # the main kernel config files linux-armv7h.preset # armv7h preset file for mkinitcpio ramdisk @@ -46,6 +44,7 @@ source=( 0002-fix-Atmel-maXTouch-touchscreen-support.patch # Arch Linux patches 0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch + 0002-gcc-plugins-modern-gcc-plugin-infrastructure-requres.patch ) source_i686=( # avoid using zstd compression in ultra mode (exhausts virtual memory) @@ -59,9 +58,9 @@ validpgpkeys=( '474402C8C582DAFBE389C427BCB7CF877E7D47A7' # Alexandre Oliva '6DB9C4B4F0D8C0DC432CF6E4227CA7C556B2BA78' # David P. ) -sha512sums=('ccc52db049a66ff146d9fc84fb00e783f2d04211156233a382f87589fec7631b8fbb3e76bfd94279607b883d25f9745e6c7d2bd62b13311dc6b425002bd42ec0' +sha512sums=('4bf48611e8a217931c2347f1aa3257da5ba210f263fb35edef43e935fd3fcab5333fc884198fe6ab180cc11ed11dd48b71dff4071b85f18830a6bf9e1c2cf97f' 'SKIP' - '44f57270e8c973d03515ff8526865e5cecd7e7ae29c4c10468a2ee33b98baa20cdca07fe64910740a3b38c4a08eeb5727fb26d415cfd719403b976685d0e2b86' + 'a25bf1a32e8dba38a910eae4d6436f2a6716807e810655f0170f8ea90d136aa353057fd8cc5d05281ca8a684efef7ef4036ac96039f8d122f62d5b1f362229c3' 'SKIP' '13cb5bc42542e7b8bb104d5f68253f6609e463b6799800418af33eb0272cc269aaa36163c3e6f0aacbdaaa1d05e2827a4a7c4a08a029238439ed08b89c564bb3' 'SKIP' @@ -70,14 +69,15 @@ sha512sums=('ccc52db049a66ff146d9fc84fb00e783f2d04211156233a382f87589fec7631b8fb '267295aa0cea65684968420c68b32f1a66a22d018b9d2b2c1ef14267bcf4cb68aaf7099d073cbfefe6c25c8608bdcbbd45f7ac8893fdcecbf1e621abdfe9ecc1' 'SKIP' '42e5e4913993650bb9bb22accbc1c272e8e0be4891e5bb82fb7c0f140d56bdc6f5282f353d53d49e4aa3a010d464c64001fb6d14d615c6778c10bec204435ea3' - 'f7397cfec791ba8df9e342a850f4794acc5e69707a5c4e5f9c03b14c75f975317055a2be59ee51c3fd22bb8c534639454931bac79d9f3761453a62fc085d8801' + 'd6e61670635d717e84c2c3caca17fcc284d23cab85768246fece85b274e8668933392fe66c2d2f0d742fe5b4fab2e799a18389b32c21c075f8c54c68ea224950' '6012fa7b97c15ada82f0c205ea983bebac8b672ca498e22f524d219bdd8715784b24ce7d457803e8221a945c3daff95c4e467f70a420b9c2aa95d627f2d160a9' '53103bf55b957b657039510527df0df01279dec59cda115a4d6454e4135025d4546167fa30bdc99107f232561c1e096d8328609ab5a876cf7017176f92ad3e0b' '02af4dd2a007e41db0c63822c8ab3b80b5d25646af1906dc85d0ad9bb8bbf5236f8e381d7f91cf99ed4b0978c50aee37cb9567cdeef65b7ec3d91b882852b1af' 'b8fe56e14006ab866970ddbd501c054ae37186ddc065bb869cf7d18db8c0d455118d5bda3255fb66a0dde38b544655cfe9040ffe46e41d19830b47959b2fb168' - 'aed7844c51ec705ef1ef5d9f1adf27939073c99d4fcc97051bed2fba1ec161fdde4c57cbe039209fb86c72918493bea55ed26189c1dda3dbea3a3a7019363818') + 'aed7844c51ec705ef1ef5d9f1adf27939073c99d4fcc97051bed2fba1ec161fdde4c57cbe039209fb86c72918493bea55ed26189c1dda3dbea3a3a7019363818' + 'd1db702f9e3a09288ad591361b89ec35b991e421494553e61cc3998037cb6c60627d77d7b7e41f7e7fdab90245a4ee2e4844d68ce96eeaa021dde8548f2673f7') sha512sums_i686=('3a346ff5e0fdefafd28bc3dd0e4b6cd68e3f0014e59d1611d99f2edb8d074fd32649eeb0894a7e340e4f907b5cfc0e08e0753e0427a68dc113bb22835a892968') -sha512sums_armv7h=('8105ecb83dd3afa8b20f1a0846ff63ae5e6368a46e3e2f5a270d94e1ef5886b2b48eb9a8ff6ce9be2d0474abcc793c760984cd9df37b53914d0a8f68e010f20e' +sha512sums_armv7h=('cf29c386ccfaa33a14bb9028bbc8d783b2e872b420e96174e6040faf93d0a1d73d4df75a7d4fb0b8a0dbaae32593b698d16da47436aa29b8b483bdf4c91bb515' 'SKIP') _replacesarchkernel=("${_replacesarchkernel[@]/\%/${pkgbase#linux-libre}}") @@ -98,7 +98,7 @@ prepare() { if [ "${_srcname##*-}" != "$pkgver" ]; then echo "Applying upstream patch..." - patch -Np1 < "../patch-${_srcname##*-}-gnu-$pkgver-gnu" + patch -Np1 < "../patch-${_srcname##*-}-gnu1-$pkgver-gnu1" fi echo "Adding freedo as boot logo..." @@ -144,7 +144,7 @@ prepare() { echo "Setting config..." cp ../config.$CARCH .config make olddefconfig - +#return 1 make -s kernelrelease > version echo "Prepared $pkgbase version $( Date: Oct 13 2021 01:30:48 +0000 Subject: [PATCH 6/23] updpkg: libre/linux-libre-hardened 5.14.11.hardened1-1 Signed-off-by: David P --- diff --git a/libre/linux-libre-hardened/PKGBUILD b/libre/linux-libre-hardened/PKGBUILD index 84ce20d..ed3fc5c 100644 --- a/libre/linux-libre-hardened/PKGBUILD +++ b/libre/linux-libre-hardened/PKGBUILD @@ -9,7 +9,7 @@ _replacesoldkernels=() # '%' gets replaced with kernel suffix _replacesoldmodules=() # '%' gets replaced with kernel suffix pkgbase=linux-libre-hardened -pkgver=5.12.19.hardened1 +pkgver=5.14.11.hardened1 pkgrel=1 pkgdesc='Security-Hardened Linux-libre' url='https://linux-libre.fsfla.org/' @@ -20,7 +20,7 @@ makedepends=( xmlto python-sphinx python-sphinx_rtd_theme graphviz imagemagick ) options=('!strip') -_srcname=linux-5.12 +_srcname=linux-5.14 _srctag=${pkgver%.*}-${pkgver##*.} source=( "https://linux-libre.fsfla.org/pub/linux-libre/releases/${_srcname##*-}-gnu/linux-libre-${_srcname##*-}-gnu.tar.xz"{,.sign} @@ -36,7 +36,6 @@ source=( # https://labs.parabola.nu/issues/877 # http://www.fsfla.org/pipermail/linux-libre/2015-November/003202.html 0002-fix-Atmel-maXTouch-touchscreen-support.patch - # Arch Linux patches ) validpgpkeys=( '474402C8C582DAFBE389C427BCB7CF877E7D47A7' # Alexandre Oliva @@ -44,11 +43,11 @@ validpgpkeys=( '6DB9C4B4F0D8C0DC432CF6E4227CA7C556B2BA78' # David P. 'E240B57E2C4630BA768E2F26FC1B547C8D8172C8' # Levente Polyak ) -sha512sums=('07730c51e4030dc9c1d01367098eabafd5665c40a69f8b102b2fa0aaae4f2124c32f60560b30a55fab18a76eb782650fac04a4aa2aaa558e96bfd13faaea328c' +sha512sums=('18798d032184ce141216ad72fcbb5ddb340809fe8d953acb50700aa0b47d36fca104dcedc7521fb3aea913d8fbeb4bd3eab1cf2c955388e6996c4154eac67d0c' 'SKIP' - '9857f7c8e88f9a59faaea695245d668d7c73347bcf43feb60d61fa94dfc9c7bfdfcbca6a6afa32839991924644bd990a7fff2b60b68d4f14da74b343ede5ff15' + '951cdb68af3bbf3b841376f82fd9c82dfd7a159cae8564e5d772f99f3170deafcabc00cb0ecfa6e7669c22087577f2eafa47d3b50bc8ea6ee5edbc65821986e1' 'SKIP' - 'e5e427702841d941c605a9fe27ba051c7e947dc7c2ab5906cd19a40b9fe99863e41b9e860e8f00fad2f11922403d9ee042a94b9e7fefc85e89f333192b2bda85' + 'ae0fb696bcea16040ffae245e874957aa797d977b73c8c84cb2c130ad858b03f7bf0848c374e33e521b5db30c77ade08230b9446f1700b1e32ac65d9463f7b90' 'SKIP' '13cb5bc42542e7b8bb104d5f68253f6609e463b6799800418af33eb0272cc269aaa36163c3e6f0aacbdaaa1d05e2827a4a7c4a08a029238439ed08b89c564bb3' 'SKIP' @@ -56,7 +55,7 @@ sha512sums=('07730c51e4030dc9c1d01367098eabafd5665c40a69f8b102b2fa0aaae4f2124c32 'SKIP' '267295aa0cea65684968420c68b32f1a66a22d018b9d2b2c1ef14267bcf4cb68aaf7099d073cbfefe6c25c8608bdcbbd45f7ac8893fdcecbf1e621abdfe9ecc1' 'SKIP' - '17e5fead55a8bbffaaa4a37ed09bd38309b2dbcbebbd44fdd2f382732da8a0e41dded9ab78fbcb154788e8e0f7ddd5bf02a5f3dede630731bdd6e72773effcc7' + '71c0705f03b2c3937fb30ef07f81d6bc48f43e7433eec2dd52b94bb55d91123d200e9fa74f522fb6b66495e0ec8b56b2949dd2974d777e265471186ea6a0a033' '02af4dd2a007e41db0c63822c8ab3b80b5d25646af1906dc85d0ad9bb8bbf5236f8e381d7f91cf99ed4b0978c50aee37cb9567cdeef65b7ec3d91b882852b1af' 'b8fe56e14006ab866970ddbd501c054ae37186ddc065bb869cf7d18db8c0d455118d5bda3255fb66a0dde38b544655cfe9040ffe46e41d19830b47959b2fb168') diff --git a/libre/linux-libre-hardened/config b/libre/linux-libre-hardened/config index e836681..389c065 100644 --- a/libre/linux-libre-hardened/config +++ b/libre/linux-libre-hardened/config @@ -1,11 +1,13 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 5.12.19-gnu-hardened1 Kernel Configuration +# Linux/x86 5.14.11-gnu-hardened1 Kernel Configuration # CONFIG_CC_VERSION_TEXT="gcc (GCC) 11.1.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=110100 CONFIG_CLANG_VERSION=0 +CONFIG_AS_IS_GNU=y +CONFIG_AS_VERSION=23601 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=23601 CONFIG_LLD_VERSION=0 @@ -14,6 +16,7 @@ CONFIG_CC_CAN_LINK_STATIC=y CONFIG_CC_HAS_ASM_GOTO=y CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y CONFIG_CC_HAS_ASM_INLINE=y +CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y @@ -100,12 +103,29 @@ CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y # end of Timers subsystem +CONFIG_BPF=y +CONFIG_HAVE_EBPF_JIT=y +CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y + +# +# BPF subsystem +# +CONFIG_BPF_SYSCALL=y +CONFIG_BPF_JIT=y +CONFIG_BPF_JIT_ALWAYS_ON=y +CONFIG_BPF_JIT_DEFAULT_ON=y +CONFIG_BPF_UNPRIV_DEFAULT_OFF=y +# CONFIG_BPF_PRELOAD is not set +CONFIG_BPF_LSM=y +# end of BPF subsystem + # CONFIG_PREEMPT_NONE is not set # CONFIG_PREEMPT_VOLUNTARY is not set CONFIG_PREEMPT=y CONFIG_PREEMPT_COUNT=y CONFIG_PREEMPTION=y CONFIG_PREEMPT_DYNAMIC=y +CONFIG_SCHED_CORE=y # # CPU/Task time and stats accounting @@ -193,6 +213,7 @@ CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_PERF=y CONFIG_CGROUP_BPF=y +CONFIG_CGROUP_MISC=y # CONFIG_CGROUP_DEBUG is not set CONFIG_SOCK_CGROUP_DATA=y CONFIG_NAMESPACES=y @@ -224,7 +245,6 @@ CONFIG_SYSCTL=y CONFIG_HAVE_UID16=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_HAVE_PCSPKR_PLATFORM=y -CONFIG_BPF=y # CONFIG_EXPERT is not set # CONFIG_UID16 is not set CONFIG_MULTIUSER=y @@ -253,12 +273,6 @@ CONFIG_KALLSYMS=y CONFIG_KALLSYMS_ALL=y CONFIG_KALLSYMS_ABSOLUTE_PERCPU=y CONFIG_KALLSYMS_BASE_RELATIVE=y -CONFIG_BPF_LSM=y -CONFIG_BPF_SYSCALL=y -CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y -CONFIG_BPF_JIT_ALWAYS_ON=y -CONFIG_BPF_JIT_DEFAULT_ON=y -# CONFIG_BPF_PRELOAD is not set # CONFIG_USERFAULTFD is not set CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y CONFIG_KCMP=y @@ -307,7 +321,6 @@ CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_ARCH_MAY_HAVE_PC_FDC=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_HAS_CPU_RELAX=y -CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y CONFIG_ARCH_HAS_FILTER_PGPROT=y CONFIG_HAVE_SETUP_PER_CPU_AREA=y CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y @@ -315,7 +328,6 @@ CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y CONFIG_ARCH_SUSPEND_POSSIBLE=y CONFIG_ARCH_WANT_GENERAL_HUGETLB=y -CONFIG_ZONE_DMA32=y CONFIG_AUDIT_ARCH=y CONFIG_HAVE_INTEL_TXT=y CONFIG_X86_64_SMP=y @@ -328,7 +340,6 @@ CONFIG_CC_HAS_SANE_STACKPROTECTOR=y # # Processor type and features # -CONFIG_ZONE_DMA=y CONFIG_SMP=y CONFIG_X86_FEATURE_NAMES=y CONFIG_X86_X2APIC=y @@ -445,7 +456,6 @@ CONFIG_X86_PMEM_LEGACY_DEVICE=y CONFIG_X86_PMEM_LEGACY=m CONFIG_X86_CHECK_BIOS_CORRUPTION=y CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK=y -CONFIG_X86_RESERVE_LOW=64 CONFIG_MTRR=y CONFIG_MTRR_SANITIZER=y CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=1 @@ -496,12 +506,8 @@ CONFIG_HAVE_LIVEPATCH=y # end of Processor type and features CONFIG_ARCH_HAS_ADD_PAGES=y -CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y -CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y +CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y CONFIG_USE_PERCPU_NUMA_NODE_ID=y -CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y -CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION=y -CONFIG_ARCH_ENABLE_THP_MIGRATION=y # # Power management and ACPI options @@ -593,7 +599,9 @@ CONFIG_BXT_WC_PMIC_OPREGION=y CONFIG_CHT_WC_PMIC_OPREGION=y CONFIG_CHT_DC_TI_PMIC_OPREGION=y CONFIG_TPS68470_PMIC_OPREGION=y +CONFIG_ACPI_VIOT=y CONFIG_X86_PM_TIMER=y +CONFIG_ACPI_PRMT=y # # CPU Frequency scaling @@ -738,9 +746,11 @@ CONFIG_KVM_COMPAT=y CONFIG_HAVE_KVM_IRQ_BYPASS=y CONFIG_HAVE_KVM_NO_POLL=y CONFIG_KVM_XFER_TO_GUEST_WORK=y +CONFIG_HAVE_KVM_PM_NOTIFIER=y CONFIG_VIRTUALIZATION=y CONFIG_KVM=m CONFIG_KVM_INTEL=m +CONFIG_X86_SGX_KVM=y CONFIG_KVM_AMD=m CONFIG_KVM_AMD_SEV=y CONFIG_KVM_XEN=y @@ -781,6 +791,7 @@ CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_ARCH_HAS_SET_DIRECT_MAP=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y +CONFIG_ARCH_WANTS_NO_INSTR=y CONFIG_HAVE_ASM_MODVERSIONS=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y @@ -845,6 +856,8 @@ CONFIG_COMPAT_OLD_SIGACTION=y CONFIG_COMPAT_32BIT_TIME=y CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y +CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y +CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT=y CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y @@ -891,10 +904,12 @@ CONFIG_MODULE_SIG_ALL=y # CONFIG_MODULE_SIG_SHA384 is not set CONFIG_MODULE_SIG_SHA512=y CONFIG_MODULE_SIG_HASH="sha512" -CONFIG_MODULE_COMPRESS=y +# CONFIG_MODULE_COMPRESS_NONE is not set # CONFIG_MODULE_COMPRESS_GZIP is not set -CONFIG_MODULE_COMPRESS_XZ=y +# CONFIG_MODULE_COMPRESS_XZ is not set +CONFIG_MODULE_COMPRESS_ZSTD=y # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set +CONFIG_MODPROBE_PATH="/sbin/modprobe" CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y CONFIG_BLK_RQ_ALLOC_TIME=y @@ -909,9 +924,11 @@ CONFIG_BLK_DEV_THROTTLING=y CONFIG_BLK_DEV_THROTTLING_LOW=y # CONFIG_BLK_CMDLINE_PARSER is not set CONFIG_BLK_WBT=y +CONFIG_BLK_WBT_MQ=y CONFIG_BLK_CGROUP_IOLATENCY=y +CONFIG_BLK_CGROUP_FC_APPID=y CONFIG_BLK_CGROUP_IOCOST=y -CONFIG_BLK_WBT_MQ=y +CONFIG_BLK_CGROUP_IOPRIO=y CONFIG_BLK_DEBUG_FS=y CONFIG_BLK_DEBUG_FS_ZONED=y CONFIG_BLK_SED_OPAL=y @@ -995,7 +1012,6 @@ CONFIG_COREDUMP=y CONFIG_SELECT_MEMORY_MODEL=y CONFIG_SPARSEMEM_MANUAL=y CONFIG_SPARSEMEM=y -CONFIG_NEED_MULTIPLE_NODES=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y @@ -1003,19 +1019,24 @@ CONFIG_HAVE_FAST_GUP=y CONFIG_NUMA_KEEP_MEMINFO=y CONFIG_MEMORY_ISOLATION=y CONFIG_HAVE_BOOTMEM_INFO_NODE=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y CONFIG_MEMORY_HOTPLUG=y CONFIG_MEMORY_HOTPLUG_SPARSE=y CONFIG_MEMORY_HOTPLUG_DEFAULT_ONLINE=y +CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y CONFIG_MEMORY_HOTREMOVE=y +CONFIG_MHP_MEMMAP_ON_MEMORY=y CONFIG_SPLIT_PTLOCK_CPUS=4 +CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y CONFIG_MEMORY_BALLOON=y CONFIG_BALLOON_COMPACTION=y CONFIG_COMPACTION=y CONFIG_PAGE_REPORTING=y CONFIG_MIGRATION=y +CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION=y +CONFIG_ARCH_ENABLE_THP_MIGRATION=y CONFIG_CONTIG_ALLOC=y CONFIG_PHYS_ADDR_T_64BIT=y -CONFIG_BOUNCE=y CONFIG_VIRT_TO_BUS=y CONFIG_MMU_NOTIFIER=y CONFIG_KSM=y @@ -1033,6 +1054,7 @@ CONFIG_FRONTSWAP=y CONFIG_CMA=y # CONFIG_CMA_DEBUG is not set # CONFIG_CMA_DEBUGFS is not set +CONFIG_CMA_SYSFS=y CONFIG_CMA_AREAS=7 CONFIG_ZSWAP=y # CONFIG_ZSWAP_COMPRESSOR_DEFAULT_DEFLATE is not set @@ -1055,7 +1077,10 @@ CONFIG_ZSMALLOC=y CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set CONFIG_IDLE_PAGE_TRACKING=y +CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y CONFIG_ARCH_HAS_PTE_DEVMAP=y +CONFIG_ZONE_DMA=y +CONFIG_ZONE_DMA32=y CONFIG_ZONE_DEVICE=y CONFIG_DEV_PAGEMAP_OPS=y CONFIG_HMM_MIRROR=y @@ -1068,6 +1093,7 @@ CONFIG_ARCH_HAS_PKEYS=y CONFIG_READ_ONLY_THP_FOR_FS=y CONFIG_ARCH_HAS_PTE_SPECIAL=y CONFIG_MAPPING_DIRTY_HELPERS=y +CONFIG_SECRETMEM=y # end of Memory Management options CONFIG_NET=y @@ -1213,13 +1239,13 @@ CONFIG_NETFILTER_INGRESS=y CONFIG_NETFILTER_NETLINK=m CONFIG_NETFILTER_FAMILY_BRIDGE=y CONFIG_NETFILTER_FAMILY_ARP=y +CONFIG_NETFILTER_NETLINK_HOOK=m CONFIG_NETFILTER_NETLINK_ACCT=m CONFIG_NETFILTER_NETLINK_QUEUE=m CONFIG_NETFILTER_NETLINK_LOG=m CONFIG_NETFILTER_NETLINK_OSF=m CONFIG_NF_CONNTRACK=m -CONFIG_NF_LOG_COMMON=m -CONFIG_NF_LOG_NETDEV=m +CONFIG_NF_LOG_SYSLOG=m CONFIG_NETFILTER_CONNCOUNT=m CONFIG_NF_CONNTRACK_MARK=y CONFIG_NF_CONNTRACK_SECMARK=y @@ -1293,6 +1319,7 @@ CONFIG_NFT_REJECT_NETDEV=m CONFIG_NF_FLOW_TABLE_INET=m CONFIG_NF_FLOW_TABLE=m CONFIG_NETFILTER_XTABLES=m +CONFIG_NETFILTER_XTABLES_COMPAT=y # # Xtables combined modules @@ -1533,7 +1560,6 @@ CONFIG_NF_DEFRAG_IPV6=m CONFIG_NF_TABLES_BRIDGE=m CONFIG_NFT_BRIDGE_META=m CONFIG_NFT_BRIDGE_REJECT=m -CONFIG_NF_LOG_BRIDGE=m CONFIG_NF_CONNTRACK_BRIDGE=m CONFIG_BRIDGE_NF_EBTABLES=m CONFIG_BRIDGE_EBT_BROUTE=m @@ -1588,12 +1614,11 @@ CONFIG_BRIDGE_IGMP_SNOOPING=y CONFIG_BRIDGE_VLAN_FILTERING=y CONFIG_BRIDGE_MRP=y CONFIG_BRIDGE_CFM=y -CONFIG_HAVE_NET_DSA=y CONFIG_NET_DSA=m -CONFIG_NET_DSA_TAG_8021Q=m CONFIG_NET_DSA_TAG_AR9331=m CONFIG_NET_DSA_TAG_BRCM_COMMON=m CONFIG_NET_DSA_TAG_BRCM=m +CONFIG_NET_DSA_TAG_BRCM_LEGACY=m CONFIG_NET_DSA_TAG_BRCM_PREPEND=m CONFIG_NET_DSA_TAG_HELLCREEK=m CONFIG_NET_DSA_TAG_GSWIP=m @@ -1778,6 +1803,8 @@ CONFIG_QRTR_TUN=m CONFIG_QRTR_MHI=m CONFIG_NET_NCSI=y CONFIG_NCSI_OEM_CMD_GET_MAC=y +CONFIG_NCSI_OEM_CMD_KEEP_PHY=y +CONFIG_PCPU_DEV_REFCNT=y CONFIG_RPS=y CONFIG_RFS_ACCEL=y CONFIG_SOCK_RX_QUEUE_MAPPING=y @@ -1786,7 +1813,6 @@ CONFIG_CGROUP_NET_PRIO=y CONFIG_CGROUP_NET_CLASSID=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y -CONFIG_BPF_JIT=y CONFIG_BPF_STREAM_PARSER=y CONFIG_NET_FLOW_LIMIT=y @@ -1878,6 +1904,7 @@ CONFIG_CAN_MCP251XFD=m CONFIG_CAN_8DEV_USB=m CONFIG_CAN_EMS_USB=m CONFIG_CAN_ESD_USB2=m +CONFIG_CAN_ETAS_ES58X=m CONFIG_CAN_GS_USB=m CONFIG_CAN_KVASER_USB=m CONFIG_CAN_MCBA_USB=m @@ -1902,6 +1929,7 @@ CONFIG_BT_LE=y CONFIG_BT_6LOWPAN=m CONFIG_BT_LEDS=y CONFIG_BT_MSFTEXT=y +CONFIG_BT_AOSPEXT=y # CONFIG_BT_DEBUGFS is not set # CONFIG_BT_SELFTEST is not set @@ -1945,6 +1973,7 @@ CONFIG_BT_ATH3K=m CONFIG_BT_MTKSDIO=m CONFIG_BT_MTKUART=m CONFIG_BT_HCIRSI=m +CONFIG_BT_VIRTIO=m # end of Bluetooth device drivers CONFIG_AF_RXRPC=m @@ -2053,12 +2082,12 @@ CONFIG_LWTUNNEL_BPF=y CONFIG_DST_CACHE=y CONFIG_GRO_CELLS=y CONFIG_SOCK_VALIDATE_XMIT=y +CONFIG_NET_SELFTESTS=m CONFIG_NET_SOCK_MSG=y CONFIG_NET_DEVLINK=y CONFIG_PAGE_POOL=y CONFIG_FAILOVER=m CONFIG_ETHTOOL_NETLINK=y -CONFIG_HAVE_EBPF_JIT=y # # Device Drivers @@ -2148,6 +2177,8 @@ CONFIG_PCI_SW_SWITCHTEC=m CONFIG_CXL_BUS=m CONFIG_CXL_MEM=m # CONFIG_CXL_MEM_RAW_COMMANDS is not set +CONFIG_CXL_ACPI=m +CONFIG_CXL_PMEM=m CONFIG_PCCARD=m CONFIG_PCMCIA=m CONFIG_PCMCIA_LOAD_CIS=y @@ -2207,6 +2238,7 @@ CONFIG_REGMAP_W1=m CONFIG_REGMAP_MMIO=y CONFIG_REGMAP_IRQ=y CONFIG_REGMAP_SOUNDWIRE=m +CONFIG_REGMAP_SOUNDWIRE_MBQ=m CONFIG_REGMAP_SCCB=m CONFIG_REGMAP_SPI_AVMM=m CONFIG_DMA_SHARED_BUFFER=y @@ -2285,6 +2317,7 @@ CONFIG_MTD_PLATRAM=m # CONFIG_MTD_PMC551 is not set # CONFIG_MTD_DATAFLASH is not set # CONFIG_MTD_MCHP23K256 is not set +# CONFIG_MTD_MCHP48L640 is not set # CONFIG_MTD_SST25L is not set # CONFIG_MTD_SLRAM is not set # CONFIG_MTD_PHRAM is not set @@ -2387,7 +2420,6 @@ CONFIG_ZRAM_DEF_COMP_LZORLE=y CONFIG_ZRAM_DEF_COMP="lzo-rle" CONFIG_ZRAM_WRITEBACK=y # CONFIG_ZRAM_MEMORY_TRACKING is not set -CONFIG_BLK_DEV_UMEM=m CONFIG_BLK_DEV_LOOP=m CONFIG_BLK_DEV_LOOP_MIN_COUNT=0 CONFIG_BLK_DEV_CRYPTOLOOP=m @@ -2457,10 +2489,10 @@ CONFIG_DS1682=m CONFIG_VMWARE_BALLOON=m CONFIG_LATTICE_ECP3_CONFIG=m # CONFIG_SRAM is not set +CONFIG_DW_XDATA_PCIE=m CONFIG_PCI_ENDPOINT_TEST=m CONFIG_XILINX_SDFEC=m CONFIG_MISC_RTSX=m -CONFIG_PVPANIC=m CONFIG_C2PORT=m CONFIG_C2PORT_DURAMAR_2150=m @@ -2504,11 +2536,11 @@ CONFIG_MISC_RTSX_PCI=m CONFIG_MISC_RTSX_USB=m CONFIG_HABANA_AI=m CONFIG_UACCE=m +CONFIG_PVPANIC=y +CONFIG_PVPANIC_MMIO=m +CONFIG_PVPANIC_PCI=m # end of Misc devices -CONFIG_HAVE_IDE=y -# CONFIG_IDE is not set - # # SCSI device support # @@ -2590,6 +2622,7 @@ CONFIG_SCSI_MPT3SAS=m CONFIG_SCSI_MPT2SAS_MAX_SGE=128 CONFIG_SCSI_MPT3SAS_MAX_SGE=128 CONFIG_SCSI_MPT2SAS=m +CONFIG_SCSI_MPI3MR=m CONFIG_SCSI_SMARTPQI=m CONFIG_SCSI_UFSHCD=m CONFIG_SCSI_UFSHCD_PCI=m @@ -2642,6 +2675,7 @@ CONFIG_QEDI=m CONFIG_QEDF=m CONFIG_SCSI_LPFC=m # CONFIG_SCSI_LPFC_DEBUG_FS is not set +CONFIG_SCSI_EFCT=m CONFIG_SCSI_DC395x=m CONFIG_SCSI_AM53C974=m CONFIG_SCSI_WD719X=m @@ -2939,6 +2973,7 @@ CONFIG_NET_DSA_MICROCHIP_KSZ9477_I2C=m CONFIG_NET_DSA_MICROCHIP_KSZ9477_SPI=m CONFIG_NET_DSA_MICROCHIP_KSZ8795=m CONFIG_NET_DSA_MICROCHIP_KSZ8795_SPI=m +CONFIG_NET_DSA_MICROCHIP_KSZ8863_SMI=m CONFIG_NET_DSA_MV88E6XXX=m CONFIG_NET_DSA_MV88E6XXX_PTP=y CONFIG_NET_DSA_MSCC_SEVILLE=m @@ -3101,6 +3136,8 @@ CONFIG_I40EVF=m CONFIG_ICE=m CONFIG_FM10K=m CONFIG_IGC=m +CONFIG_NET_VENDOR_MICROSOFT=y +CONFIG_MICROSOFT_MANA=m CONFIG_JME=m CONFIG_NET_VENDOR_MARVELL=y CONFIG_MVMDIO=m @@ -3125,8 +3162,10 @@ CONFIG_MLX5_EN_ARFS=y CONFIG_MLX5_EN_RXNFC=y CONFIG_MLX5_MPFS=y CONFIG_MLX5_ESWITCH=y +CONFIG_MLX5_BRIDGE=y CONFIG_MLX5_CLS_ACT=y CONFIG_MLX5_TC_CT=y +CONFIG_MLX5_TC_SAMPLE=y CONFIG_MLX5_CORE_EN_DCB=y CONFIG_MLX5_CORE_IPOIB=y CONFIG_MLX5_FPGA_IPSEC=y @@ -3143,8 +3182,6 @@ CONFIG_MLXSW_CORE_HWMON=y CONFIG_MLXSW_CORE_THERMAL=y CONFIG_MLXSW_PCI=m CONFIG_MLXSW_I2C=m -CONFIG_MLXSW_SWITCHIB=m -CONFIG_MLXSW_SWITCHX2=m CONFIG_MLXSW_SPECTRUM=m CONFIG_MLXSW_SPECTRUM_DCB=y CONFIG_MLXSW_MINIMAL=m @@ -3252,6 +3289,7 @@ CONFIG_STMMAC_ETH=m CONFIG_STMMAC_PLATFORM=m CONFIG_DWMAC_GENERIC=m CONFIG_DWMAC_INTEL=m +CONFIG_DWMAC_LOONGSON=m CONFIG_STMMAC_PCI=m CONFIG_NET_VENDOR_SUN=y CONFIG_HAPPYMEAL=m @@ -3285,7 +3323,6 @@ CONFIG_NET_VENDOR_XIRCOM=y CONFIG_PCMCIA_XIRC2PS=m CONFIG_FDDI=m CONFIG_DEFXX=m -CONFIG_DEFXX_MMIO=y CONFIG_SKFP=m # CONFIG_HIPPI is not set CONFIG_NET_SB1000=m @@ -3318,11 +3355,15 @@ CONFIG_INTEL_XWAY_PHY=m CONFIG_LSI_ET1011C_PHY=m CONFIG_MARVELL_PHY=m CONFIG_MARVELL_10G_PHY=m +CONFIG_MARVELL_88X2222_PHY=m +CONFIG_MEDIATEK_GE_PHY=m CONFIG_MICREL_PHY=m CONFIG_MICROCHIP_PHY=m CONFIG_MICROCHIP_T1_PHY=m CONFIG_MICROSEMI_PHY=m +CONFIG_MOTORCOMM_PHY=m CONFIG_NATIONAL_PHY=m +CONFIG_NXP_C45_TJA11XX_PHY=m CONFIG_NXP_TJA11XX_PHY=m CONFIG_AT803X_PHY=m CONFIG_QSEMI_PHY=m @@ -3342,6 +3383,8 @@ CONFIG_XILINX_GMII2RGMII=m CONFIG_MICREL_KS8995MA=m CONFIG_MDIO_DEVICE=m CONFIG_MDIO_BUS=m +CONFIG_FWNODE_MDIO=m +CONFIG_ACPI_MDIO=m CONFIG_MDIO_DEVRES=m CONFIG_MDIO_BITBANG=m CONFIG_MDIO_BCM_UNIMAC=m @@ -3730,6 +3773,17 @@ CONFIG_IEEE802154_CA8210=m # CONFIG_IEEE802154_CA8210_DEBUGFS is not set CONFIG_IEEE802154_MCR20A=m CONFIG_IEEE802154_HWSIM=m + +# +# Wireless WAN +# +CONFIG_WWAN=y +CONFIG_WWAN_HWSIM=m +CONFIG_MHI_WWAN_CTRL=m +CONFIG_RPMSG_WWAN_CTRL=m +CONFIG_IOSM=m +# end of Wireless WAN + CONFIG_XEN_NETDEV_FRONTEND=m CONFIG_XEN_NETDEV_BACKEND=m CONFIG_VMXNET3=m @@ -3883,6 +3937,7 @@ CONFIG_JOYSTICK_WALKERA0701=m CONFIG_JOYSTICK_PSXPAD_SPI=m CONFIG_JOYSTICK_PSXPAD_SPI_FF=y CONFIG_JOYSTICK_PXRC=m +CONFIG_JOYSTICK_QWIIC=m CONFIG_JOYSTICK_FSIA6B=m CONFIG_INPUT_TABLET=y CONFIG_TABLET_USB_ACECAD=m @@ -3892,7 +3947,6 @@ CONFIG_TABLET_USB_KBTAB=m CONFIG_TABLET_USB_PEGASUS=m CONFIG_TABLET_SERIAL_WACOM4=m CONFIG_INPUT_TOUCHSCREEN=y -CONFIG_TOUCHSCREEN_PROPERTIES=y CONFIG_TOUCHSCREEN_88PM860X=m CONFIG_TOUCHSCREEN_ADS7846=m CONFIG_TOUCHSCREEN_AD7877=m @@ -3924,7 +3978,9 @@ CONFIG_TOUCHSCREEN_EXC3000=m CONFIG_TOUCHSCREEN_FUJITSU=m CONFIG_TOUCHSCREEN_GOODIX=m CONFIG_TOUCHSCREEN_HIDEEP=m +CONFIG_TOUCHSCREEN_HYCON_HY46XX=m CONFIG_TOUCHSCREEN_ILI210X=m +CONFIG_TOUCHSCREEN_ILITEK=m CONFIG_TOUCHSCREEN_S6SY761=m CONFIG_TOUCHSCREEN_GUNZE=m CONFIG_TOUCHSCREEN_EKTF2127=m @@ -3936,6 +3992,7 @@ CONFIG_TOUCHSCREEN_MAX11801=m CONFIG_TOUCHSCREEN_MCS5000=m CONFIG_TOUCHSCREEN_MMS114=m CONFIG_TOUCHSCREEN_MELFAS_MIP4=m +CONFIG_TOUCHSCREEN_MSG2638=m CONFIG_TOUCHSCREEN_MTOUCH=m CONFIG_TOUCHSCREEN_INEXIO=m CONFIG_TOUCHSCREEN_MK712=m @@ -4001,6 +4058,7 @@ CONFIG_INPUT_AD714X=m CONFIG_INPUT_AD714X_I2C=m CONFIG_INPUT_AD714X_SPI=m CONFIG_INPUT_ARIZONA_HAPTICS=m +CONFIG_INPUT_ATC260X_ONKEY=m CONFIG_INPUT_BMA150=m CONFIG_INPUT_E3X0_BUTTON=m CONFIG_INPUT_PCSPKR=m @@ -4044,6 +4102,7 @@ CONFIG_INPUT_ADXL34X_I2C=m CONFIG_INPUT_ADXL34X_SPI=m CONFIG_INPUT_IMS_PCU=m CONFIG_INPUT_IQS269A=m +CONFIG_INPUT_IQS626A=m CONFIG_INPUT_CMA3000=m CONFIG_INPUT_CMA3000_I2C=m CONFIG_INPUT_XEN_KBDDEV_FRONTEND=m @@ -4169,19 +4228,13 @@ CONFIG_SERIAL_SPRD=m CONFIG_SERIAL_MCTRL_GPIO=y CONFIG_SERIAL_NONSTANDARD=y -CONFIG_ROCKETPORT=m -CONFIG_CYCLADES=m -CONFIG_CYZ_INTR=y CONFIG_MOXA_INTELLIO=m CONFIG_MOXA_SMARTIO=m CONFIG_SYNCLINK_GT=m -CONFIG_ISI=m CONFIG_N_HDLC=m CONFIG_N_GSM=m CONFIG_NOZOMI=m CONFIG_NULL_TTY=m -CONFIG_TRACE_ROUTER=m -CONFIG_TRACE_SINK=m CONFIG_HVC_DRIVER=y CONFIG_HVC_IRQ=y CONFIG_HVC_XEN=y @@ -4224,10 +4277,7 @@ CONFIG_IPWIRELESS=m CONFIG_MWAVE=m # CONFIG_DEVMEM is not set -# CONFIG_DEVKMEM is not set CONFIG_NVRAM=m -CONFIG_RAW_DRIVER=m -CONFIG_MAX_RAW_DEVS=8192 # CONFIG_DEVPORT is not set CONFIG_HPET=y # CONFIG_HPET_MMAP is not set @@ -4252,8 +4302,10 @@ CONFIG_TCG_TIS_ST33ZP24=m CONFIG_TCG_TIS_ST33ZP24_I2C=m CONFIG_TCG_TIS_ST33ZP24_SPI=m CONFIG_TELCLOCK=m +CONFIG_XILLYBUS_CLASS=m CONFIG_XILLYBUS=m CONFIG_XILLYBUS_PCIE=m +CONFIG_XILLYUSB=m # end of Character devices # CONFIG_RANDOM_TRUST_CPU is not set @@ -4341,6 +4393,7 @@ CONFIG_I2C_XILINX=m # CONFIG_I2C_DIOLAN_U2C=m CONFIG_I2C_DLN2=m +CONFIG_I2C_CP2615=m CONFIG_I2C_PARPORT=m CONFIG_I2C_ROBOTFUZZ_OSIF=m CONFIG_I2C_TAOS_EVM=m @@ -4373,6 +4426,8 @@ CONFIG_SPI_MEM=y # SPI Master Controller Drivers # CONFIG_SPI_ALTERA=m +CONFIG_SPI_ALTERA_CORE=m +CONFIG_SPI_ALTERA_DFL=m CONFIG_SPI_AXI_SPI_ENGINE=m CONFIG_SPI_BITBANG=m CONFIG_SPI_BUTTERFLY=m @@ -4637,6 +4692,7 @@ CONFIG_W1_SLAVE_DS28E17=m # end of 1-wire Slaves CONFIG_POWER_RESET=y +CONFIG_POWER_RESET_ATC260X=m CONFIG_POWER_RESET_MT6323=y CONFIG_POWER_RESET_RESTART=y CONFIG_POWER_SUPPLY=y @@ -4704,11 +4760,14 @@ CONFIG_CHARGER_BQ256XX=m CONFIG_CHARGER_SMB347=m CONFIG_CHARGER_TPS65090=m CONFIG_BATTERY_GAUGE_LTC2941=m +CONFIG_BATTERY_GOLDFISH=m CONFIG_BATTERY_RT5033=m CONFIG_CHARGER_RT9455=m CONFIG_CHARGER_CROS_USBPD=m CONFIG_CHARGER_BD99954=m CONFIG_CHARGER_WILCO=m +CONFIG_BATTERY_SURFACE=m +CONFIG_CHARGER_SURFACE=m CONFIG_HWMON=y CONFIG_HWMON_VID=m # CONFIG_HWMON_DEBUG_CHIP is not set @@ -4742,7 +4801,6 @@ CONFIG_SENSORS_AXI_FAN_CONTROL=m CONFIG_SENSORS_K8TEMP=m CONFIG_SENSORS_K10TEMP=m CONFIG_SENSORS_FAM15H_POWER=m -CONFIG_SENSORS_AMD_ENERGY=m CONFIG_SENSORS_APPLESMC=m CONFIG_SENSORS_ASB100=m CONFIG_SENSORS_ASPEED=m @@ -4833,15 +4891,20 @@ CONFIG_SENSORS_NCT6775=m CONFIG_SENSORS_NCT7802=m CONFIG_SENSORS_NCT7904=m CONFIG_SENSORS_NPCM7XX=m +CONFIG_SENSORS_NZXT_KRAKEN2=m CONFIG_SENSORS_PCF8591=m CONFIG_PMBUS=m CONFIG_SENSORS_PMBUS=m CONFIG_SENSORS_ADM1266=m CONFIG_SENSORS_ADM1275=m CONFIG_SENSORS_BEL_PFE=m +CONFIG_SENSORS_BPA_RS600=m +CONFIG_SENSORS_FSP_3Y=m CONFIG_SENSORS_IBM_CFFPS=m +CONFIG_SENSORS_DPS920AB=m CONFIG_SENSORS_INSPUR_IPSPS=m CONFIG_SENSORS_IR35221=m +CONFIG_SENSORS_IR36021=m CONFIG_SENSORS_IR38064=m CONFIG_SENSORS_IRPS5401=m CONFIG_SENSORS_ISL68137=m @@ -4849,6 +4912,7 @@ CONFIG_SENSORS_LM25066=m CONFIG_SENSORS_LTC2978=m # CONFIG_SENSORS_LTC2978_REGULATOR is not set CONFIG_SENSORS_LTC3815=m +CONFIG_SENSORS_MAX15301=m CONFIG_SENSORS_MAX16064=m CONFIG_SENSORS_MAX16601=m CONFIG_SENSORS_MAX20730=m @@ -4856,10 +4920,13 @@ CONFIG_SENSORS_MAX20751=m CONFIG_SENSORS_MAX31785=m CONFIG_SENSORS_MAX34440=m CONFIG_SENSORS_MAX8688=m +CONFIG_SENSORS_MP2888=m CONFIG_SENSORS_MP2975=m +CONFIG_SENSORS_PIM4328=m CONFIG_SENSORS_PM6764TR=m CONFIG_SENSORS_PXE1610=m CONFIG_SENSORS_Q54SJ108A2=m +CONFIG_SENSORS_STPDDC60=m CONFIG_SENSORS_TPS40422=m CONFIG_SENSORS_TPS53679=m CONFIG_SENSORS_UCD9000=m @@ -4870,6 +4937,7 @@ CONFIG_SENSORS_SBTSI=m CONFIG_SENSORS_SHT15=m CONFIG_SENSORS_SHT21=m CONFIG_SENSORS_SHT3x=m +CONFIG_SENSORS_SHT4x=m CONFIG_SENSORS_SHTC1=m CONFIG_SENSORS_SIS5595=m CONFIG_SENSORS_DME1737=m @@ -4962,6 +5030,7 @@ CONFIG_PROC_THERMAL_MMIO_RAPL=m CONFIG_INTEL_BXT_PMIC_THERMAL=m CONFIG_INTEL_PCH_THERMAL=m +CONFIG_INTEL_TCC_COOLING=m # end of Intel thermal drivers CONFIG_GENERIC_ADC_THERMAL=m @@ -4971,6 +5040,7 @@ CONFIG_WATCHDOG_CORE=y CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y CONFIG_WATCHDOG_OPEN_TIMEOUT=0 CONFIG_WATCHDOG_SYSFS=y +# CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set # # Watchdog Pretimeout Governors @@ -5153,16 +5223,13 @@ CONFIG_PCF50633_ADC=m CONFIG_PCF50633_GPIO=m CONFIG_UCB1400_CORE=m CONFIG_MFD_RDC321X=m +CONFIG_MFD_RT4831=m CONFIG_MFD_RT5033=m CONFIG_MFD_RC5T583=y -CONFIG_MFD_SEC_CORE=y CONFIG_MFD_SI476X_CORE=m CONFIG_MFD_SM501=m CONFIG_MFD_SM501_GPIO=y CONFIG_MFD_SKY81452=m -CONFIG_ABX500_CORE=y -CONFIG_AB3100_CORE=y -CONFIG_AB3100_OTP=y CONFIG_MFD_SYSCON=y CONFIG_MFD_TI_AM335X_TSCADC=m CONFIG_MFD_LP3943=m @@ -5174,7 +5241,6 @@ CONFIG_TPS65010=m CONFIG_TPS6507X=m CONFIG_MFD_TPS65086=m CONFIG_MFD_TPS65090=y -CONFIG_MFD_TPS68470=y CONFIG_MFD_TI_LP873X=m CONFIG_MFD_TPS6586X=y CONFIG_MFD_TPS65910=y @@ -5189,7 +5255,7 @@ CONFIG_MFD_WL1273_CORE=m CONFIG_MFD_LM3533=m CONFIG_MFD_TQMX86=m CONFIG_MFD_VX855=m -CONFIG_MFD_ARIZONA=y +CONFIG_MFD_ARIZONA=m CONFIG_MFD_ARIZONA_I2C=m CONFIG_MFD_ARIZONA_SPI=m CONFIG_MFD_CS47L24=y @@ -5205,6 +5271,8 @@ CONFIG_MFD_WM8350=y CONFIG_MFD_WM8350_I2C=y CONFIG_MFD_WM8994=m CONFIG_MFD_WCD934X=m +CONFIG_MFD_ATC260X=m +CONFIG_MFD_ATC260X_I2C=m CONFIG_RAVE_SP_CORE=m CONFIG_MFD_INTEL_M10_BMC=m # end of Multifunction device drivers @@ -5223,6 +5291,7 @@ CONFIG_REGULATOR_AAT2870=m CONFIG_REGULATOR_ARIZONA_LDO1=m CONFIG_REGULATOR_ARIZONA_MICSUPP=m CONFIG_REGULATOR_AS3711=m +CONFIG_REGULATOR_ATC260X=m CONFIG_REGULATOR_AXP20X=m CONFIG_REGULATOR_BCM590XX=m CONFIG_REGULATOR_BD9571MWV=m @@ -5248,6 +5317,7 @@ CONFIG_REGULATOR_MAX14577=m CONFIG_REGULATOR_MAX1586=m CONFIG_REGULATOR_MAX8649=m CONFIG_REGULATOR_MAX8660=m +CONFIG_REGULATOR_MAX8893=m CONFIG_REGULATOR_MAX8907=m CONFIG_REGULATOR_MAX8925=m CONFIG_REGULATOR_MAX8952=m @@ -5262,6 +5332,7 @@ CONFIG_REGULATOR_MP8859=m CONFIG_REGULATOR_MT6311=m CONFIG_REGULATOR_MT6323=m CONFIG_REGULATOR_MT6358=m +CONFIG_REGULATOR_MT6359=m CONFIG_REGULATOR_MT6360=m CONFIG_REGULATOR_MT6397=m CONFIG_REGULATOR_PALMAS=m @@ -5275,11 +5346,11 @@ CONFIG_REGULATOR_PWM=m CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY=m CONFIG_REGULATOR_RC5T583=m CONFIG_REGULATOR_RT4801=m +CONFIG_REGULATOR_RT4831=m CONFIG_REGULATOR_RT5033=m +CONFIG_REGULATOR_RT6160=m +CONFIG_REGULATOR_RT6245=m CONFIG_REGULATOR_RTMV20=m -CONFIG_REGULATOR_S2MPA01=m -CONFIG_REGULATOR_S2MPS11=m -CONFIG_REGULATOR_S5M8767=m CONFIG_REGULATOR_SKY81452=m CONFIG_REGULATOR_SLG51000=m CONFIG_REGULATOR_TPS51632=m @@ -5381,6 +5452,7 @@ CONFIG_VIDEO_TUNER=m CONFIG_V4L2_MEM2MEM_DEV=m CONFIG_V4L2_FLASH_LED_CLASS=m CONFIG_V4L2_FWNODE=m +CONFIG_V4L2_ASYNC=m CONFIG_VIDEOBUF_GEN=m CONFIG_VIDEOBUF_DMA_SG=m CONFIG_VIDEOBUF_VMALLOC=m @@ -5410,7 +5482,6 @@ CONFIG_DVB_DYNAMIC_MINORS=y # # Drivers filtered as selected at 'Filter media drivers' # -CONFIG_TTPCI_EEPROM=m CONFIG_MEDIA_USB_SUPPORT=y # @@ -5581,7 +5652,6 @@ CONFIG_VIDEO_TW686X=m # Media capture/analog TV support # CONFIG_VIDEO_IVTV=m -# CONFIG_VIDEO_IVTV_DEPRECATED_IOCTLS is not set CONFIG_VIDEO_IVTV_ALSA=m CONFIG_VIDEO_FB_IVTV=m # CONFIG_VIDEO_FB_IVTV_FORCE_PAT is not set @@ -5618,14 +5688,10 @@ CONFIG_VIDEO_SAA7164=m # # Media digital TV PCI Adapters # -CONFIG_DVB_AV7110_IR=y -CONFIG_DVB_AV7110=m -CONFIG_DVB_AV7110_OSD=y CONFIG_DVB_BUDGET_CORE=m CONFIG_DVB_BUDGET=m CONFIG_DVB_BUDGET_CI=m CONFIG_DVB_BUDGET_AV=m -CONFIG_DVB_BUDGET_PATCH=m CONFIG_DVB_B2C2_FLEXCOP_PCI=m # CONFIG_DVB_B2C2_FLEXCOP_PCI_DEBUG is not set CONFIG_DVB_PLUTO2=m @@ -5672,6 +5738,7 @@ CONFIG_MEDIA_COMMON_OPTIONS=y # CONFIG_VIDEO_CX2341X=m CONFIG_VIDEO_TVEEPROM=m +CONFIG_TTPCI_EEPROM=m CONFIG_CYPRESS_FIRMWARE=m CONFIG_VIDEOBUF2_CORE=m CONFIG_VIDEOBUF2_V4L2=m @@ -5761,6 +5828,7 @@ CONFIG_VIDEO_M52790=m CONFIG_VIDEO_APTINA_PLL=m CONFIG_VIDEO_CCS_PLL=m CONFIG_VIDEO_HI556=m +CONFIG_VIDEO_IMX208=m CONFIG_VIDEO_IMX214=m CONFIG_VIDEO_IMX219=m CONFIG_VIDEO_IMX258=m @@ -5946,7 +6014,6 @@ CONFIG_DVB_TDA10071=m # # DVB-T (terrestrial) frontends # -CONFIG_DVB_SP8870=m CONFIG_DVB_SP887X=m CONFIG_DVB_CX22700=m CONFIG_DVB_CX22702=m @@ -6064,7 +6131,6 @@ CONFIG_DRM_MIPI_DSI=y CONFIG_DRM_DP_AUX_CHARDEV=y # CONFIG_DRM_DEBUG_SELFTEST is not set CONFIG_DRM_KMS_HELPER=m -CONFIG_DRM_KMS_FB_HELPER=y CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_FBDEV_OVERALLOC=100 CONFIG_DRM_LOAD_EDID_FIRMWARE=y @@ -6097,7 +6163,6 @@ CONFIG_DRM_AMDGPU=m CONFIG_DRM_AMDGPU_SI=y CONFIG_DRM_AMDGPU_CIK=y CONFIG_DRM_AMDGPU_USERPTR=y -# CONFIG_DRM_AMDGPU_GART_DEBUGFS is not set # # ACP (Audio CoProcessor) Configuration @@ -6112,9 +6177,11 @@ CONFIG_DRM_AMD_DC=y CONFIG_DRM_AMD_DC_DCN=y CONFIG_DRM_AMD_DC_HDCP=y CONFIG_DRM_AMD_DC_SI=y +CONFIG_DRM_AMD_SECURE_DISPLAY=y # end of Display Engine Configuration CONFIG_HSA_AMD=y +CONFIG_HSA_AMD_SVM=y CONFIG_DRM_NOUVEAU=m # CONFIG_NOUVEAU_LEGACY_CTX_SUPPORT is not set CONFIG_NOUVEAU_DEBUG=5 @@ -6130,6 +6197,7 @@ CONFIG_DRM_I915_COMPRESS_ERROR=y CONFIG_DRM_I915_USERPTR=y CONFIG_DRM_I915_GVT=y CONFIG_DRM_I915_GVT_KVMGT=m +CONFIG_DRM_I915_REQUEST_TIMEOUT=20000 CONFIG_DRM_I915_FENCE_TIMEOUT=10000 CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND=250 CONFIG_DRM_I915_HEARTBEAT_INTERVAL=2500 @@ -6142,7 +6210,6 @@ CONFIG_DRM_VKMS=m CONFIG_DRM_VMWGFX=m CONFIG_DRM_VMWGFX_FBCON=y CONFIG_DRM_GMA500=m -CONFIG_DRM_GMA600=y CONFIG_DRM_UDL=m CONFIG_DRM_AST=m CONFIG_DRM_MGAG200=m @@ -6170,6 +6237,7 @@ CONFIG_DRM_ANALOGIX_DP=m # CONFIG_DRM_ETNAVIV is not set CONFIG_DRM_CIRRUS_QEMU=m CONFIG_DRM_GM12U320=m +CONFIG_DRM_SIMPLEDRM=m CONFIG_TINYDRM_HX8357D=m CONFIG_TINYDRM_ILI9225=m CONFIG_TINYDRM_ILI9341=m @@ -6181,6 +6249,8 @@ CONFIG_TINYDRM_ST7735R=m CONFIG_DRM_XEN=y CONFIG_DRM_XEN_FRONTEND=m CONFIG_DRM_VBOXVIDEO=m +CONFIG_DRM_GUD=m +CONFIG_DRM_HYPERV=m # CONFIG_DRM_LEGACY is not set CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y @@ -6252,6 +6322,7 @@ CONFIG_XEN_FBDEV_FRONTEND=m # CONFIG_FB_MB862XX is not set CONFIG_FB_HYPERV=m CONFIG_FB_SIMPLE=y +# CONFIG_FB_SSD1307 is not set # CONFIG_FB_SM712 is not set # end of Frame buffer Devices @@ -6280,6 +6351,7 @@ CONFIG_BACKLIGHT_DA9052=m CONFIG_BACKLIGHT_MAX8925=m CONFIG_BACKLIGHT_APPLE=m CONFIG_BACKLIGHT_QCOM_WLED=m +CONFIG_BACKLIGHT_RT4831=m CONFIG_BACKLIGHT_SAHARA=m CONFIG_BACKLIGHT_WM831X=m CONFIG_BACKLIGHT_ADP5520=m @@ -6355,6 +6427,7 @@ CONFIG_SND_DEBUG=y # CONFIG_SND_JACK_INJECTION_DEBUG is not set CONFIG_SND_VMASTER=y CONFIG_SND_DMA_SGBUF=y +CONFIG_SND_CTL_LED=m CONFIG_SND_SEQUENCER=m CONFIG_SND_SEQ_DUMMY=m CONFIG_SND_SEQUENCER_OSS=m @@ -6560,6 +6633,7 @@ CONFIG_SND_DESIGNWARE_PCM=y # CONFIG_SND_SOC_FSL_ESAI is not set # CONFIG_SND_SOC_FSL_MICFIL is not set CONFIG_SND_SOC_FSL_XCVR=m +CONFIG_SND_SOC_FSL_RPMSG=m # CONFIG_SND_SOC_IMX_AUDMUX is not set # end of SoC Audio for Freescale CPUs @@ -6593,6 +6667,8 @@ CONFIG_SND_SOC_INTEL_SKYLAKE_COMMON=m CONFIG_SND_SOC_ACPI_INTEL_MATCH=m CONFIG_SND_SOC_INTEL_MACH=y CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES=y +CONFIG_SND_SOC_INTEL_HDA_DSP_COMMON=m +CONFIG_SND_SOC_INTEL_SOF_MAXIM_COMMON=m CONFIG_SND_SOC_INTEL_HASWELL_MACH=m CONFIG_SND_SOC_INTEL_BDW_RT5650_MACH=m CONFIG_SND_SOC_INTEL_BDW_RT5677_MACH=m @@ -6625,6 +6701,7 @@ CONFIG_SND_SOC_INTEL_GLK_DA7219_MAX98357A_MACH=m CONFIG_SND_SOC_INTEL_GLK_RT5682_MAX98357A_MACH=m CONFIG_SND_SOC_INTEL_SKL_HDA_DSP_GENERIC_MACH=m CONFIG_SND_SOC_INTEL_SOF_RT5682_MACH=m +CONFIG_SND_SOC_INTEL_SOF_CS42L42_MACH=m CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH=m CONFIG_SND_SOC_INTEL_CML_LP_DA7219_MAX98357A_MACH=m CONFIG_SND_SOC_INTEL_SOF_CML_RT1011_RT5682_MACH=m @@ -6789,8 +6866,10 @@ CONFIG_SND_SOC_RT286=m CONFIG_SND_SOC_RT298=m CONFIG_SND_SOC_RT1011=m CONFIG_SND_SOC_RT1015=m +CONFIG_SND_SOC_RT1015P=m CONFIG_SND_SOC_RT1308=m CONFIG_SND_SOC_RT1308_SDW=m +CONFIG_SND_SOC_RT1316_SDW=m CONFIG_SND_SOC_RT5514=m CONFIG_SND_SOC_RT5514_SPI=m CONFIG_SND_SOC_RT5616=m @@ -6811,8 +6890,10 @@ CONFIG_SND_SOC_RT700=m CONFIG_SND_SOC_RT700_SDW=m CONFIG_SND_SOC_RT711=m CONFIG_SND_SOC_RT711_SDW=m +CONFIG_SND_SOC_RT711_SDCA_SDW=m CONFIG_SND_SOC_RT715=m CONFIG_SND_SOC_RT715_SDW=m +CONFIG_SND_SOC_RT715_SDCA_SDW=m CONFIG_SND_SOC_SGTL5000=m CONFIG_SND_SOC_SI476X=m CONFIG_SND_SOC_SIGMADSP=m @@ -6822,6 +6903,7 @@ CONFIG_SND_SOC_SIMPLE_AMPLIFIER=m CONFIG_SND_SOC_SIMPLE_MUX=m CONFIG_SND_SOC_SPDIF=m CONFIG_SND_SOC_SSM2305=m +CONFIG_SND_SOC_SSM2518=m CONFIG_SND_SOC_SSM2602=m CONFIG_SND_SOC_SSM2602_SPI=m CONFIG_SND_SOC_SSM2602_I2C=m @@ -6839,6 +6921,7 @@ CONFIG_SND_SOC_TAS5720=m CONFIG_SND_SOC_TAS6424=m CONFIG_SND_SOC_TDA7419=m CONFIG_SND_SOC_TFA9879=m +CONFIG_SND_SOC_TFA989X=m CONFIG_SND_SOC_TLV320AIC23=m CONFIG_SND_SOC_TLV320AIC23_I2C=m CONFIG_SND_SOC_TLV320AIC23_SPI=m @@ -6847,13 +6930,18 @@ CONFIG_SND_SOC_TLV320AIC32X4=m CONFIG_SND_SOC_TLV320AIC32X4_I2C=m CONFIG_SND_SOC_TLV320AIC32X4_SPI=m CONFIG_SND_SOC_TLV320AIC3X=m +CONFIG_SND_SOC_TLV320AIC3X_I2C=m +CONFIG_SND_SOC_TLV320AIC3X_SPI=m CONFIG_SND_SOC_TLV320ADCX140=m CONFIG_SND_SOC_TS3A227E=m CONFIG_SND_SOC_TSCS42XX=m CONFIG_SND_SOC_TSCS454=m CONFIG_SND_SOC_UDA1334=m CONFIG_SND_SOC_WCD9335=m +CONFIG_SND_SOC_WCD_MBHC=m CONFIG_SND_SOC_WCD934X=m +CONFIG_SND_SOC_WCD938X=m +CONFIG_SND_SOC_WCD938X_SDW=m CONFIG_SND_SOC_WM5102=m CONFIG_SND_SOC_WM8510=m CONFIG_SND_SOC_WM8523=m @@ -6881,7 +6969,6 @@ CONFIG_SND_SOC_WM8978=m CONFIG_SND_SOC_WM8985=m CONFIG_SND_SOC_WSA881X=m CONFIG_SND_SOC_ZL38060=m -CONFIG_SND_SOC_ZX_AUD96P22=m CONFIG_SND_SOC_MAX9759=m CONFIG_SND_SOC_MT6351=m CONFIG_SND_SOC_MT6358=m @@ -6905,6 +6992,7 @@ CONFIG_SND_X86=y CONFIG_HDMI_LPE_AUDIO=m CONFIG_SND_SYNTH_EMUX=m CONFIG_SND_XEN_FRONTEND=m +CONFIG_SND_VIRTIO=m CONFIG_AC97_BUS=m # @@ -6947,6 +7035,7 @@ CONFIG_HID_ELAN=m CONFIG_HID_ELECOM=m CONFIG_HID_ELO=m CONFIG_HID_EZKEY=m +CONFIG_HID_FT260=m CONFIG_HID_GEMBIRD=m CONFIG_HID_GFRM=m CONFIG_HID_GLORIOUS=m @@ -7004,6 +7093,7 @@ CONFIG_HID_RETRODE=m CONFIG_HID_ROCCAT=m CONFIG_HID_SAITEK=m CONFIG_HID_SAMSUNG=m +CONFIG_HID_SEMITEK=m CONFIG_HID_SONY=m CONFIG_SONY_FF=y CONFIG_HID_SPEEDLINK=m @@ -7063,6 +7153,15 @@ CONFIG_INTEL_ISH_FIRMWARE_DOWNLOADER=m # CONFIG_AMD_SFH_HID=m # end of AMD SFH HID Support + +# +# Surface System Aggregator Module HID support +# +CONFIG_SURFACE_HID=m +CONFIG_SURFACE_KBD=m +# end of Surface System Aggregator Module HID support + +CONFIG_SURFACE_HID_CORE=m # end of HID support CONFIG_USB_OHCI_LITTLE_ENDIAN=y @@ -7296,8 +7395,8 @@ CONFIG_TYPEC_WCOVE=m CONFIG_TYPEC_UCSI=m CONFIG_UCSI_CCG=m CONFIG_UCSI_ACPI=m -CONFIG_TYPEC_HD3SS3220=m CONFIG_TYPEC_TPS6598X=m +CONFIG_TYPEC_HD3SS3220=m CONFIG_TYPEC_STUSB160X=m # @@ -7407,6 +7506,7 @@ CONFIG_LEDS_PWM=m CONFIG_LEDS_REGULATOR=m CONFIG_LEDS_BD2802=m CONFIG_LEDS_INTEL_SS4200=m +CONFIG_LEDS_LT3593=m CONFIG_LEDS_ADP5520=m CONFIG_LEDS_MC13783=m CONFIG_LEDS_TCA6507=m @@ -7458,11 +7558,6 @@ CONFIG_LEDS_TRIGGER_NETDEV=m CONFIG_LEDS_TRIGGER_PATTERN=m CONFIG_LEDS_TRIGGER_AUDIO=m CONFIG_LEDS_TRIGGER_TTY=m - -# -# LED Blink -# -CONFIG_LEDS_BLINK=y CONFIG_ACCESSIBILITY=y CONFIG_A11Y_BRAILLE_CONSOLE=y @@ -7497,7 +7592,7 @@ CONFIG_INFINIBAND_QIB=m CONFIG_INFINIBAND_QIB_DCA=y CONFIG_INFINIBAND_CXGB4=m CONFIG_INFINIBAND_EFA=m -CONFIG_INFINIBAND_I40IW=m +CONFIG_INFINIBAND_IRDMA=m CONFIG_MLX4_INFINIBAND=m CONFIG_MLX5_INFINIBAND=m CONFIG_INFINIBAND_OCRDMA=m @@ -7546,6 +7641,7 @@ CONFIG_EDAC_SBRIDGE=m CONFIG_EDAC_SKX=m CONFIG_EDAC_I10NM=m CONFIG_EDAC_PND2=m +CONFIG_EDAC_IGEN6=m CONFIG_RTC_LIB=y CONFIG_RTC_MC146818_LIB=y CONFIG_RTC_CLASS=y @@ -7610,7 +7706,6 @@ CONFIG_RTC_DRV_EM3027=m CONFIG_RTC_DRV_RV3028=m CONFIG_RTC_DRV_RV3032=m CONFIG_RTC_DRV_RV8803=m -CONFIG_RTC_DRV_S5M=m CONFIG_RTC_DRV_SD3078=m # @@ -7685,6 +7780,7 @@ CONFIG_RTC_DRV_MT6397=m # HID Sensor RTC drivers # CONFIG_RTC_DRV_HID_SENSOR_TIME=m +CONFIG_RTC_DRV_GOLDFISH=m CONFIG_RTC_DRV_WILCO_EC=m CONFIG_DMADEVICES=y # CONFIG_DMADEVICES_DEBUG is not set @@ -7699,6 +7795,7 @@ CONFIG_ALTERA_MSGDMA=m CONFIG_INTEL_IDMA64=m CONFIG_INTEL_IDXD=m CONFIG_INTEL_IDXD_SVM=y +CONFIG_INTEL_IDXD_PERFMON=y CONFIG_INTEL_IOATDMA=m CONFIG_PLX_DMA=m CONFIG_QCOM_HIDMA_MGMT=m @@ -7764,6 +7861,7 @@ CONFIG_UIO_NETX=m CONFIG_UIO_PRUSS=m CONFIG_UIO_MF624=m CONFIG_UIO_HV_GENERIC=m +CONFIG_UIO_DFL=m CONFIG_VFIO_IOMMU_TYPE1=m CONFIG_VFIO_VIRQFD=m CONFIG_VFIO=m @@ -7774,13 +7872,13 @@ CONFIG_VFIO_PCI_MMAP=y CONFIG_VFIO_PCI_INTX=y CONFIG_VFIO_PCI_IGD=y CONFIG_VFIO_MDEV=m -CONFIG_VFIO_MDEV_DEVICE=m CONFIG_IRQ_BYPASS_MANAGER=m CONFIG_VIRT_DRIVERS=y CONFIG_VBOXGUEST=m CONFIG_NITRO_ENCLAVES=m CONFIG_ACRN_HSM=m CONFIG_VIRTIO=y +CONFIG_ARCH_HAS_RESTRICTED_VIRTIO_MEMORY_ACCESS=y CONFIG_VIRTIO_PCI_LIB=m CONFIG_VIRTIO_MENU=y CONFIG_VIRTIO_PCI=m @@ -7796,9 +7894,11 @@ CONFIG_VIRTIO_DMA_SHARED_BUFFER=m CONFIG_VDPA=m CONFIG_VDPA_SIM=m CONFIG_VDPA_SIM_NET=m +CONFIG_VDPA_SIM_BLOCK=m CONFIG_IFCVF=m CONFIG_MLX5_VDPA=y CONFIG_MLX5_VDPA_NET=m +CONFIG_VP_VDPA=m CONFIG_VHOST_IOTLB=m CONFIG_VHOST_RING=m CONFIG_VHOST=m @@ -7854,9 +7954,9 @@ CONFIG_XEN_UNPOPULATED_ALLOC=y # end of Xen driver support # CONFIG_GREYBUS is not set +# CONFIG_COMEDI is not set CONFIG_STAGING=y CONFIG_PRISM2_USB=m -# CONFIG_COMEDI is not set CONFIG_RTL8192U=m CONFIG_RTLLIB=m CONFIG_RTLLIB_CRYPTO_CCMP=m @@ -7900,7 +8000,6 @@ CONFIG_ADT7316_I2C=m # # Capacitance to digital converters # -CONFIG_AD7150=m CONFIG_AD7746=m # end of Capacitance to digital converters @@ -7947,6 +8046,11 @@ CONFIG_VIDEO_ATOMISP_OV5693=m CONFIG_VIDEO_ATOMISP_LM3554=m # CONFIG_VIDEO_ZORAN is not set CONFIG_VIDEO_IPU3_IMGU=m +CONFIG_DVB_AV7110_IR=y +CONFIG_DVB_AV7110=m +CONFIG_DVB_AV7110_OSD=y +CONFIG_DVB_BUDGET_PATCH=m +CONFIG_DVB_SP8870=m # # Android @@ -7965,31 +8069,12 @@ CONFIG_UNISYS_VISORHBA=m # CONFIG_FB_TFT is not set CONFIG_MOST_COMPONENTS=m CONFIG_MOST_NET=m -CONFIG_MOST_SOUND=m CONFIG_MOST_VIDEO=m CONFIG_MOST_I2C=m CONFIG_KS7010=m CONFIG_PI433=m - -# -# Gasket devices -# -CONFIG_STAGING_GASKET_FRAMEWORK=m -CONFIG_STAGING_APEX_DRIVER=m -# end of Gasket devices - CONFIG_FIELDBUS_DEV=m -CONFIG_KPC2000=y -CONFIG_KPC2000_CORE=m -CONFIG_KPC2000_SPI=m -CONFIG_KPC2000_I2C=m -CONFIG_KPC2000_DMA=m CONFIG_QLGE=m -CONFIG_WIMAX=m -CONFIG_WIMAX_DEBUG_LEVEL=8 -CONFIG_WIMAX_I2400M=m -CONFIG_WIMAX_I2400M_USB=m -CONFIG_WIMAX_I2400M_DEBUG_LEVEL=8 CONFIG_WFX=m CONFIG_X86_PLATFORM_DEVICES=y CONFIG_ACPI_WMI=m @@ -8000,10 +8085,12 @@ CONFIG_INTEL_WMI_THUNDERBOLT=m CONFIG_MXM_WMI=m CONFIG_PEAQ_WMI=m CONFIG_XIAOMI_WMI=m +CONFIG_GIGABYTE_WMI=m CONFIG_ACERHDF=m CONFIG_ACER_WIRELESS=m CONFIG_ACER_WMI=m CONFIG_AMD_PMC=m +CONFIG_ADV_SWBUTTON=m CONFIG_APPLE_GMUX=m CONFIG_ASUS_LAPTOP=m CONFIG_ASUS_WIRELESS=m @@ -8022,6 +8109,7 @@ CONFIG_DELL_SMBIOS_WMI=y CONFIG_DELL_SMBIOS_SMM=y CONFIG_DELL_SMO8800=m CONFIG_DELL_WMI=m +CONFIG_DELL_WMI_PRIVACY=y CONFIG_DELL_WMI_AIO=m CONFIG_DELL_WMI_DESCRIPTOR=m CONFIG_DELL_WMI_LED=m @@ -8031,7 +8119,7 @@ CONFIG_FUJITSU_LAPTOP=m CONFIG_FUJITSU_TABLET=m CONFIG_GPD_POCKET_FAN=m CONFIG_HP_ACCEL=m -CONFIG_HP_WIRELESS=m +CONFIG_WIRELESS_HOTKEY=m CONFIG_HP_WMI=m CONFIG_IBM_RTL=m CONFIG_IDEAPAD_LAPTOP=m @@ -8043,8 +8131,11 @@ CONFIG_THINKPAD_ACPI_ALSA_SUPPORT=y # CONFIG_THINKPAD_ACPI_UNSAFE_LEDS is not set CONFIG_THINKPAD_ACPI_VIDEO=y CONFIG_THINKPAD_ACPI_HOTKEY_POLL=y -CONFIG_INTEL_ATOMISP2_LED=m +CONFIG_THINKPAD_LMI=m +CONFIG_X86_PLATFORM_DRIVERS_INTEL=y CONFIG_INTEL_CHT_INT33FE=m +CONFIG_INTEL_SKL_INT3472=m +CONFIG_INTEL_ATOMISP2_LED=m CONFIG_INTEL_HID_EVENT=m CONFIG_INTEL_INT0002_VGPIO=m CONFIG_INTEL_MENLOW=m @@ -8070,6 +8161,7 @@ CONFIG_TOPSTAR_LAPTOP=m CONFIG_I2C_MULTI_INSTANTIATE=m CONFIG_MLX_PLATFORM=m CONFIG_TOUCHSCREEN_DMI=y +CONFIG_FW_ATTR_CLASS=m CONFIG_INTEL_IPS=m CONFIG_INTEL_RST=m CONFIG_INTEL_SMARTCONNECT=m @@ -8129,24 +8221,34 @@ CONFIG_SURFACE_3_BUTTON=m CONFIG_SURFACE_3_POWER_OPREGION=m CONFIG_SURFACE_ACPI_NOTIFY=m CONFIG_SURFACE_AGGREGATOR_CDEV=m +CONFIG_SURFACE_AGGREGATOR_REGISTRY=m +CONFIG_SURFACE_DTX=m CONFIG_SURFACE_GPE=m CONFIG_SURFACE_HOTPLUG=m +CONFIG_SURFACE_PLATFORM_PROFILE=m CONFIG_SURFACE_PRO3_BUTTON=m CONFIG_SURFACE_AGGREGATOR=m CONFIG_SURFACE_AGGREGATOR_BUS=y # CONFIG_SURFACE_AGGREGATOR_ERROR_INJECTION is not set CONFIG_HAVE_CLK=y -CONFIG_CLKDEV_LOOKUP=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y CONFIG_COMMON_CLK_WM831X=m + +# +# Clock driver for ARM Reference designs +# +# CONFIG_ICST is not set +# CONFIG_CLK_SP810 is not set +# end of Clock driver for ARM Reference designs + +CONFIG_LMK04832=m CONFIG_COMMON_CLK_MAX9485=m CONFIG_COMMON_CLK_SI5341=m CONFIG_COMMON_CLK_SI5351=m CONFIG_COMMON_CLK_SI544=m CONFIG_COMMON_CLK_CDCE706=m CONFIG_COMMON_CLK_CS2000_CP=m -CONFIG_COMMON_CLK_S2MPS11=m CONFIG_CLK_TWL6040=m CONFIG_COMMON_CLK_PALMAS=m CONFIG_COMMON_CLK_PWM=m @@ -8178,6 +8280,7 @@ CONFIG_IOMMU_IO_PGTABLE=y # CONFIG_IOMMU_DEBUGFS is not set # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set CONFIG_IOMMU_DMA=y +CONFIG_IOMMU_SVA_LIB=y CONFIG_AMD_IOMMU=y CONFIG_AMD_IOMMU_V2=y CONFIG_DMAR_TABLE=y @@ -8188,6 +8291,7 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y CONFIG_INTEL_IOMMU_SCALABLE_MODE_DEFAULT_ON=y CONFIG_IRQ_REMAP=y CONFIG_HYPERV_IOMMU=y +CONFIG_VIRTIO_IOMMU=m # # Remoteproc drivers @@ -8281,7 +8385,6 @@ CONFIG_EXTCON=y # Extcon Device Drivers # CONFIG_EXTCON_ADC_JACK=m -CONFIG_EXTCON_ARIZONA=m CONFIG_EXTCON_AXP288=m CONFIG_EXTCON_FSA9480=m CONFIG_EXTCON_GPIO=m @@ -8332,10 +8435,15 @@ CONFIG_BMA400_SPI=m CONFIG_BMC150_ACCEL=m CONFIG_BMC150_ACCEL_I2C=m CONFIG_BMC150_ACCEL_SPI=m +CONFIG_BMI088_ACCEL=m +CONFIG_BMI088_ACCEL_SPI=m CONFIG_DA280=m CONFIG_DA311=m CONFIG_DMARD09=m CONFIG_DMARD10=m +CONFIG_FXLS8962AF=m +CONFIG_FXLS8962AF_I2C=m +CONFIG_FXLS8962AF_SPI=m CONFIG_HID_SENSOR_ACCEL_3D=m CONFIG_IIO_CROS_EC_ACCEL_LEGACY=m CONFIG_IIO_ST_ACCEL_3AXIS=m @@ -8357,6 +8465,7 @@ CONFIG_MMA9553=m CONFIG_MXC4005=m CONFIG_MXC6255=m CONFIG_SCA3000=m +CONFIG_SCA3300=m CONFIG_STK8312=m CONFIG_STK8BA50=m # end of Accelerometers @@ -8422,8 +8531,10 @@ CONFIG_TI_ADC128S052=m CONFIG_TI_ADC161S626=m CONFIG_TI_ADS1015=m CONFIG_TI_ADS7950=m +CONFIG_TI_ADS131E08=m CONFIG_TI_AM335X_ADC=m CONFIG_TI_TLC4541=m +CONFIG_TI_TSC2046=m CONFIG_TWL4030_MADC=m CONFIG_TWL6030_GPADC=m CONFIG_VIPERBOARD_ADC=m @@ -8443,6 +8554,12 @@ CONFIG_HMC425=m # end of Amplifiers # +# Capacitance to digital converters +# +CONFIG_AD7150=m +# end of Capacitance to digital converters + +# # Chemical Sensors # CONFIG_ATLAS_PH_SENSOR=m @@ -8458,6 +8575,8 @@ CONFIG_SCD30_I2C=m CONFIG_SCD30_SERIAL=m CONFIG_SENSIRION_SGP30=m CONFIG_SPS30=m +CONFIG_SPS30_I2C=m +CONFIG_SPS30_SERIAL=m CONFIG_VZ89X=m # end of Chemical Sensors @@ -8475,6 +8594,11 @@ CONFIG_HID_SENSOR_IIO_TRIGGER=m CONFIG_IIO_MS_SENSORS_I2C=m # +# IIO SCMI Sensors +# +# end of IIO SCMI Sensors + +# # SSP Sensor Common # CONFIG_IIO_SSP_SENSORS_COMMONS=m @@ -8625,6 +8749,9 @@ CONFIG_INV_MPU6050_SPI=m CONFIG_IIO_ST_LSM6DSX=m CONFIG_IIO_ST_LSM6DSX_I2C=m CONFIG_IIO_ST_LSM6DSX_SPI=m +CONFIG_IIO_ST_LSM9DS0=m +CONFIG_IIO_ST_LSM9DS0_I2C=m +CONFIG_IIO_ST_LSM9DS0_SPI=m # end of Inertial measurement units CONFIG_IIO_ADIS_LIB=m @@ -8676,6 +8803,7 @@ CONFIG_TCS3414=m CONFIG_TCS3472=m CONFIG_SENSORS_TSL2563=m CONFIG_TSL2583=m +CONFIG_TSL2591=m CONFIG_TSL2772=m CONFIG_TSL4531=m CONFIG_US5182D=m @@ -8799,6 +8927,7 @@ CONFIG_AS3935=m # # Proximity and distance sensors # +CONFIG_CROS_EC_MKBP_PROXIMITY=m CONFIG_ISL29501=m CONFIG_LIDAR_LITE_V2=m CONFIG_MB1232=m @@ -8830,6 +8959,7 @@ CONFIG_MLX90614=m CONFIG_MLX90632=m CONFIG_TMP006=m CONFIG_TMP007=m +CONFIG_TMP117=m CONFIG_TSYS01=m CONFIG_TSYS02D=m CONFIG_MAX31856=m @@ -8873,7 +9003,6 @@ CONFIG_IPACK_BUS=m CONFIG_BOARD_TPCI200=m CONFIG_SERIAL_IPOCTAL=m CONFIG_RESET_CONTROLLER=y -CONFIG_RESET_BRCMSTB_RESCAL=y CONFIG_RESET_TI_SYSCON=m # @@ -8881,6 +9010,7 @@ CONFIG_RESET_TI_SYSCON=m # CONFIG_GENERIC_PHY=y CONFIG_USB_LGM_PHY=m +CONFIG_PHY_CAN_TRANSCEIVER=m CONFIG_BCM_KONA_USB2_PHY=m CONFIG_PHY_PXA_28NM_HSIC=m CONFIG_PHY_PXA_28NM_USB2=m @@ -9005,9 +9135,12 @@ CONFIG_SLIMBUS=m CONFIG_SLIM_QCOM_CTRL=m CONFIG_INTERCONNECT=y CONFIG_COUNTER=m +CONFIG_INTERRUPT_CNT=m +CONFIG_INTEL_QEP=m CONFIG_MOST=m CONFIG_MOST_USB_HDM=m CONFIG_MOST_CDEV=m +CONFIG_MOST_SND=m # end of Device Drivers # @@ -9117,6 +9250,8 @@ CONFIG_OVERLAY_FS_METACOPY=y # # Caches # +CONFIG_NETFS_SUPPORT=m +CONFIG_NETFS_STATS=y CONFIG_FSCACHE=m CONFIG_FSCACHE_STATS=y # CONFIG_FSCACHE_HISTOGRAM is not set @@ -9169,6 +9304,8 @@ CONFIG_TMPFS_XATTR=y CONFIG_TMPFS_INODE64=y CONFIG_HUGETLBFS=y CONFIG_HUGETLB_PAGE=y +CONFIG_HUGETLB_PAGE_FREE_VMEMMAP=y +# CONFIG_HUGETLB_PAGE_FREE_VMEMMAP_DEFAULT_ON is not set CONFIG_MEMFD_CREATE=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y CONFIG_CONFIGFS_FS=y @@ -9265,7 +9402,6 @@ CONFIG_EROFS_FS_XATTR=y CONFIG_EROFS_FS_POSIX_ACL=y CONFIG_EROFS_FS_SECURITY=y CONFIG_EROFS_FS_ZIP=y -CONFIG_EROFS_FS_CLUSTER_PAGE_LIMIT=2 CONFIG_VBOXSF_FS=m CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=m @@ -9303,7 +9439,7 @@ CONFIG_LOCKD=m CONFIG_LOCKD_V4=y CONFIG_NFS_ACL_SUPPORT=m CONFIG_NFS_COMMON=y -CONFIG_NFS_V4_2_SSC_HELPER=m +CONFIG_NFS_V4_2_SSC_HELPER=y CONFIG_SUNRPC=m CONFIG_SUNRPC_GSS=m CONFIG_SUNRPC_BACKCHANNEL=y @@ -9452,6 +9588,7 @@ CONFIG_SECURITY_LOCKDOWN_LSM=y CONFIG_LOCK_DOWN_KERNEL_FORCE_NONE=y # CONFIG_LOCK_DOWN_KERNEL_FORCE_INTEGRITY is not set # CONFIG_LOCK_DOWN_KERNEL_FORCE_CONFIDENTIALITY is not set +CONFIG_SECURITY_LANDLOCK=y # CONFIG_INTEGRITY is not set # CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set # CONFIG_DEFAULT_SECURITY_SELINUX is not set @@ -9459,7 +9596,7 @@ CONFIG_LOCK_DOWN_KERNEL_FORCE_NONE=y # CONFIG_DEFAULT_SECURITY_TOMOYO is not set # CONFIG_DEFAULT_SECURITY_APPARMOR is not set CONFIG_DEFAULT_SECURITY_DAC=y -CONFIG_LSM="lockdown,yama,bpf" +CONFIG_LSM="landlock,lockdown,yama,bpf" # # Kernel hardening options @@ -9534,6 +9671,7 @@ CONFIG_CRYPTO_RSA=y CONFIG_CRYPTO_DH=y CONFIG_CRYPTO_ECC=m CONFIG_CRYPTO_ECDH=m +CONFIG_CRYPTO_ECDSA=m CONFIG_CRYPTO_ECRDSA=m CONFIG_CRYPTO_SM2=m CONFIG_CRYPTO_CURVE25519=m @@ -9789,10 +9927,10 @@ CONFIG_842_COMPRESS=m CONFIG_842_DECOMPRESS=m CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y -CONFIG_LZO_COMPRESS=y +CONFIG_LZO_COMPRESS=m CONFIG_LZO_DECOMPRESS=y CONFIG_LZ4_COMPRESS=y -CONFIG_LZ4HC_COMPRESS=y +CONFIG_LZ4HC_COMPRESS=m CONFIG_LZ4_DECOMPRESS=y CONFIG_ZSTD_COMPRESS=y CONFIG_ZSTD_DECOMPRESS=y @@ -9890,10 +10028,10 @@ CONFIG_ARCH_STACKWALK=y CONFIG_SBITMAP=y CONFIG_PARMAN=m CONFIG_OBJAGG=m -# CONFIG_STRING_SELFTEST is not set # end of Library routines CONFIG_PLDMFW=y +CONFIG_ASN1_ENCODER=m # # Kernel hacking @@ -9904,6 +10042,7 @@ CONFIG_PLDMFW=y # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set +# CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=4 CONFIG_CONSOLE_LOGLEVEL_QUIET=1 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 @@ -9993,9 +10132,10 @@ CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y CONFIG_HAVE_ARCH_KFENCE=y CONFIG_KFENCE=y CONFIG_KFENCE_STATIC_KEYS=y -CONFIG_KFENCE_SAMPLE_INTERVAL=0 +CONFIG_KFENCE_SAMPLE_INTERVAL=100 CONFIG_KFENCE_NUM_OBJECTS=255 CONFIG_KFENCE_STRESS_TEST_FAULTS=0 +CONFIG_KFENCE_BUG_ON_DATA_CORRUPTION=y # end of Memory Debugging CONFIG_DEBUG_SHIRQ=y @@ -10080,7 +10220,6 @@ CONFIG_DEBUG_CREDENTIALS=y CONFIG_RCU_CPU_STALL_TIMEOUT=60 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set -# CONFIG_RCU_STRICT_GRACE_PERIOD is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set @@ -10115,12 +10254,15 @@ CONFIG_FUNCTION_GRAPH_TRACER=y CONFIG_DYNAMIC_FTRACE=y CONFIG_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y +CONFIG_DYNAMIC_FTRACE_WITH_ARGS=y CONFIG_FUNCTION_PROFILER=y CONFIG_STACK_TRACER=y # CONFIG_IRQSOFF_TRACER is not set # CONFIG_PREEMPT_TRACER is not set CONFIG_SCHED_TRACER=y CONFIG_HWLAT_TRACER=y +CONFIG_OSNOISE_TRACER=y +CONFIG_TIMERLAT_TRACER=y CONFIG_MMIOTRACE=y CONFIG_FTRACE_SYSCALLS=y CONFIG_TRACER_SNAPSHOT=y @@ -10195,9 +10337,9 @@ CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_LKDTM is not set -# CONFIG_TEST_LIST_SORT is not set # CONFIG_TEST_MIN_HEAP is not set # CONFIG_TEST_SORT is not set +# CONFIG_TEST_DIV64 is not set # CONFIG_KPROBES_SANITY_TEST is not set # CONFIG_BACKTRACE_SELF_TEST is not set # CONFIG_RBTREE_TEST is not set @@ -10207,10 +10349,12 @@ CONFIG_RUNTIME_TESTING_MENU=y CONFIG_ATOMIC64_SELFTEST=y CONFIG_ASYNC_RAID6_TEST=m # CONFIG_TEST_HEXDUMP is not set +# CONFIG_STRING_SELFTEST is not set # CONFIG_TEST_STRING_HELPERS is not set # CONFIG_TEST_STRSCPY is not set CONFIG_TEST_KSTRTOX=y # CONFIG_TEST_PRINTF is not set +# CONFIG_TEST_SCANF is not set # CONFIG_TEST_BITMAP is not set # CONFIG_TEST_UUID is not set # CONFIG_TEST_XARRAY is not set @@ -10239,6 +10383,8 @@ CONFIG_TEST_KSTRTOX=y # CONFIG_TEST_HMM is not set # CONFIG_TEST_FREE_PAGES is not set # CONFIG_TEST_FPU is not set +# CONFIG_TEST_CLOCKSOURCE_WATCHDOG is not set +CONFIG_ARCH_USE_MEMTEST=y # CONFIG_MEMTEST is not set # CONFIG_HYPERV_TESTING is not set # end of Kernel Testing and Coverage From 9754fd489449d9df05eeeecf6bff7bcd720a4b86 Mon Sep 17 00:00:00 2001 From: David P Date: Oct 13 2021 01:31:44 +0000 Subject: [PATCH 7/23] updpkg: libre/linux-libre-pae 5.14.11-1 Signed-off-by: David P --- diff --git a/libre/linux-libre-pae/0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch b/libre/linux-libre-pae/0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch index c5e5b05..46cfcfa 100644 --- a/libre/linux-libre-pae/0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch +++ b/libre/linux-libre-pae/0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch @@ -1,7 +1,7 @@ -From 90de407f12e8ed9cb361678882c2af236b06107e Mon Sep 17 00:00:00 2001 +From f76db6fc04fadf872a138740592b4e8ec9ba9149 Mon Sep 17 00:00:00 2001 From: "Jan Alexander Steffens (heftig)" Date: Mon, 16 Sep 2019 04:53:20 +0200 -Subject: [PATCH 1/2] ZEN: Add sysctl and CONFIG to disallow unprivileged +Subject: [PATCH 1/6] ZEN: Add sysctl and CONFIG to disallow unprivileged CLONE_NEWUSER Our default behavior continues to match the vanilla kernel. @@ -14,10 +14,10 @@ Our default behavior continues to match the vanilla kernel. 5 files changed, 53 insertions(+) diff --git a/include/linux/user_namespace.h b/include/linux/user_namespace.h -index bfa6463f8a95..27aa2bd5e50a 100644 +index eb70cabe6e7f..dda54e3bc47c 100644 --- a/include/linux/user_namespace.h +++ b/include/linux/user_namespace.h -@@ -116,6 +116,8 @@ void put_ucounts(struct ucounts *ucounts); +@@ -137,6 +137,8 @@ static inline void set_rlimit_ucount_max(struct user_namespace *ns, #ifdef CONFIG_USER_NS @@ -26,7 +26,7 @@ index bfa6463f8a95..27aa2bd5e50a 100644 static inline struct user_namespace *get_user_ns(struct user_namespace *ns) { if (ns) -@@ -149,6 +151,8 @@ extern bool current_in_userns(const struct user_namespace *target_ns); +@@ -170,6 +172,8 @@ extern bool current_in_userns(const struct user_namespace *target_ns); struct ns_common *ns_get_owner(struct ns_common *ns); #else @@ -36,10 +36,10 @@ index bfa6463f8a95..27aa2bd5e50a 100644 { return &init_user_ns; diff --git a/init/Kconfig b/init/Kconfig -index a61c92066c2e..6a2920f2e2ad 100644 +index 55f9f7738ebb..33c6a820ac08 100644 --- a/init/Kconfig +++ b/init/Kconfig -@@ -1195,6 +1195,22 @@ config USER_NS +@@ -1198,6 +1198,22 @@ config USER_NS If unsure, say N. @@ -63,7 +63,7 @@ index a61c92066c2e..6a2920f2e2ad 100644 bool "PID Namespaces" default y diff --git a/kernel/fork.c b/kernel/fork.c -index 567fee340500..f8ad32116152 100644 +index cbba21e3a58d..7267d46c29ea 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -98,6 +98,10 @@ @@ -77,7 +77,7 @@ index 567fee340500..f8ad32116152 100644 #include #include #include -@@ -1871,6 +1875,10 @@ static __latent_entropy struct task_struct *copy_process( +@@ -1877,6 +1881,10 @@ static __latent_entropy struct task_struct *copy_process( if ((clone_flags & (CLONE_NEWUSER|CLONE_FS)) == (CLONE_NEWUSER|CLONE_FS)) return ERR_PTR(-EINVAL); @@ -88,7 +88,7 @@ index 567fee340500..f8ad32116152 100644 /* * Thread groups must share signals as well, and detached threads * can only be started up within the thread group. -@@ -2973,6 +2981,12 @@ int ksys_unshare(unsigned long unshare_flags) +@@ -2981,6 +2989,12 @@ int ksys_unshare(unsigned long unshare_flags) if (unshare_flags & CLONE_NEWNS) unshare_flags |= CLONE_FS; @@ -102,10 +102,10 @@ index 567fee340500..f8ad32116152 100644 if (err) goto bad_unshare_out; diff --git a/kernel/sysctl.c b/kernel/sysctl.c -index d4a78e08f6d8..0260dfe2daff 100644 +index 272f4a272f8c..760e8a2d815d 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c -@@ -103,6 +103,9 @@ +@@ -105,6 +105,9 @@ #ifdef CONFIG_LOCKUP_DETECTOR #include #endif @@ -115,7 +115,7 @@ index d4a78e08f6d8..0260dfe2daff 100644 #if defined(CONFIG_SYSCTL) -@@ -1896,6 +1899,15 @@ static struct ctl_table kern_table[] = { +@@ -1908,6 +1911,15 @@ static struct ctl_table kern_table[] = { .proc_handler = proc_dointvec, }, #endif @@ -132,7 +132,7 @@ index d4a78e08f6d8..0260dfe2daff 100644 { .procname = "tainted", diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c -index 27670ab7a4ed..300c72d2a381 100644 +index ef82d401dde8..5a6c2e07174b 100644 --- a/kernel/user_namespace.c +++ b/kernel/user_namespace.c @@ -21,6 +21,13 @@ @@ -150,5 +150,5 @@ index 27670ab7a4ed..300c72d2a381 100644 static DEFINE_MUTEX(userns_state_mutex); -- -2.32.0 +2.33.0 diff --git a/libre/linux-libre-pae/0002-Bluetooth-btusb-Add-support-for-IMC-Networks-Mediate.patch b/libre/linux-libre-pae/0002-Bluetooth-btusb-Add-support-for-IMC-Networks-Mediate.patch new file mode 100644 index 0000000..09a894e --- /dev/null +++ b/libre/linux-libre-pae/0002-Bluetooth-btusb-Add-support-for-IMC-Networks-Mediate.patch @@ -0,0 +1,79 @@ +From 810821eb3b1894f2cfcc29cffd42d193b8fe54a6 Mon Sep 17 00:00:00 2001 +From: Wai Paulo Valerio Wang +Date: Thu, 8 Jul 2021 04:00:59 +0800 +Subject: [PATCH 2/6] Bluetooth: btusb: Add support for IMC Networks Mediatek + Chip + +This add supports for IMC Networks Wireless_Device Media Chip +which contains the MT7921 chipset. + +$ lsusb + +Bus 001 Device 004: ID 13d3:3563 IMC Networks Wireless_Device + +$ cat /sys/kernel/debug/usb/devices + +T: Bus=01 Lev=01 Prnt=01 Port=03 Cnt=03 Dev#= 4 Spd=480 MxCh= 0 +D: Ver= 2.10 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs= 1 +P: Vendor=13d3 ProdID=3563 Rev= 1.00 +S: Manufacturer=MediaTek Inc. +S: Product=Wireless_Device +S: SerialNumber=000000000 +C:* #Ifs= 3 Cfg#= 1 Atr=e0 MxPwr=100mA +A: FirstIf#= 0 IfCount= 3 Cls=e0(wlcon) Sub=01 Prot=01 +I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=125us +E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms +E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms +I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms +I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms +I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms +I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms +I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms +I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms +I: If#= 1 Alt= 6 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 63 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 63 Ivl=1ms +I:* If#= 2 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none) +E: Ad=8a(I) Atr=03(Int.) MxPS= 64 Ivl=125us +E: Ad=0a(O) Atr=03(Int.) MxPS= 64 Ivl=125us +I: If#= 2 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none) +E: Ad=8a(I) Atr=03(Int.) MxPS= 512 Ivl=125us +E: Ad=0a(O) Atr=03(Int.) MxPS= 512 Ivl=125us + +Signed-off-by: Wai Paulo Valerio Wang +Signed-off-by: Marcel Holtmann +For: https://bugs.archlinux.org/task/72138 +--- + drivers/bluetooth/btusb.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c +index bd37d6fb88c2..e13a510e1698 100644 +--- a/drivers/bluetooth/btusb.c ++++ b/drivers/bluetooth/btusb.c +@@ -414,6 +414,9 @@ static const struct usb_device_id blacklist_table[] = { + { USB_DEVICE(0x04ca, 0x3802), .driver_info = BTUSB_MEDIATEK | + BTUSB_WIDEBAND_SPEECH | + BTUSB_VALID_LE_STATES }, ++ { USB_DEVICE(0x13d3, 0x3563), .driver_info = BTUSB_MEDIATEK | ++ BTUSB_WIDEBAND_SPEECH | ++ BTUSB_VALID_LE_STATES }, + + /* Additional Realtek 8723AE Bluetooth devices */ + { USB_DEVICE(0x0930, 0x021d), .driver_info = BTUSB_REALTEK }, +-- +2.33.0 + diff --git a/libre/linux-libre-pae/0002-Bluetooth-btusb-check-conditions-before-enabling-USB.patch b/libre/linux-libre-pae/0002-Bluetooth-btusb-check-conditions-before-enabling-USB.patch deleted file mode 100644 index 574623c..0000000 --- a/libre/linux-libre-pae/0002-Bluetooth-btusb-check-conditions-before-enabling-USB.patch +++ /dev/null @@ -1,85 +0,0 @@ -From bdb12383a58d6989a0b1c2f925890948146bbc90 Mon Sep 17 00:00:00 2001 -From: Pauli Virtanen -Date: Mon, 26 Jul 2021 21:02:06 +0300 -Subject: [PATCH 2/2] Bluetooth: btusb: check conditions before enabling USB - ALT 3 for WBS -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Some USB BT adapters don't satisfy the MTU requirement mentioned in -commit e848dbd364ac ("Bluetooth: btusb: Add support USB ALT 3 for WBS") -and have ALT 3 setting that produces no/garbled audio. Some adapters -with larger MTU were also reported to have problems with ALT 3. - -Add a flag and check it and MTU before selecting ALT 3, falling back to -ALT 1. Enable the flag for Realtek, restoring the previous behavior for -non-Realtek devices. - -Tested with USB adapters (mtu<72, no/garbled sound with ALT3, ALT1 -works) BCM20702A1 0b05:17cb, CSR8510A10 0a12:0001, and (mtu>=72, ALT3 -works) RTL8761BU 0bda:8771, Intel AX200 8087:0029 (after disabling -ALT6). Also got reports for (mtu>=72, ALT 3 reported to produce bad -audio) Intel 8087:0a2b. - -Signed-off-by: Pauli Virtanen -Fixes: e848dbd364ac ("Bluetooth: btusb: Add support USB ALT 3 for WBS") -Tested-by: Michał Kępień - -Fixes: https://bugs.archlinux.org/task/71567 ---- - drivers/bluetooth/btusb.c | 22 ++++++++++++++-------- - 1 file changed, 14 insertions(+), 8 deletions(-) - -diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c -index 6d23308119d1..e8062d0b7d4d 100644 ---- a/drivers/bluetooth/btusb.c -+++ b/drivers/bluetooth/btusb.c -@@ -516,6 +516,7 @@ static const struct dmi_system_id btusb_needs_reset_resume_table[] = { - #define BTUSB_HW_RESET_ACTIVE 12 - #define BTUSB_TX_WAIT_VND_EVT 13 - #define BTUSB_WAKEUP_DISABLE 14 -+#define BTUSB_USE_ALT3_FOR_WBS 15 - - struct btusb_data { - struct hci_dev *hdev; -@@ -1748,16 +1749,20 @@ static void btusb_work(struct work_struct *work) - /* Bluetooth USB spec recommends alt 6 (63 bytes), but - * many adapters do not support it. Alt 1 appears to - * work for all adapters that do not have alt 6, and -- * which work with WBS at all. -+ * which work with WBS at all. Some devices prefer -+ * alt 3 (HCI payload >= 60 Bytes let air packet -+ * data satisfy 60 bytes), requiring -+ * MTU >= 3 (packets) * 25 (size) - 3 (headers) = 72 -+ * see also Core spec 5, vol 4, B 2.1.1 & Table 2.1. - */ -- new_alts = btusb_find_altsetting(data, 6) ? 6 : 1; -- /* Because mSBC frames do not need to be aligned to the -- * SCO packet boundary. If support the Alt 3, use the -- * Alt 3 for HCI payload >= 60 Bytes let air packet -- * data satisfy 60 bytes. -- */ -- if (new_alts == 1 && btusb_find_altsetting(data, 3)) -+ if (btusb_find_altsetting(data, 6)) -+ new_alts = 6; -+ else if (test_bit(BTUSB_USE_ALT3_FOR_WBS, &data->flags) && -+ hdev->sco_mtu >= 72 && -+ btusb_find_altsetting(data, 3)) - new_alts = 3; -+ else -+ new_alts = 1; - } - - if (btusb_switch_alt_setting(hdev, new_alts) < 0) -@@ -4733,6 +4738,7 @@ static int btusb_probe(struct usb_interface *intf, - * (DEVICE_REMOTE_WAKEUP) - */ - set_bit(BTUSB_WAKEUP_DISABLE, &data->flags); -+ set_bit(BTUSB_USE_ALT3_FOR_WBS, &data->flags); - } - - if (!reset) --- -2.32.0 - diff --git a/libre/linux-libre-pae/0003-Bluetooth-btusb-Add-support-for-Foxconn-Mediatek-Chi.patch b/libre/linux-libre-pae/0003-Bluetooth-btusb-Add-support-for-Foxconn-Mediatek-Chi.patch new file mode 100644 index 0000000..4af5a53 --- /dev/null +++ b/libre/linux-libre-pae/0003-Bluetooth-btusb-Add-support-for-Foxconn-Mediatek-Chi.patch @@ -0,0 +1,71 @@ +From 38c2ca84b97f9d6021c2607e214f99acd84dac2d Mon Sep 17 00:00:00 2001 +From: Aaron Ma +Date: Fri, 23 Jul 2021 01:17:18 +0800 +Subject: [PATCH 3/6] Bluetooth: btusb: Add support for Foxconn Mediatek Chip + +Add support for another Foxconn / Hon Hai device with MT7921 chip. + +T: Bus=05 Lev=01 Prnt=01 Port=03 Cnt=02 Dev#= 3 Spd=480 MxCh= 0 +D: Ver= 2.10 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs= 1 +P: Vendor=0489 ProdID=e0cd Rev= 1.00 +S: Manufacturer=MediaTek Inc. +S: Product=Wireless_Device +S: SerialNumber=000000000 +C:* #Ifs= 3 Cfg#= 1 Atr=e0 MxPwr=100mA +A: FirstIf#= 0 IfCount= 3 Cls=e0(wlcon) Sub=01 Prot=01 +I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=125us +E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms +E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms +I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms +I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms +I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms +I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms +I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms +I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms +I: If#= 1 Alt= 6 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb +E: Ad=83(I) Atr=01(Isoc) MxPS= 63 Ivl=1ms +E: Ad=03(O) Atr=01(Isoc) MxPS= 63 Ivl=1ms +I:* If#= 2 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none) +E: Ad=8a(I) Atr=03(Int.) MxPS= 64 Ivl=125us +E: Ad=0a(O) Atr=03(Int.) MxPS= 64 Ivl=125us +I: If#= 2 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none) +E: Ad=8a(I) Atr=03(Int.) MxPS= 512 Ivl=125us +E: Ad=0a(O) Atr=03(Int.) MxPS= 512 Ivl=125us + +Signed-off-by: Aaron Ma +Signed-off-by: Marcel Holtmann +For: https://bugs.archlinux.org/task/72138 +--- + drivers/bluetooth/btusb.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c +index e13a510e1698..aac732cc9612 100644 +--- a/drivers/bluetooth/btusb.c ++++ b/drivers/bluetooth/btusb.c +@@ -417,6 +417,9 @@ static const struct usb_device_id blacklist_table[] = { + { USB_DEVICE(0x13d3, 0x3563), .driver_info = BTUSB_MEDIATEK | + BTUSB_WIDEBAND_SPEECH | + BTUSB_VALID_LE_STATES }, ++ { USB_DEVICE(0x0489, 0xe0cd), .driver_info = BTUSB_MEDIATEK | ++ BTUSB_WIDEBAND_SPEECH | ++ BTUSB_VALID_LE_STATES }, + + /* Additional Realtek 8723AE Bluetooth devices */ + { USB_DEVICE(0x0930, 0x021d), .driver_info = BTUSB_REALTEK }, +-- +2.33.0 + diff --git a/libre/linux-libre-pae/0004-ALSA-pcm-Check-mmap-capability-of-runtime-dma-buffer.patch b/libre/linux-libre-pae/0004-ALSA-pcm-Check-mmap-capability-of-runtime-dma-buffer.patch new file mode 100644 index 0000000..64b8717 --- /dev/null +++ b/libre/linux-libre-pae/0004-ALSA-pcm-Check-mmap-capability-of-runtime-dma-buffer.patch @@ -0,0 +1,64 @@ +From ab60c2d0242fc428a436c25c1144f6acd9d6f419 Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Mon, 9 Aug 2021 09:18:27 +0200 +Subject: [PATCH 4/6] ALSA: pcm: Check mmap capability of runtime dma buffer at + first + +Currently we check only the substream->dma_buffer as the preset of the +buffer configuration for verifying the availability of mmap. But a +few drivers rather set up the buffer in the own way without the +standard buffer preallocation using substream->dma_buffer, and they +miss the proper checks. (Now it's working more or less fine as most +of them are running only on x86). + +Actually, they may set up the runtime dma_buffer (referred via +snd_pcm_get_dma_buf()) at the open callback, though. That is, this +could have been used as the primary source. + +This patch changes the hw_support_mmap() function to check the runtime +dma buffer at first. It's usually NULL with the standard buffer +preallocation, and in that case, we continue checking +substream->dma_buffer as fallback. + +Signed-off-by: Takashi Iwai +Fixes: https://bugs.archlinux.org/task/72059 +--- + sound/core/pcm_native.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c +index 71323d807dbf..dc9fa312fadd 100644 +--- a/sound/core/pcm_native.c ++++ b/sound/core/pcm_native.c +@@ -243,13 +243,18 @@ int snd_pcm_info_user(struct snd_pcm_substream *substream, + + static bool hw_support_mmap(struct snd_pcm_substream *substream) + { ++ struct snd_dma_buffer *dmabuf; ++ + if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP)) + return false; + + if (substream->ops->mmap || substream->ops->page) + return true; + +- switch (substream->dma_buffer.dev.type) { ++ dmabuf = snd_pcm_get_dma_buf(substream); ++ if (!dmabuf) ++ dmabuf = &substream->dma_buffer; ++ switch (dmabuf->dev.type) { + case SNDRV_DMA_TYPE_UNKNOWN: + /* we can't know the device, so just assume that the driver does + * everything right +@@ -259,7 +264,7 @@ static bool hw_support_mmap(struct snd_pcm_substream *substream) + case SNDRV_DMA_TYPE_VMALLOC: + return true; + default: +- return dma_can_mmap(substream->dma_buffer.dev.dev); ++ return dma_can_mmap(dmabuf->dev.dev); + } + } + +-- +2.33.0 + diff --git a/libre/linux-libre-pae/0005-ALSA-pci-rme-Set-up-buffer-type-properly.patch b/libre/linux-libre-pae/0005-ALSA-pci-rme-Set-up-buffer-type-properly.patch new file mode 100644 index 0000000..f1d7db9 --- /dev/null +++ b/libre/linux-libre-pae/0005-ALSA-pci-rme-Set-up-buffer-type-properly.patch @@ -0,0 +1,75 @@ +From 7b0c23ec626e579ffa7ef239cac20dc7fa1797e9 Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Mon, 9 Aug 2021 09:18:28 +0200 +Subject: [PATCH 5/6] ALSA: pci: rme: Set up buffer type properly + +Although the regression of the mmap was fixed in the recent commit +dc0dc8a73e8e ("ALSA: pcm: Fix mmap breakage without explicit buffer +setup"), RME9652 and HDSP drivers have still potential issues with +their mmap handling. Namely, they use the default mmap handler +without the standard buffer preallocation, and PCM core wouldn't use +the coherent DMA mapping. It's practically OK on x86, but on some +exotic architectures, it wouldn't work. + +This patch addresses the potential breakage by replacing the buffer +setup with the proper macro. It also simplifies the source code, +too. + +Signed-off-by: Takashi Iwai +Fixes: https://bugs.archlinux.org/task/72059 +--- + sound/pci/rme9652/hdsp.c | 6 ++---- + sound/pci/rme9652/rme9652.c | 6 ++---- + 2 files changed, 4 insertions(+), 8 deletions(-) + +diff --git a/sound/pci/rme9652/hdsp.c b/sound/pci/rme9652/hdsp.c +index 8457a4bbc3df..22b8b3357918 100644 +--- a/sound/pci/rme9652/hdsp.c ++++ b/sound/pci/rme9652/hdsp.c +@@ -4518,8 +4518,7 @@ static int snd_hdsp_playback_open(struct snd_pcm_substream *substream) + snd_pcm_set_sync(substream); + + runtime->hw = snd_hdsp_playback_subinfo; +- runtime->dma_area = hdsp->playback_buffer; +- runtime->dma_bytes = HDSP_DMA_AREA_BYTES; ++ snd_pcm_set_runtime_buffer(substream, &hdsp->playback_dma_buf); + + hdsp->playback_pid = current->pid; + hdsp->playback_substream = substream; +@@ -4595,8 +4594,7 @@ static int snd_hdsp_capture_open(struct snd_pcm_substream *substream) + snd_pcm_set_sync(substream); + + runtime->hw = snd_hdsp_capture_subinfo; +- runtime->dma_area = hdsp->capture_buffer; +- runtime->dma_bytes = HDSP_DMA_AREA_BYTES; ++ snd_pcm_set_runtime_buffer(substream, &hdsp->capture_dma_buf); + + hdsp->capture_pid = current->pid; + hdsp->capture_substream = substream; +diff --git a/sound/pci/rme9652/rme9652.c b/sound/pci/rme9652/rme9652.c +index f1aad38760d6..9ad2533925c4 100644 +--- a/sound/pci/rme9652/rme9652.c ++++ b/sound/pci/rme9652/rme9652.c +@@ -2279,8 +2279,7 @@ static int snd_rme9652_playback_open(struct snd_pcm_substream *substream) + snd_pcm_set_sync(substream); + + runtime->hw = snd_rme9652_playback_subinfo; +- runtime->dma_area = rme9652->playback_buffer; +- runtime->dma_bytes = RME9652_DMA_AREA_BYTES; ++ snd_pcm_set_runtime_buffer(substream, &rme9652->playback_dma_buf); + + if (rme9652->capture_substream == NULL) { + rme9652_stop(rme9652); +@@ -2339,8 +2338,7 @@ static int snd_rme9652_capture_open(struct snd_pcm_substream *substream) + snd_pcm_set_sync(substream); + + runtime->hw = snd_rme9652_capture_subinfo; +- runtime->dma_area = rme9652->capture_buffer; +- runtime->dma_bytes = RME9652_DMA_AREA_BYTES; ++ snd_pcm_set_runtime_buffer(substream, &rme9652->capture_dma_buf); + + if (rme9652->playback_substream == NULL) { + rme9652_stop(rme9652); +-- +2.33.0 + diff --git a/libre/linux-libre-pae/0006-ALSA-pci-cs46xx-Fix-set-up-buffer-type-properly.patch b/libre/linux-libre-pae/0006-ALSA-pci-cs46xx-Fix-set-up-buffer-type-properly.patch new file mode 100644 index 0000000..0305e70 --- /dev/null +++ b/libre/linux-libre-pae/0006-ALSA-pci-cs46xx-Fix-set-up-buffer-type-properly.patch @@ -0,0 +1,95 @@ +From b5ed7b38f5551c5dfca87ab29d679f3d6d327557 Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Mon, 9 Aug 2021 09:18:29 +0200 +Subject: [PATCH 6/6] ALSA: pci: cs46xx: Fix set up buffer type properly + +CS46xx driver switches the buffer depending on the number of periods, +and in some cases it switches to the own buffer without updating the +buffer type properly. This may cause a problem with the mmap on +exotic architectures that require the own mmap call for the coherent +DMA buffer. + +This patch addresses the potential breakage by replacing the buffer +setup with the proper macro. It also simplifies the source code, +too. + +Signed-off-by: Takashi Iwai +Fixes: https://bugs.archlinux.org/task/72059 +--- + sound/pci/cs46xx/cs46xx_lib.c | 30 ++++++++---------------------- + 1 file changed, 8 insertions(+), 22 deletions(-) + +diff --git a/sound/pci/cs46xx/cs46xx_lib.c b/sound/pci/cs46xx/cs46xx_lib.c +index 1e1eb17f8e07..d43927dcd61e 100644 +--- a/sound/pci/cs46xx/cs46xx_lib.c ++++ b/sound/pci/cs46xx/cs46xx_lib.c +@@ -1121,9 +1121,7 @@ static int snd_cs46xx_playback_hw_params(struct snd_pcm_substream *substream, + if (params_periods(hw_params) == CS46XX_FRAGS) { + if (runtime->dma_area != cpcm->hw_buf.area) + snd_pcm_lib_free_pages(substream); +- runtime->dma_area = cpcm->hw_buf.area; +- runtime->dma_addr = cpcm->hw_buf.addr; +- runtime->dma_bytes = cpcm->hw_buf.bytes; ++ snd_pcm_set_runtime_buffer(substream, &cpcm->hw_buf); + + + #ifdef CONFIG_SND_CS46XX_NEW_DSP +@@ -1143,11 +1141,8 @@ static int snd_cs46xx_playback_hw_params(struct snd_pcm_substream *substream, + #endif + + } else { +- if (runtime->dma_area == cpcm->hw_buf.area) { +- runtime->dma_area = NULL; +- runtime->dma_addr = 0; +- runtime->dma_bytes = 0; +- } ++ if (runtime->dma_area == cpcm->hw_buf.area) ++ snd_pcm_set_runtime_buffer(substream, NULL); + err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params)); + if (err < 0) { + #ifdef CONFIG_SND_CS46XX_NEW_DSP +@@ -1196,9 +1191,7 @@ static int snd_cs46xx_playback_hw_free(struct snd_pcm_substream *substream) + if (runtime->dma_area != cpcm->hw_buf.area) + snd_pcm_lib_free_pages(substream); + +- runtime->dma_area = NULL; +- runtime->dma_addr = 0; +- runtime->dma_bytes = 0; ++ snd_pcm_set_runtime_buffer(substream, NULL); + + return 0; + } +@@ -1287,16 +1280,11 @@ static int snd_cs46xx_capture_hw_params(struct snd_pcm_substream *substream, + if (runtime->periods == CS46XX_FRAGS) { + if (runtime->dma_area != chip->capt.hw_buf.area) + snd_pcm_lib_free_pages(substream); +- runtime->dma_area = chip->capt.hw_buf.area; +- runtime->dma_addr = chip->capt.hw_buf.addr; +- runtime->dma_bytes = chip->capt.hw_buf.bytes; ++ snd_pcm_set_runtime_buffer(substream, &chip->capt.hw_buf); + substream->ops = &snd_cs46xx_capture_ops; + } else { +- if (runtime->dma_area == chip->capt.hw_buf.area) { +- runtime->dma_area = NULL; +- runtime->dma_addr = 0; +- runtime->dma_bytes = 0; +- } ++ if (runtime->dma_area == chip->capt.hw_buf.area) ++ snd_pcm_set_runtime_buffer(substream, NULL); + err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params)); + if (err < 0) + return err; +@@ -1313,9 +1301,7 @@ static int snd_cs46xx_capture_hw_free(struct snd_pcm_substream *substream) + + if (runtime->dma_area != chip->capt.hw_buf.area) + snd_pcm_lib_free_pages(substream); +- runtime->dma_area = NULL; +- runtime->dma_addr = 0; +- runtime->dma_bytes = 0; ++ snd_pcm_set_runtime_buffer(substream, NULL); + + return 0; + } +-- +2.33.0 + diff --git a/libre/linux-libre-pae/PKGBUILD b/libre/linux-libre-pae/PKGBUILD index 912bfad..42e4b06 100644 --- a/libre/linux-libre-pae/PKGBUILD +++ b/libre/linux-libre-pae/PKGBUILD @@ -9,7 +9,7 @@ _replacesoldkernels=() # '%' gets replaced with kernel suffix _replacesoldmodules=() # '%' gets replaced with kernel suffix pkgbase=linux-libre-pae -pkgver=5.13.9 +pkgver=5.14.11 pkgrel=1 pkgdesc='Linux-libre PAE (physical address extension)' url='https://linux-libre.fsfla.org/' @@ -20,7 +20,7 @@ makedepends=( xmlto python-sphinx python-sphinx_rtd_theme graphviz imagemagick ) options=('!strip') -_srcname=linux-5.13 +_srcname=linux-5.14 source=( "https://linux-libre.fsfla.org/pub/linux-libre/releases/${_srcname##*-}-gnu/linux-libre-${_srcname##*-}-gnu.tar.xz"{,.sign} "https://linux-libre.fsfla.org/pub/linux-libre/releases/$pkgver-gnu/patch-${_srcname##*-}-gnu-$pkgver-gnu.xz"{,.sign} @@ -36,15 +36,19 @@ source=( 0002-fix-Atmel-maXTouch-touchscreen-support.patch # Arch Linux patches 0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch - 0002-Bluetooth-btusb-check-conditions-before-enabling-USB.patch + 0002-Bluetooth-btusb-Add-support-for-IMC-Networks-Mediate.patch + 0003-Bluetooth-btusb-Add-support-for-Foxconn-Mediatek-Chi.patch + 0004-ALSA-pcm-Check-mmap-capability-of-runtime-dma-buffer.patch + 0005-ALSA-pci-rme-Set-up-buffer-type-properly.patch + 0006-ALSA-pci-cs46xx-Fix-set-up-buffer-type-properly.patch ) validpgpkeys=( '474402C8C582DAFBE389C427BCB7CF877E7D47A7' # Alexandre Oliva '6DB9C4B4F0D8C0DC432CF6E4227CA7C556B2BA78' # David P. ) -sha512sums=('a24f2db9316297127447b3d7fd7a1e9e7b9a8bdb5e59e6e341568cbf877c4b65d2ccdb27ec1c23b07af6c365b2930b040bcef0d989202b503bc55b107c04d121' +sha512sums=('18798d032184ce141216ad72fcbb5ddb340809fe8d953acb50700aa0b47d36fca104dcedc7521fb3aea913d8fbeb4bd3eab1cf2c955388e6996c4154eac67d0c' 'SKIP' - '8f1b7cb25e22f241567f3b78c66a2203d6c3746e464be7f7ddfcc42198fb41f7a4a179820ca2aa751c53098652b14789c204d9057bdfe6b6927dec68c1d26eec' + '951cdb68af3bbf3b841376f82fd9c82dfd7a159cae8564e5d772f99f3170deafcabc00cb0ecfa6e7669c22087577f2eafa47d3b50bc8ea6ee5edbc65821986e1' 'SKIP' '13cb5bc42542e7b8bb104d5f68253f6609e463b6799800418af33eb0272cc269aaa36163c3e6f0aacbdaaa1d05e2827a4a7c4a08a029238439ed08b89c564bb3' 'SKIP' @@ -52,11 +56,15 @@ sha512sums=('a24f2db9316297127447b3d7fd7a1e9e7b9a8bdb5e59e6e341568cbf877c4b65d2c 'SKIP' '267295aa0cea65684968420c68b32f1a66a22d018b9d2b2c1ef14267bcf4cb68aaf7099d073cbfefe6c25c8608bdcbbd45f7ac8893fdcecbf1e621abdfe9ecc1' 'SKIP' - '2f35c40ecff2de26048122dac3b60639012a8aaaa887f2de20c4865c6607e6f8caad540bfcec21cb3d7f38cdba94c975f0867a13b69116723ce6683403ccea32' + '176fe512658e8a958214225c7873aa1df597c5d69c515ab20f7495fa922b2b3e9b6715be96d5b7eb2438476db4a70992e4caa946b0f85401923ab402d6e41c63' '02af4dd2a007e41db0c63822c8ab3b80b5d25646af1906dc85d0ad9bb8bbf5236f8e381d7f91cf99ed4b0978c50aee37cb9567cdeef65b7ec3d91b882852b1af' 'b8fe56e14006ab866970ddbd501c054ae37186ddc065bb869cf7d18db8c0d455118d5bda3255fb66a0dde38b544655cfe9040ffe46e41d19830b47959b2fb168' - 'fac53c8ce68e9f56c8930a9392c89377c909f6a43a318010194949def91a104f34f46c2b32457e571435a8b326c47a48737ceb6255644bb6d42c59b27b07449a' - '722d92b750f0a5af39b850c18ff0c57dac0165e3c0219415843ec5207945971448790fec3fca570b62c8726c89b0ca6b7a5b16fd503e4581b3a63b3adfcf2c50') + 'dba36283b9ea3db5fcc9a72051a8e9cf4d409ec59769e6da9db4d321b72972242670210ad961a37f62aba68f7262e9f2f6308cfe62cda9fa050c72363a0c404a' + '693ac0e0e32cd0ab6c485deb43d6408dc9fc31234e4113206cf901a302eddf1a965f97f82ed7186f6426c085176ce95c48e116e9824d92bfd1f6656447da18dc' + 'c4a19ccec8b7636f1b5b1cf8e135e46d3aa4d233af4a1e72c2aaa83536505013f0c83602fe05ce08212b4327bebfb4f8a84b57c0d81509f0b48df5dfcc334254' + '4d81c2995e7cc5fc36929eb5bf9cc68ec02cb24147f18a88da79facd3e25182b156ca4430bf2765ff1e4c6be237d3a3e527498cd49d75217a5e16b62a478be6d' + '12c0da7fbd4e4e6ffc473ecd6dffee1dd61c201dad854347400c8f551adc35c033d6fa623cc5c1b2fe7930cdab868a8c99c6874ee171c9143e0f370398759c96' + '7f6fd402d8c29ee4f6c98ed2236318ab3f57f3dd47a92911e1b556df251b67fc83f7256223f06d1fefa849a3ceb5e40d247d2d5664ddd7cd9749bab4bc1ecb36') _replacesarchkernel=("${_replacesarchkernel[@]/\%/${pkgbase#linux-libre}}") _replacesoldkernels=("${_replacesoldkernels[@]/\%/${pkgbase#linux-libre}}") @@ -95,6 +103,7 @@ prepare() { echo "Setting config..." cp ../config .config make olddefconfig + diff -u ../config .config || : make -s kernelrelease > version echo "Prepared $pkgbase version $( Date: Oct 13 2021 21:08:45 +0000 Subject: [PATCH 8/23] updpkg: libre/linux-libre-pck 5.14.11.pck2-1 Signed-off-by: David P --- diff --git a/libre/linux-libre-pck/PKGBUILD b/libre/linux-libre-pck/PKGBUILD index a57cfca..ed91294 100644 --- a/libre/linux-libre-pck/PKGBUILD +++ b/libre/linux-libre-pck/PKGBUILD @@ -13,7 +13,7 @@ _replacesoldkernels=() _replacesoldmodules=() pkgbase=linux-libre-pck -pkgver=5.13.9.pck1 +pkgver=5.14.11.pck2 pkgrel=1 pkgdesc='Linux-libre PCK' url='https://wiki.parabola.nu/PCK' @@ -21,10 +21,10 @@ arch=(i686 x86_64 armv7h) license=(GPL2) makedepends=( bc kmod libelf pahole cpio perl tar xz -# xmlto python-sphinx python-sphinx_rtd_theme graphviz imagemagick + xmlto python-sphinx python-sphinx_rtd_theme graphviz imagemagick ) options=('!strip') -_srcname=linux-5.13 +_srcname=linux-5.14 source=( "https://linux-libre.fsfla.org/pub/linux-libre/releases/${_srcname##*-}-gnu/linux-libre-${_srcname##*-}-gnu.tar.xz"{,.sign} "https://linux-libre.fsfla.org/pub/linux-libre/releases/${pkgver%.*}-gnu/patch-${_srcname##*-}-gnu-${pkgver%.*}-gnu.xz"{,.sign} @@ -36,14 +36,14 @@ validpgpkeys=( '474402C8C582DAFBE389C427BCB7CF877E7D47A7' # Alexandre Oliva '6DB9C4B4F0D8C0DC432CF6E4227CA7C556B2BA78' # David P. ) -sha512sums=('a24f2db9316297127447b3d7fd7a1e9e7b9a8bdb5e59e6e341568cbf877c4b65d2ccdb27ec1c23b07af6c365b2930b040bcef0d989202b503bc55b107c04d121' +sha512sums=('18798d032184ce141216ad72fcbb5ddb340809fe8d953acb50700aa0b47d36fca104dcedc7521fb3aea913d8fbeb4bd3eab1cf2c955388e6996c4154eac67d0c' 'SKIP' - '8f1b7cb25e22f241567f3b78c66a2203d6c3746e464be7f7ddfcc42198fb41f7a4a179820ca2aa751c53098652b14789c204d9057bdfe6b6927dec68c1d26eec' + '951cdb68af3bbf3b841376f82fd9c82dfd7a159cae8564e5d772f99f3170deafcabc00cb0ecfa6e7669c22087577f2eafa47d3b50bc8ea6ee5edbc65821986e1' 'SKIP' - '07173b3bf2f0bd9b11f803d0946ce42f981c7f4ec57078efc349386d5dda8c0db37692ffeccb1d2dbb7fe6e243645baafd57c547c1dd0386e4becf257df8510e' + 'a2ea7c7d8cb863d9e9d41f3cb3cab26f2f86940ee0dacd2fc56689304fe309d0f6b7ed8d4ddf5e4ec05445c3ad4a5fff03e33f9e82a32f4bad338af3168947aa' 'SKIP' - '1e7c176717e3295ce96c7b4d5d8f9efe28a3fd51095368d4ca985661f0b8ae38d92312598b14a1b37ffb29d97a5fe09b9ee75db3f461e4af3b7b5ff8913030cb' - 'd92eb8d42a3d87c6ced2ef54536141f55ebe5a101d71f7a90b853fe890954388a5460917d2f1c51c73208a8e727c3c1c203525b83554f67d8512e533ba25f832' + '443f93a4086bbfe096be06ad084185c0c9ec9ba7913969ffeb426f75052fa6a5fb28d3f61f39f0086720633bc33ffd6f4985d1db53395e0bd43309469cd0ae64' + 'e5fd36b0ae7b91d0d9590ddcf1dbcd23c0fe772366a6088fb35c09cfd85486913edb65c45a42c1a590cc144c5d092b5925d824146837f42ba326f8b3fefeec7e' '6728253ca04a603ef35ceb06b284c509d8ffda6a8c6403fe687afe5d956425588ebbd62bfc5dd1d7fd9a03071a30c7cd86ac72a1fd67cbbf1ebdac85ee703caf' '53103bf55b957b657039510527df0df01279dec59cda115a4d6454e4135025d4546167fa30bdc99107f232561c1e096d8328609ab5a876cf7017176f92ad3e0b') @@ -85,6 +85,7 @@ prepare() { echo "Setting config..." cp ../config.$CARCH .config make olddefconfig + diff -u ../config .config || : make -s kernelrelease > version echo "Prepared $pkgbase version $( Date: Oct 13 2021 23:08:33 +0000 Subject: [PATCH 9/23] updpkg: libre/arm-linux-gnueabi-binutils 2.37-1 Signed-off-by: David P --- diff --git a/libre/arm-linux-gnueabi-binutils/PKGBUILD b/libre/arm-linux-gnueabi-binutils/PKGBUILD index ff4ff4c..145ee20 100644 --- a/libre/arm-linux-gnueabi-binutils/PKGBUILD +++ b/libre/arm-linux-gnueabi-binutils/PKGBUILD @@ -2,7 +2,7 @@ _target=arm-linux-gnueabi pkgname=$_target-binutils -pkgver=2.36.1 +pkgver=2.37 pkgrel=1 pkgdesc='A set of programs to assemble and manipulate binary and object files for the ARM GNU EABI little-endian target' arch=('x86_64' 'i686' 'armv7h') @@ -10,7 +10,7 @@ url='https://www.gnu.org/software/binutils/' license=(GPL) depends=(zlib) source=(https://ftp.gnu.org/gnu/binutils/binutils-$pkgver.tar.bz2{,.sig}) -sha512sums=('5c40cfe05b922492627db71990dd2ba6030fd2de4bdba3f53a3f274543ff161fb56e2f6bdac107e0ffdcfd095e499c54e1157ee1865723baefa67b5b4d3da201' +sha512sums=('b3f5184697f77e94c95d48f6879de214eb5e17aa6ef8e96f65530d157e515b1ae2f290e98453e4ff126462520fa0f63852b6e1c8fbb397ed2e41984336bc78c6' 'SKIP') validpgpkeys=('EAF1C276A747E9ED86210CBAC3126D3B4AE55E93' # Tristan Gingold '3A24BC1E8FB409FA9F14371813FCEF89DD9E3C4F') # Nick Clifton (Chief Binutils Maintainer) From 1c8f7bc7de23d07829986b7e4009e842a3b758b5 Mon Sep 17 00:00:00 2001 From: David P Date: Oct 13 2021 23:26:25 +0000 Subject: [PATCH 10/23] updpkg: libre/sh-elf-binutils 2.37-1 Signed-off-by: David P --- diff --git a/libre/sh-elf-binutils/PKGBUILD b/libre/sh-elf-binutils/PKGBUILD index 20c3e21..fa4de58 100644 --- a/libre/sh-elf-binutils/PKGBUILD +++ b/libre/sh-elf-binutils/PKGBUILD @@ -2,7 +2,7 @@ _target=sh-elf pkgname=$_target-binutils -pkgver=2.36.1 +pkgver=2.37 pkgrel=1 pkgdesc='A set of programs to assemble and manipulate binary and object files for the SuperH (bare-metal) target' arch=('x86_64' 'i686' 'armv7h') @@ -10,7 +10,7 @@ url='http://www.gnu.org/software/binutils/' license=(GPL) depends=(zlib) source=(https://ftp.gnu.org/gnu/binutils/binutils-$pkgver.tar.bz2{,.sig}) -sha512sums=('5c40cfe05b922492627db71990dd2ba6030fd2de4bdba3f53a3f274543ff161fb56e2f6bdac107e0ffdcfd095e499c54e1157ee1865723baefa67b5b4d3da201' +sha512sums=('b3f5184697f77e94c95d48f6879de214eb5e17aa6ef8e96f65530d157e515b1ae2f290e98453e4ff126462520fa0f63852b6e1c8fbb397ed2e41984336bc78c6' 'SKIP') validpgpkeys=('EAF1C276A747E9ED86210CBAC3126D3B4AE55E93' # Tristan Gingold '3A24BC1E8FB409FA9F14371813FCEF89DD9E3C4F') # Nick Clifton (Chief Binutils Maintainer) From 6a5dc7a9fc37ffe0a73de3f68c8dc9e8b2440c26 Mon Sep 17 00:00:00 2001 From: David P Date: Oct 13 2021 23:42:07 +0000 Subject: [PATCH 11/23] updpkg: libre/xtensa-elf-binutils 2.37-1 Signed-off-by: David P --- diff --git a/libre/xtensa-elf-binutils/PKGBUILD b/libre/xtensa-elf-binutils/PKGBUILD index e5aa96e..3d70a0f 100644 --- a/libre/xtensa-elf-binutils/PKGBUILD +++ b/libre/xtensa-elf-binutils/PKGBUILD @@ -2,7 +2,7 @@ _target=xtensa-elf pkgname=$_target-binutils -pkgver=2.36.1 +pkgver=2.37 pkgrel=1 pkgdesc='A set of programs to assemble and manipulate binary and object files for the Xtensa (bare-metal) target' arch=('x86_64' 'i686' 'armv7h') @@ -11,7 +11,7 @@ license=('GPL') depends=('zlib') source=(https://ftp.gnu.org/gnu/binutils/binutils-$pkgver.tar.bz2{,.sig} binutils-2.36_fixup.patch binutils-2.34_fixup.patch binutils.patch) -sha512sums=('5c40cfe05b922492627db71990dd2ba6030fd2de4bdba3f53a3f274543ff161fb56e2f6bdac107e0ffdcfd095e499c54e1157ee1865723baefa67b5b4d3da201' +sha512sums=('b3f5184697f77e94c95d48f6879de214eb5e17aa6ef8e96f65530d157e515b1ae2f290e98453e4ff126462520fa0f63852b6e1c8fbb397ed2e41984336bc78c6' 'SKIP' 'fa1e3e1b30d625eae4e59f1396079cc3fa4d77ec4f119ad20c52db1e1ff1819989ff16dc583d7c719caeb7c0ece48d76fe7c08a85b960c7bc924fe780ffa4ac2' '4e5bbba907eec565f5c3ea00fa5a19c146ec19b1f2db38c6581f80a524475ad9b066839ca671da05c6fab9af402f2bb76e01d227e7456b3ef48c6d685605c8d1' From c1bfed0516d229efd29fc80732a72ce115dc7b34 Mon Sep 17 00:00:00 2001 From: David P Date: Oct 14 2021 02:11:09 +0000 Subject: [PATCH 12/23] updpkg: libre/arm-linux-gnueabi-gcc 11.2.0-1 Signed-off-by: David P --- diff --git a/libre/arm-linux-gnueabi-gcc/PKGBUILD b/libre/arm-linux-gnueabi-gcc/PKGBUILD index 5694131..8b9b4e4 100644 --- a/libre/arm-linux-gnueabi-gcc/PKGBUILD +++ b/libre/arm-linux-gnueabi-gcc/PKGBUILD @@ -2,10 +2,10 @@ _target=arm-linux-gnueabi pkgname=$_target-gcc -_pkgver=10.2.0 -pkgver=$_pkgver -_islver=0.22 +pkgver=11.2.0 +_islver=0.24 pkgrel=1 +#_snapshot=8-20210107 pkgdesc='The GNU Compiler Collection - cross compiler for ARM GNU EABI little-endian target' arch=(x86_64 i686 armv7h) url='http://gcc.gnu.org/' @@ -13,18 +13,19 @@ license=(GPL LGPL FDL) depends=($_target-binutils libmpc zlib) makedepends=(gmp mpfr) options=(!emptydirs !strip) -source=(https://gcc.gnu.org/pub/gcc/releases/gcc-$_pkgver/gcc-$_pkgver.tar.xz{,.sig} - http://isl.gforge.inria.fr/isl-$_islver.tar.bz2) -sha512sums=('42ae38928bd2e8183af445da34220964eb690b675b1892bbeb7cd5bb62be499011ec9a93397dba5e2fb681afadfc6f2767d03b9035b44ba9be807187ae6dc65e' +source=(https://gcc.gnu.org/pub/gcc/releases/gcc-$pkgver/gcc-$pkgver.tar.xz{,.sig} + #https://gcc.gnu.org/pub/gcc/snapshots/$_snapshot/gcc-$_snapshot.tar.xz + https://libisl.sourceforge.io/isl-$_islver.tar.bz2) +sha512sums=('d53a0a966230895c54f01aea38696f818817b505f1e2bfa65e508753fcd01b2aedb4a61434f41f3a2ddbbd9f41384b96153c684ded3f0fa97c82758d9de5c7cf' 'SKIP' - 'fc2c9796979610dd51143dcefe4f5c989c4354571cc5a1fcc6b932fd41f42a54f6b43adfd289af61be7bd06f3a523fa6a7d7ee56680e32d8036beb4c188fa668') + 'aab3bddbda96b801d0f56d2869f943157aad52a6f6e6a61745edd740234c635c38231af20bc3f1a08d416a5e973a90e18249078ed8e4ae2f1d5de57658738e95') validpgpkeys=(33C235A34C46AA3FFB293709A328C3A2C3C45C06 # Jakub Jelinek 13975A70E63C361C73AE69EF6EEB81F8981C74C7) # Richard Guenther if [ -n "$_snapshot" ]; then _basedir=gcc-$_snapshot else - _basedir=gcc-$_pkgver + _basedir=gcc-$pkgver fi prepare() { @@ -33,7 +34,7 @@ prepare() { # link isl for in-tree builds ln -sf ../isl-$_islver isl - echo $_pkgver > gcc/BASE-VER + echo $pkgver > gcc/BASE-VER # hack! - some configure tests for header files using "$CPP $CPPFLAGS" sed -i "/ac_cpp=/s/\$CPPFLAGS/\$CPPFLAGS -O2/" "$srcdir"/$_basedir/{libiberty,gcc}/configure @@ -49,6 +50,11 @@ build() { CFLAGS=${CFLAGS/-pipe/} CXXFLAGS=${CXXFLAGS/-pipe/} + if [ "$CARCH" = i686 ]; then + # using -Werror=format-security causes i686 build to fail + CXXFLAGS+=' -Wno-error=format-security' + fi + $srcdir/$_basedir/configure \ --target=$_target \ --prefix=/usr \ From 0c3eae2ec3e5263d3b6680f687e7cf10192f2a67 Mon Sep 17 00:00:00 2001 From: Megver83 Date: Oct 14 2021 16:15:01 +0000 Subject: [PATCH 13/23] updpkg: libre/sh-elf-gcc 11.2.0-1 Signed-off-by: Megver83 --- diff --git a/libre/sh-elf-gcc/PKGBUILD b/libre/sh-elf-gcc/PKGBUILD index 7ef0bcb..ef40f7b 100644 --- a/libre/sh-elf-gcc/PKGBUILD +++ b/libre/sh-elf-gcc/PKGBUILD @@ -2,10 +2,10 @@ _target=sh-elf pkgname=$_target-gcc -_pkgver=10.2.0 -pkgver=$_pkgver -_islver=0.22 +pkgver=11.2.0 +_islver=0.24 pkgrel=1 +#_snapshot=8-20210107 pkgdesc='The GNU Compiler Collection - cross compiler for SuperH (bare-metal) target' arch=(x86_64 i686 armv7h) url='http://gcc.gnu.org/' @@ -14,17 +14,18 @@ depends=($_target-binutils libmpc zlib) makedepends=(gmp mpfr $_target-newlib) optdepends=("$_target-newlib: Standard C library ($_target target)") options=(!emptydirs !strip) -source=(https://gcc.gnu.org/pub/gcc/releases/gcc-$_pkgver/gcc-$_pkgver.tar.xz{,.sig} - http://isl.gforge.inria.fr/isl-$_islver.tar.bz2) -sha512sums=('42ae38928bd2e8183af445da34220964eb690b675b1892bbeb7cd5bb62be499011ec9a93397dba5e2fb681afadfc6f2767d03b9035b44ba9be807187ae6dc65e' +source=(https://gcc.gnu.org/pub/gcc/releases/gcc-$pkgver/gcc-$pkgver.tar.xz{,.sig} + #https://gcc.gnu.org/pub/gcc/snapshots/$_snapshot/gcc-$_snapshot.tar.xz + https://libisl.sourceforge.io/isl-$_islver.tar.bz2) +sha512sums=('d53a0a966230895c54f01aea38696f818817b505f1e2bfa65e508753fcd01b2aedb4a61434f41f3a2ddbbd9f41384b96153c684ded3f0fa97c82758d9de5c7cf' 'SKIP' - 'fc2c9796979610dd51143dcefe4f5c989c4354571cc5a1fcc6b932fd41f42a54f6b43adfd289af61be7bd06f3a523fa6a7d7ee56680e32d8036beb4c188fa668') + 'aab3bddbda96b801d0f56d2869f943157aad52a6f6e6a61745edd740234c635c38231af20bc3f1a08d416a5e973a90e18249078ed8e4ae2f1d5de57658738e95') validpgpkeys=(33C235A34C46AA3FFB293709A328C3A2C3C45C06 # Jakub Jelinek 13975A70E63C361C73AE69EF6EEB81F8981C74C7) # Richard Guenther if [ -n "$_snapshot" ]; then _basedir=gcc-$_snapshot else - _basedir=gcc-$_pkgver + _basedir=gcc-$pkgver fi prepare() { @@ -33,7 +34,7 @@ prepare() { # link isl for in-tree builds ln -sf ../isl-$_islver isl - echo $_pkgver > gcc/BASE-VER + echo $pkgver > gcc/BASE-VER # hack! - some configure tests for header files using "$CPP $CPPFLAGS" sed -i "/ac_cpp=/s/\$CPPFLAGS/\$CPPFLAGS -O2/" "$srcdir"/$_basedir/{libiberty,gcc}/configure @@ -48,7 +49,12 @@ build() { # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48565 CFLAGS=${CFLAGS/-pipe/} CXXFLAGS=${CXXFLAGS/-pipe/} - + + if [ "$CARCH" = i686 ]; then + # using -Werror=format-security causes i686 build to fail + CXXFLAGS+=' -Wno-error=format-security' + fi + $srcdir/$_basedir/configure \ --target=$_target \ --prefix=/usr \ From b3fd4d33c63367821a8d80c05f00e5edab5a4ad4 Mon Sep 17 00:00:00 2001 From: David P Date: Oct 14 2021 16:17:12 +0000 Subject: [PATCH 14/23] updpkg: libre/xtensa-elf-gcc 11.2.0-1 Signed-off-by: David P --- diff --git a/libre/xtensa-elf-gcc/PKGBUILD b/libre/xtensa-elf-gcc/PKGBUILD index adb789f..b9db258 100644 --- a/libre/xtensa-elf-gcc/PKGBUILD +++ b/libre/xtensa-elf-gcc/PKGBUILD @@ -2,10 +2,10 @@ _target=xtensa-elf pkgname=$_target-gcc -_pkgver=10.2.0 -pkgver=$_pkgver -_islver=0.22 +pkgver=11.2.0 +_islver=0.24 pkgrel=1 +#_snapshot=8-20210107 pkgdesc='The GNU Compiler Collection - cross compiler for Xtensa (bare-metal) target' arch=(x86_64 i686 armv7h) url='http://gcc.gnu.org/' @@ -13,30 +13,32 @@ license=(GPL LGPL FDL) depends=($_target-binutils libmpc zlib) makedepends=(gmp mpfr) options=(!emptydirs !strip) -source=(https://gcc.gnu.org/pub/gcc/releases/gcc-$_pkgver/gcc-$_pkgver.tar.xz{,.sig} - http://isl.gforge.inria.fr/isl-$_islver.tar.bz2 +source=(https://gcc.gnu.org/pub/gcc/releases/gcc-$pkgver/gcc-$pkgver.tar.xz{,.sig} + #https://gcc.gnu.org/pub/gcc/snapshots/$_snapshot/gcc-$_snapshot.tar.xz + https://libisl.sourceforge.io/isl-$_islver.tar.bz2 gcc.patch) -sha512sums=('42ae38928bd2e8183af445da34220964eb690b675b1892bbeb7cd5bb62be499011ec9a93397dba5e2fb681afadfc6f2767d03b9035b44ba9be807187ae6dc65e' +sha512sums=('d53a0a966230895c54f01aea38696f818817b505f1e2bfa65e508753fcd01b2aedb4a61434f41f3a2ddbbd9f41384b96153c684ded3f0fa97c82758d9de5c7cf' 'SKIP' - 'fc2c9796979610dd51143dcefe4f5c989c4354571cc5a1fcc6b932fd41f42a54f6b43adfd289af61be7bd06f3a523fa6a7d7ee56680e32d8036beb4c188fa668' + 'aab3bddbda96b801d0f56d2869f943157aad52a6f6e6a61745edd740234c635c38231af20bc3f1a08d416a5e973a90e18249078ed8e4ae2f1d5de57658738e95' '7637408259cef4b14a2f41690bbc769ad0dc6cf4d1c782405526aeb58f68193269af6882b23fb57c3521174e45709ed2d54f0af1f835646e70a3bfd9f626aad9') validpgpkeys=(33C235A34C46AA3FFB293709A328C3A2C3C45C06 # Jakub Jelinek 13975A70E63C361C73AE69EF6EEB81F8981C74C7) # Richard Guenther if [ -n "$_snapshot" ]; then _basedir=gcc-$_snapshot else - _basedir=gcc-$_pkgver + _basedir=gcc-$pkgver fi prepare() { cd $_basedir + # https://github.com/qca/open-ath9k-htc-firmware/tree/master/local/patches patch -Np1 -i ../gcc.patch # link isl for in-tree builds ln -sf ../isl-$_islver isl - echo $_pkgver > gcc/BASE-VER + echo $pkgver > gcc/BASE-VER # hack! - some configure tests for header files using "$CPP $CPPFLAGS" sed -i "/ac_cpp=/s/\$CPPFLAGS/\$CPPFLAGS -O2/" "$srcdir"/$_basedir/{libiberty,gcc}/configure @@ -52,6 +54,11 @@ build() { CFLAGS=${CFLAGS/-pipe/} CXXFLAGS=${CXXFLAGS/-pipe/} + if [ "$CARCH" = i686 ]; then + # using -Werror=format-security causes i686 build to fail + CXXFLAGS+=' -Wno-error=format-security' + fi + $srcdir/$_basedir/configure \ --target=$_target \ --prefix=/usr \ From a2e05211157ba21d35acb27a72a0a56a2f93c6d9 Mon Sep 17 00:00:00 2001 From: David P Date: Oct 14 2021 23:14:23 +0000 Subject: [PATCH 15/23] updpkg: libre/linux-libre-firmware 1:1.4-1 Signed-off-by: David P --- diff --git a/libre/linux-libre-firmware/0001-Update-carl9170-to-latest-upstream.patch b/libre/linux-libre-firmware/0001-Update-carl9170-to-latest-upstream.patch deleted file mode 100644 index e56707e..0000000 --- a/libre/linux-libre-firmware/0001-Update-carl9170-to-latest-upstream.patch +++ /dev/null @@ -1,4982 +0,0 @@ -From c164bf7f87f9081fee7e1a186dd7a87a9a020b9e Mon Sep 17 00:00:00 2001 -From: Jason Self -Date: Thu, 4 Jul 2019 15:12:33 -0700 -Subject: [PATCH 1/8] Update carl9170 to latest upstream - -Based on commit 001384147050b9cd9daadb4d3115cc0f13f5b319 -Dated May 5 2019. ---- - WHENCE | 4 +- - carl9170fw/carlfw/include/wl.h | 2 +- - carl9170fw/carlfw/src/hostif.c | 8 +- - carl9170fw/carlfw/src/printf.c | 0 - carl9170fw/carlfw/src/wlantx.c | 5 +- - carl9170fw/config/CMakeLists.txt | 6 +- - carl9170fw/config/conf.c | 210 ++++++---- - carl9170fw/config/confdata.c | 329 +++++++++------ - carl9170fw/config/expr.c | 206 +++++++--- - carl9170fw/config/expr.h | 105 ++++- - carl9170fw/config/kconf_id.c | 54 --- - carl9170fw/config/lkc.h | 50 +-- - carl9170fw/config/lkc_proto.h | 19 +- - carl9170fw/config/menu.c | 259 +++++++++--- - carl9170fw/config/preprocess.c | 573 +++++++++++++++++++++++++++ - carl9170fw/config/symbol.c | 255 ++++-------- - carl9170fw/config/util.c | 86 ++-- - carl9170fw/config/zconf.l | 336 ++++++++++------ - carl9170fw/config/zconf.y | 403 +++++++++---------- - carl9170fw/include/linux/ieee80211.h | 24 +- - carl9170fw/include/shared/wlan.h | 2 +- - carl9170fw/toolchain/Makefile | 8 +- - carl9170fw/toolchain/SHA256SUMS | 18 +- - 23 files changed, 1942 insertions(+), 1020 deletions(-) - mode change 100755 => 100644 carl9170fw/carlfw/src/printf.c - delete mode 100644 carl9170fw/config/kconf_id.c - create mode 100644 carl9170fw/config/preprocess.c - -diff --git a/WHENCE b/WHENCE -index dd8ec20..2932155 100644 ---- a/WHENCE -+++ b/WHENCE -@@ -142,8 +142,8 @@ From https://git.kernel.org/pub/scm/utils/cis-tools/cis-tools.git - - Driver: carl9170 -- Atheros AR9170 802.11 draft-n USB driver - --Version: Based on commit 370b7919114a02149088c482c8709cafb9bf7478 --dated May 2 2018. -+Version: Based on commit 001384147050b9cd9daadb4d3115cc0f13f5b319 -+dated May 5 2019. - - Licence: GPLv2 or later. - -diff --git a/carl9170fw/carlfw/include/wl.h b/carl9170fw/carlfw/include/wl.h -index 8499ca2..5566be4 100644 ---- a/carl9170fw/carlfw/include/wl.h -+++ b/carl9170fw/carlfw/include/wl.h -@@ -237,7 +237,7 @@ static inline __inline void unhide_super(struct dma_desc *desc) - desc->totalLen += sizeof(struct carl9170_tx_superdesc); - } - --static inline __inline __hot void read_tsf(uint32_t *tsf) -+static inline __inline __hot void read_tsf(uint32_t tsf[static 2]) - { - /* - * "According to the [hardware] documentation: -diff --git a/carl9170fw/carlfw/src/hostif.c b/carl9170fw/carlfw/src/hostif.c -index 73e89c7..06726db 100644 ---- a/carl9170fw/carlfw/src/hostif.c -+++ b/carl9170fw/carlfw/src/hostif.c -@@ -213,10 +213,14 @@ void handle_cmd(struct carl9170_rsp *resp) - fw.reboot = 1; - break; - -- case CARL9170_CMD_READ_TSF: -+ case CARL9170_CMD_READ_TSF: { -+ uint32_t tmptsf[2]; -+ -+ read_tsf(tmptsf); - resp->hdr.len = 8; -- read_tsf((uint32_t *)resp->tsf.tsf); -+ memcpy(resp->tsf.tsf, tmptsf, sizeof(tmptsf)); - break; -+ } - - case CARL9170_CMD_RX_FILTER: - resp->hdr.len = 0; -diff --git a/carl9170fw/carlfw/src/printf.c b/carl9170fw/carlfw/src/printf.c -old mode 100755 -new mode 100644 -diff --git a/carl9170fw/carlfw/src/wlantx.c b/carl9170fw/carlfw/src/wlantx.c -index 474c040..a8d0952 100644 ---- a/carl9170fw/carlfw/src/wlantx.c -+++ b/carl9170fw/carlfw/src/wlantx.c -@@ -260,7 +260,7 @@ static void __wlan_tx(struct dma_desc *desc) - - if (unlikely(super->s.fill_in_tsf)) { - struct ieee80211_mgmt *mgmt = (void *) &super->f.data.i3e; -- uint32_t *tsf = (uint32_t *) &mgmt->u.probe_resp.timestamp; -+ uint32_t tmptsf[2]; - - /* - * Truth be told: this is a hack. -@@ -272,7 +272,8 @@ static void __wlan_tx(struct dma_desc *desc) - * (even, if it's got an accurate atomic clock source). - */ - -- read_tsf(tsf); -+ read_tsf(tmptsf); -+ memcpy(&mgmt->u.probe_resp.timestamp, tmptsf, sizeof(tmptsf)); - } - - wlan_tx_ampdu(super); -diff --git a/carl9170fw/config/CMakeLists.txt b/carl9170fw/config/CMakeLists.txt -index 0a96a82..23e7218 100644 ---- a/carl9170fw/config/CMakeLists.txt -+++ b/carl9170fw/config/CMakeLists.txt -@@ -11,13 +11,13 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}) - - file(MAKE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../include/generated") - --BISON_TARGET(zconf zconf.y zconf.tab.c COMPILE_FLAGS "-l -b zconf -p zconf -t") --FLEX_TARGET(zconfscan zconf.l zconf.lex.c COMPILE_FLAGS "-Pzconf -L") -+BISON_TARGET(zconf zconf.y zconf.tab.c COMPILE_FLAGS "-l -b zconf -p yy -t") -+FLEX_TARGET(zconfscan zconf.l zconf.lex.c COMPILE_FLAGS "-Pyy -L") - - SET(zconf_deps ${FLEX_zconfscan_OUTPUTS}) - SET_SOURCE_FILES_PROPERTIES(${BISON_zconf_OUTPUTS} - PROPERTIES OBJECT_DEPENDS "${zconf_deps}") - --set(conf_src conf.c ${BISON_zconf_OUTPUTS}) -+set(conf_src conf.c symbol.c confdata.c expr.c preprocess.c ${BISON_zconf_OUTPUTS} ${FLEX_zconfscan_OUTPUTS}) - - add_executable(conf ${conf_src}) -diff --git a/carl9170fw/config/conf.c b/carl9170fw/config/conf.c -index 6be6143..2949b7d 100644 ---- a/carl9170fw/config/conf.c -+++ b/carl9170fw/config/conf.c -@@ -1,9 +1,8 @@ -+// SPDX-License-Identifier: GPL-2.0 - /* - * Copyright (C) 2002 Roman Zippel -- * Released under the terms of the GNU GPL v2.0. - */ - --#include - #include - #include - #include -@@ -20,10 +19,10 @@ - - static void conf(struct menu *menu); - static void check_conf(struct menu *menu); --static void xfgets(char *str, int size, FILE *in); - - enum input_mode { - oldaskconfig, -+ syncconfig, - oldconfig, - allnoconfig, - allyesconfig, -@@ -33,12 +32,13 @@ enum input_mode { - defconfig, - savedefconfig, - listnewconfig, -- oldnoconfig, --} input_mode = oldaskconfig; -+ olddefconfig, -+}; -+static enum input_mode input_mode = oldaskconfig; - - static int indent = 1; - static int tty_stdio; --static int valid_stdin = 1; -+static int sync_kconfig; - static int conf_cnt; - static char line[PATH_MAX]; - static struct menu *rootEntry; -@@ -70,14 +70,14 @@ static void strip(char *str) - *p-- = 0; - } - --static void check_stdin(void) -+/* Helper function to facilitate fgets() by Jean Sacren. */ -+static void xfgets(char *str, int size, FILE *in) - { -- if (!valid_stdin) { -- printf(_("aborted!\n\n")); -- printf(_("Console input/output is redirected. ")); -- printf(_("Run 'make config' to update configuration.\n\n")); -- exit(1); -- } -+ if (!fgets(str, size, in)) -+ fprintf(stderr, "\nError in reading or end of file.\n"); -+ -+ if (!tty_stdio) -+ printf("%s", str); - } - - static int conf_askvalue(struct symbol *sym, const char *def) -@@ -85,7 +85,7 @@ static int conf_askvalue(struct symbol *sym, const char *def) - enum symbol_type type = sym_get_type(sym); - - if (!sym_has_value(sym)) -- printf(_("(NEW) ")); -+ printf("(NEW) "); - - line[0] = '\n'; - line[1] = 0; -@@ -99,17 +99,15 @@ static int conf_askvalue(struct symbol *sym, const char *def) - - switch (input_mode) { - case oldconfig: -+ case syncconfig: - if (sym_has_value(sym)) { - printf("%s\n", def); - return 0; - } -- check_stdin(); - /* fall through */ - case oldaskconfig: - fflush(stdout); - xfgets(line, sizeof(line), stdin); -- if (!tty_stdio) -- printf("\n"); - return 1; - default: - break; -@@ -134,7 +132,7 @@ static int conf_string(struct menu *menu) - const char *def; - - while (1) { -- printf("%*s%s ", indent - 1, "", _(menu->prompt->text)); -+ printf("%*s%s ", indent - 1, "", menu->prompt->text); - printf("(%s) ", sym->name); - def = sym_get_string_value(sym); - if (sym_get_string_value(sym)) -@@ -167,7 +165,7 @@ static int conf_sym(struct menu *menu) - tristate oldval, newval; - - while (1) { -- printf("%*s%s ", indent - 1, "", _(menu->prompt->text)); -+ printf("%*s%s ", indent - 1, "", menu->prompt->text); - if (sym->name) - printf("(%s) ", sym->name); - putchar('['); -@@ -189,9 +187,7 @@ static int conf_sym(struct menu *menu) - printf("/m"); - if (oldval != yes && sym_tristate_within_range(sym, yes)) - printf("/y"); -- if (menu_has_help(menu)) -- printf("/?"); -- printf("] "); -+ printf("/?] "); - if (!conf_askvalue(sym, sym_get_string_value(sym))) - return 0; - strip(line); -@@ -254,7 +250,7 @@ static int conf_choice(struct menu *menu) - case no: - return 1; - case mod: -- printf("%*s%s\n", indent - 1, "", _(menu_get_prompt(menu))); -+ printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu)); - return 0; - case yes: - break; -@@ -264,7 +260,7 @@ static int conf_choice(struct menu *menu) - while (1) { - int cnt, def; - -- printf("%*s%s\n", indent - 1, "", _(menu_get_prompt(menu))); -+ printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu)); - def_sym = sym_get_choice_value(sym); - cnt = def = 0; - line[0] = 0; -@@ -272,7 +268,7 @@ static int conf_choice(struct menu *menu) - if (!menu_is_visible(child)) - continue; - if (!child->sym) { -- printf("%*c %s\n", indent, '*', _(menu_get_prompt(child))); -+ printf("%*c %s\n", indent, '*', menu_get_prompt(child)); - continue; - } - cnt++; -@@ -281,30 +277,27 @@ static int conf_choice(struct menu *menu) - printf("%*c", indent, '>'); - } else - printf("%*c", indent, ' '); -- printf(" %d. %s", cnt, _(menu_get_prompt(child))); -+ printf(" %d. %s", cnt, menu_get_prompt(child)); - if (child->sym->name) - printf(" (%s)", child->sym->name); - if (!sym_has_value(child->sym)) -- printf(_(" (NEW)")); -+ printf(" (NEW)"); - printf("\n"); - } -- printf(_("%*schoice"), indent - 1, ""); -+ printf("%*schoice", indent - 1, ""); - if (cnt == 1) { - printf("[1]: 1\n"); - goto conf_childs; - } -- printf("[1-%d", cnt); -- if (menu_has_help(menu)) -- printf("?"); -- printf("]: "); -+ printf("[1-%d?]: ", cnt); - switch (input_mode) { - case oldconfig: -+ case syncconfig: - if (!is_new) { - cnt = def; - printf("%d\n", cnt); - break; - } -- check_stdin(); - /* fall through */ - case oldaskconfig: - fflush(stdout); -@@ -364,9 +357,11 @@ static void conf(struct menu *menu) - - switch (prop->type) { - case P_MENU: -- if ((input_mode == listnewconfig || -- input_mode == oldnoconfig) && -- rootEntry != menu) { -+ /* -+ * Except in oldaskconfig mode, we show only menus that -+ * contain new symbols. -+ */ -+ if (input_mode != oldaskconfig && rootEntry != menu) { - check_conf(menu); - return; - } -@@ -376,7 +371,7 @@ static void conf(struct menu *menu) - if (prompt) - printf("%*c\n%*c %s\n%*c\n", - indent, '*', -- indent, '*', _(prompt), -+ indent, '*', prompt, - indent, '*'); - default: - ; -@@ -426,12 +421,22 @@ static void check_conf(struct menu *menu) - if (sym_is_changable(sym) || - (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) { - if (input_mode == listnewconfig) { -- if (sym->name && !sym_is_choice_value(sym)) { -- printf("%s%s\n", CONFIG_, sym->name); -+ if (sym->name) { -+ const char *str; -+ -+ if (sym->type == S_STRING) { -+ str = sym_get_string_value(sym); -+ str = sym_escape_string_value(str); -+ printf("%s%s=%s\n", CONFIG_, sym->name, str); -+ free((void *)str); -+ } else { -+ str = sym_get_string_value(sym); -+ printf("%s%s=%s\n", CONFIG_, sym->name, str); -+ } - } -- } else if (input_mode != oldnoconfig) { -+ } else { - if (!conf_cnt++) -- printf(_("*\n* Restart config...\n*\n")); -+ printf("*\n* Restart config...\n*\n"); - rootEntry = menu_get_parent_menu(menu); - conf(rootEntry); - } -@@ -443,8 +448,9 @@ static void check_conf(struct menu *menu) - } - - static struct option long_opts[] = { -- {"askconfig", no_argument, NULL, oldaskconfig}, -- {"config", no_argument, NULL, oldconfig}, -+ {"oldaskconfig", no_argument, NULL, oldaskconfig}, -+ {"oldconfig", no_argument, NULL, oldconfig}, -+ {"syncconfig", no_argument, NULL, syncconfig}, - {"defconfig", optional_argument, NULL, defconfig}, - {"savedefconfig", required_argument, NULL, savedefconfig}, - {"allnoconfig", no_argument, NULL, allnoconfig}, -@@ -453,7 +459,7 @@ static struct option long_opts[] = { - {"alldefconfig", no_argument, NULL, alldefconfig}, - {"randconfig", no_argument, NULL, randconfig}, - {"listnewconfig", no_argument, NULL, listnewconfig}, -- {"noconfig", no_argument, NULL, oldnoconfig}, -+ {"olddefconfig", no_argument, NULL, olddefconfig}, - {NULL, 0, NULL, 0} - }; - -@@ -463,10 +469,11 @@ static void conf_usage(const char *progname) - printf("Usage: %s [-s] [option] \n", progname); - printf("[option] is _one_ of the following:\n"); - printf(" --listnewconfig List new options\n"); -- printf(" --askconfig Start a new configuration using a line-oriented program\n"); -- printf(" --config Update a configuration using a provided .config as base\n"); -- printf(" --silentconfig Same as config, but quietly, additionally update deps\n"); -- printf(" --noconfig Same as silentconfig but set new symbols to no\n"); -+ printf(" --oldaskconfig Start a new configuration using a line-oriented program\n"); -+ printf(" --oldconfig Update a configuration using a provided .config as base\n"); -+ printf(" --syncconfig Similar to oldconfig but generates configuration in\n" -+ " include/{generated/,config/}\n"); -+ printf(" --olddefconfig Same as oldconfig but sets new symbols to their default value\n"); - printf(" --defconfig New config with default defined in \n"); - printf(" --savedefconfig Save the minimal current configuration to \n"); - printf(" --allnoconfig New config where all options are answered with no\n"); -@@ -482,12 +489,9 @@ int main(int ac, char **av) - int opt; - const char *name, *defconfig_file = NULL /* gcc uninit */; - struct stat tmpstat; -+ int no_conf_write = 0; - -- setlocale(LC_ALL, ""); -- bindtextdomain(PACKAGE, LOCALEDIR); -- textdomain(PACKAGE); -- -- tty_stdio = isatty(0) && isatty(1) && isatty(2); -+ tty_stdio = isatty(0) && isatty(1); - - while ((opt = getopt_long(ac, av, "s", long_opts, NULL)) != -1) { - if (opt == 's') { -@@ -496,6 +500,14 @@ int main(int ac, char **av) - } - input_mode = (enum input_mode)opt; - switch (opt) { -+ case syncconfig: -+ /* -+ * syncconfig is invoked during the build stage. -+ * Suppress distracting "configuration written to ..." -+ */ -+ conf_set_message_callback(NULL); -+ sync_kconfig = 1; -+ break; - case defconfig: - case savedefconfig: - defconfig_file = optarg; -@@ -532,7 +544,7 @@ int main(int ac, char **av) - case allmodconfig: - case alldefconfig: - case listnewconfig: -- case oldnoconfig: -+ case olddefconfig: - break; - case '?': - conf_usage(progname); -@@ -541,30 +553,45 @@ int main(int ac, char **av) - } - } - if (ac == optind) { -- printf(_("%s: Kconfig file missing\n"), av[0]); -+ fprintf(stderr, "%s: Kconfig file missing\n", av[0]); - conf_usage(progname); - exit(1); - } - name = av[optind]; - conf_parse(name); - //zconfdump(stdout); -+ if (sync_kconfig) { -+ name = conf_get_configname(); -+ if (stat(name, &tmpstat)) { -+ fprintf(stderr, "***\n" -+ "*** Configuration file \"%s\" not found!\n" -+ "***\n" -+ "*** Please run some configurator (e.g. \"make oldconfig\" or\n" -+ "*** \"make menuconfig\" or \"make xconfig\").\n" -+ "***\n", name); -+ exit(1); -+ } -+ } - - switch (input_mode) { - case defconfig: - if (!defconfig_file) - defconfig_file = conf_get_default_confname(); - if (conf_read(defconfig_file)) { -- printf(_("***\n" -- "*** Can't find default configuration \"%s\"!\n" -- "***\n"), defconfig_file); -+ fprintf(stderr, -+ "***\n" -+ "*** Can't find default configuration \"%s\"!\n" -+ "***\n", -+ defconfig_file); - exit(1); - } - break; - case savedefconfig: -+ case syncconfig: - case oldaskconfig: - case oldconfig: - case listnewconfig: -- case oldnoconfig: -+ case olddefconfig: - conf_read(NULL); - break; - case allnoconfig: -@@ -578,7 +605,7 @@ int main(int ac, char **av) - if ((strcmp(name, "") != 0) && (strcmp(name, "1") != 0)) { - if (conf_read_simple(name, S_DEF_USER)) { - fprintf(stderr, -- _("*** Can't read seed configuration \"%s\"!\n"), -+ "*** Can't read seed configuration \"%s\"!\n", - name); - exit(1); - } -@@ -595,7 +622,7 @@ int main(int ac, char **av) - if (conf_read_simple(name, S_DEF_USER) && - conf_read_simple("all.config", S_DEF_USER)) { - fprintf(stderr, -- _("*** KCONFIG_ALLCONFIG set, but no \"%s\" or \"all.config\" file found\n"), -+ "*** KCONFIG_ALLCONFIG set, but no \"%s\" or \"all.config\" file found\n", - name); - exit(1); - } -@@ -604,7 +631,17 @@ int main(int ac, char **av) - break; - } - -- valid_stdin = tty_stdio; -+ if (sync_kconfig) { -+ name = getenv("KCONFIG_NOSILENTUPDATE"); -+ if (name && *name) { -+ if (conf_get_changed()) { -+ fprintf(stderr, -+ "\n*** The configuration requires explicit update.\n\n"); -+ return 1; -+ } -+ no_conf_write = 1; -+ } -+ } - - switch (input_mode) { - case allnoconfig: -@@ -635,44 +672,51 @@ int main(int ac, char **av) - /* fall through */ - case oldconfig: - case listnewconfig: -- case oldnoconfig: -+ case syncconfig: - /* Update until a loop caused no more changes */ - do { - conf_cnt = 0; - check_conf(&rootmenu); -- } while (conf_cnt && -- (input_mode != listnewconfig && -- input_mode != oldnoconfig)); -+ } while (conf_cnt); -+ break; -+ case olddefconfig: -+ default: - break; - } - - if (input_mode == savedefconfig) { - if (conf_write_defconfig(defconfig_file)) { -- fprintf(stderr, _("n*** Error while saving defconfig to: %s\n\n"), -+ fprintf(stderr, "n*** Error while saving defconfig to: %s\n\n", - defconfig_file); - return 1; - } - } else if (input_mode != listnewconfig) { -- /* -- * build so we shall update autoconf. -- */ -- if (conf_write(NULL)) { -- fprintf(stderr, _("\n*** Error during writing of the configuration.\n\n")); -+ if (!no_conf_write && conf_write(NULL)) { -+ fprintf(stderr, "\n*** Error during writing of the configuration.\n\n"); - exit(1); - } -- if (conf_write_autoconf()) { -- fprintf(stderr, _("\n*** Error during update of the configuration.\n\n")); -+ -+ /* -+ * Create auto.conf if it does not exist. -+ * This prevents GNU Make 4.1 or older from emitting -+ * "include/generated/auto.conf: No such file or directory" -+ * in the top-level Makefile -+ * -+ * syncconfig always creates or updates auto.conf because it is -+ * used during the build. -+ */ -+ -+ /* -+ * In our cmake case, we always want to update the autogenerated -+ * files. -+ */ -+ sync_kconfig = 1; -+ -+ if (conf_write_autoconf(sync_kconfig) && sync_kconfig) { -+ fprintf(stderr, -+ "\n*** Error during sync of the configuration.\n\n"); - return 1; - } - } - return 0; - } -- --/* -- * Helper function to facilitate fgets() by Jean Sacren. -- */ --void xfgets(char *str, int size, FILE *in) --{ -- if (fgets(str, size, in) == NULL) -- fprintf(stderr, "\nError in reading or end of file.\n"); --} -diff --git a/carl9170fw/config/confdata.c b/carl9170fw/config/confdata.c -index e606f06..d67695d 100644 ---- a/carl9170fw/config/confdata.c -+++ b/carl9170fw/config/confdata.c -@@ -1,12 +1,13 @@ -+// SPDX-License-Identifier: GPL-2.0 - /* - * Copyright (C) 2002 Roman Zippel -- * Released under the terms of the GNU GPL v2.0. - */ - - #include - #include - #include - #include -+#include - #include - #include - #include -@@ -16,6 +17,105 @@ - - #include "lkc.h" - -+/* return true if 'path' exists, false otherwise */ -+static bool is_present(const char *path) -+{ -+ struct stat st; -+ -+ return !stat(path, &st); -+} -+ -+/* return true if 'path' exists and it is a directory, false otherwise */ -+static bool is_dir(const char *path) -+{ -+ struct stat st; -+ -+ if (stat(path, &st)) -+ return 0; -+ -+ return S_ISDIR(st.st_mode); -+} -+ -+/* -+ * Create the parent directory of the given path. -+ * -+ * For example, if 'include/config/auto.conf' is given, create 'include/config'. -+ */ -+static int make_parent_dir(const char *path) -+{ -+ char tmp[PATH_MAX + 1]; -+ char *p; -+ -+ strncpy(tmp, path, sizeof(tmp)); -+ tmp[sizeof(tmp) - 1] = 0; -+ -+ /* Remove the base name. Just return if nothing is left */ -+ p = strrchr(tmp, '/'); -+ if (!p) -+ return 0; -+ *(p + 1) = 0; -+ -+ /* Just in case it is an absolute path */ -+ p = tmp; -+ while (*p == '/') -+ p++; -+ -+ while ((p = strchr(p, '/'))) { -+ *p = 0; -+ -+ /* skip if the directory exists */ -+ if (!is_dir(tmp) && mkdir(tmp, 0755)) -+ return -1; -+ -+ *p = '/'; -+ while (*p == '/') -+ p++; -+ } -+ -+ return 0; -+} -+ -+static char depfile_path[PATH_MAX]; -+static size_t depfile_prefix_len; -+ -+/* touch depfile for symbol 'name' */ -+static int conf_touch_dep(const char *name) -+{ -+ int fd, ret; -+ const char *s; -+ char *d, c; -+ -+ /* check overflow: prefix + name + ".h" + '\0' must fit in buffer. */ -+ if (depfile_prefix_len + strlen(name) + 3 > sizeof(depfile_path)) -+ return -1; -+ -+ d = depfile_path + depfile_prefix_len; -+ s = name; -+ -+ while ((c = *s++)) -+ *d++ = (c == '_') ? '/' : tolower(c); -+ strcpy(d, ".h"); -+ -+ /* Assume directory path already exists. */ -+ fd = open(depfile_path, O_WRONLY | O_CREAT | O_TRUNC, 0644); -+ if (fd == -1) { -+ if (errno != ENOENT) -+ return -1; -+ -+ ret = make_parent_dir(depfile_path); -+ if (ret) -+ return ret; -+ -+ /* Try it again. */ -+ fd = open(depfile_path, O_WRONLY | O_CREAT | O_TRUNC, 0644); -+ if (fd == -1) -+ return -1; -+ } -+ close(fd); -+ -+ return 0; -+} -+ - struct conf_printer { - void (*print_symbol)(FILE *, struct symbol *, const char *, void *); - void (*print_comment)(FILE *, const char *, void *); -@@ -28,7 +128,7 @@ static void conf_message(const char *fmt, ...) - __attribute__ ((format (printf, 1, 2))); - - static const char *conf_filename; --static int conf_lineno, conf_warnings, conf_unsaved; -+static int conf_lineno, conf_warnings; - - const char conf_defname[] = "include/generated/defconfig"; - -@@ -43,16 +143,16 @@ static void conf_warning(const char *fmt, ...) - conf_warnings++; - } - --static void conf_default_message_callback(const char *fmt, va_list ap) -+static void conf_default_message_callback(const char *s) - { - printf("#\n# "); -- vprintf(fmt, ap); -+ printf("%s", s); - printf("\n#\n"); - } - --static void (*conf_message_callback) (const char *fmt, va_list ap) = -+static void (*conf_message_callback)(const char *s) = - conf_default_message_callback; --void conf_set_message_callback(void (*fn) (const char *fmt, va_list ap)) -+void conf_set_message_callback(void (*fn)(const char *s)) - { - conf_message_callback = fn; - } -@@ -60,10 +160,15 @@ void conf_set_message_callback(void (*fn) (const char *fmt, va_list ap)) - static void conf_message(const char *fmt, ...) - { - va_list ap; -+ char buf[4096]; -+ -+ if (!conf_message_callback) -+ return; - - va_start(ap, fmt); -- if (conf_message_callback) -- conf_message_callback(fmt, ap); -+ -+ vsnprintf(buf, sizeof(buf), fmt, ap); -+ conf_message_callback(buf); - va_end(ap); - } - -@@ -81,43 +186,16 @@ const char *conf_get_autoconfig_name(void) - return name ? name : "include/generated/auto.conf"; - } - --static char *conf_expand_value(const char *in) --{ -- struct symbol *sym; -- const char *src; -- static char res_value[SYMBOL_MAXLENGTH]; -- char *dst, name[SYMBOL_MAXLENGTH]; -- -- res_value[0] = 0; -- dst = name; -- while ((src = strchr(in, '$'))) { -- strncat(res_value, in, src - in); -- src++; -- dst = name; -- while (isalnum(*src) || *src == '_') -- *dst++ = *src++; -- *dst = 0; -- sym = sym_lookup(name, 0); -- sym_calc_value(sym); -- strcat(res_value, sym_get_string_value(sym)); -- in = src; -- } -- strcat(res_value, in); -- -- return res_value; --} -- - char *conf_get_default_confname(void) - { -- struct stat buf; - static char fullname[PATH_MAX+1]; - char *env, *name; - -- name = conf_expand_value(conf_defname); -+ name = expand_string(conf_defname); - env = getenv(SRCTREE); - if (env) { - sprintf(fullname, "%s/%s", env, name); -- if (!stat(fullname, &buf)) -+ if (is_present(fullname)) - return fullname; - } - return name; -@@ -150,14 +228,6 @@ static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p) - conf_warning("symbol value '%s' invalid for %s", - p, sym->name); - return 1; -- case S_OTHER: -- if (*p != '"') { -- for (p2 = p; *p2 && !isspace(*p2); p2++) -- ; -- sym->type = S_STRING; -- goto done; -- } -- /* fall through */ - case S_STRING: - if (*p++ != '"') - break; -@@ -176,9 +246,8 @@ static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p) - /* fall through */ - case S_INT: - case S_HEX: -- done: - if (sym_string_valid(sym, p)) { -- sym->def[def].val = strdup(p); -+ sym->def[def].val = xstrdup(p); - sym->flags |= def_flags; - } else { - if (def != S_DEF_AUTO) -@@ -201,7 +270,7 @@ static int add_byte(int c, char **lineptr, size_t slen, size_t *n) - if (new_size > *n) { - new_size += LINE_GROWTH - 1; - new_size *= 2; -- nline = realloc(*lineptr, new_size); -+ nline = xrealloc(*lineptr, new_size); - if (!nline) - return -1; - -@@ -274,10 +343,11 @@ int conf_read_simple(const char *name, int def) - if (expr_calc_value(prop->visible.expr) == no || - prop->expr->type != E_SYMBOL) - continue; -- name = conf_expand_value(prop->expr->left.sym->name); -+ sym_calc_value(prop->expr->left.sym); -+ name = sym_get_string_value(prop->expr->left.sym); - in = zconf_fopen(name); - if (in) { -- conf_message(_("using defaults found in %s"), -+ conf_message("using defaults found in %s", - name); - goto load; - } -@@ -290,7 +360,6 @@ load: - conf_filename = name; - conf_lineno = 0; - conf_warnings = 0; -- conf_unsaved = 0; - - def_flags = SYMBOL_DEF << def; - for_all_symbols(i, sym) { -@@ -327,7 +396,7 @@ load: - sym = sym_find(line + 2 + strlen(CONFIG_)); - if (!sym) { - sym_add_change_count(1); -- goto setsym; -+ continue; - } - } else { - sym = sym_lookup(line + 2 + strlen(CONFIG_), 0); -@@ -357,17 +426,22 @@ load: - if (*p2 == '\r') - *p2 = 0; - } -- if (def == S_DEF_USER) { -- sym = sym_find(line + strlen(CONFIG_)); -- if (!sym) { -+ -+ sym = sym_find(line + strlen(CONFIG_)); -+ if (!sym) { -+ if (def == S_DEF_AUTO) -+ /* -+ * Reading from include/config/auto.conf -+ * If CONFIG_FOO previously existed in -+ * auto.conf but it is missing now, -+ * include/config/foo.h must be touched. -+ */ -+ conf_touch_dep(line + strlen(CONFIG_)); -+ else - sym_add_change_count(1); -- goto setsym; -- } -- } else { -- sym = sym_lookup(line + strlen(CONFIG_), 0); -- if (sym->type == S_UNKNOWN) -- sym->type = S_OTHER; -+ continue; - } -+ - if (sym->flags & def_flags) { - conf_warning("override: reassigning to symbol %s", sym->name); - } -@@ -380,7 +454,7 @@ load: - - continue; - } --setsym: -+ - if (sym && sym_is_choice_value(sym)) { - struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym)); - switch (sym->def[def].tri) { -@@ -409,6 +483,7 @@ setsym: - int conf_read(const char *name) - { - struct symbol *sym; -+ int conf_unsaved = 0; - int i; - - sym_set_change_count(0); -@@ -422,7 +497,7 @@ int conf_read(const char *name) - - for_all_symbols(i, sym) { - sym_calc_value(sym); -- if (sym_is_choice(sym) || (sym->flags & SYMBOL_AUTO)) -+ if (sym_is_choice(sym) || (sym->flags & SYMBOL_NO_WRITE)) - continue; - if (sym_has_value(sym) && (sym->flags & SYMBOL_WRITE)) { - /* check that calculated value agrees with saved value */ -@@ -678,7 +753,6 @@ static void conf_write_symbol(FILE *fp, struct symbol *sym, - const char *str; - - switch (sym->type) { -- case S_OTHER: - case S_UNKNOWN: - break; - case S_STRING: -@@ -791,15 +865,14 @@ int conf_write(const char *name) - struct menu *menu; - const char *basename; - const char *str; -- char dirname[PATH_MAX+1], tmpname[PATH_MAX+1], newname[PATH_MAX+1]; -+ char dirname[PATH_MAX+1], tmpname[PATH_MAX+22], newname[PATH_MAX+8]; - char *env; - - dirname[0] = 0; - if (name && name[0]) { -- struct stat st; - char *slash; - -- if (!stat(name, &st) && S_ISDIR(st.st_mode)) { -+ if (is_dir(name)) { - strcpy(dirname, name); - strcat(dirname, "/"); - basename = conf_get_configname(); -@@ -877,33 +950,61 @@ next: - return 1; - } - -- conf_message(_("configuration written to %s"), newname); -+ conf_message("configuration written to %s", newname); - - sym_set_change_count(0); - - return 0; - } - --static int conf_split_config(void) -+/* write a dependency file as used by kbuild to track dependencies */ -+static int conf_write_dep(const char *name) -+{ -+ struct file *file; -+ FILE *out; -+ -+ if (!name) -+ name = ".kconfig.d"; -+ out = fopen("..config.tmp", "w"); -+ if (!out) -+ return 1; -+ fprintf(out, "deps_config := \\\n"); -+ for (file = file_list; file; file = file->next) { -+ if (file->next) -+ fprintf(out, "\t%s \\\n", file->name); -+ else -+ fprintf(out, "\t%s\n", file->name); -+ } -+ fprintf(out, "\n%s: \\\n" -+ "\t$(deps_config)\n\n", conf_get_autoconfig_name()); -+ -+ env_write_dep(out, conf_get_autoconfig_name()); -+ -+ fprintf(out, "\n$(deps_config): ;\n"); -+ fclose(out); -+ -+ if (make_parent_dir(name)) -+ return 1; -+ rename("..config.tmp", name); -+ return 0; -+} -+ -+static int conf_touch_deps(void) - { - const char *name; -- char path[PATH_MAX+1]; -- char *s, *d, c; - struct symbol *sym; -- struct stat sb; -- int res, i, fd; -+ int res, i; -+ -+ strcpy(depfile_path, "include/generated/"); -+ depfile_prefix_len = strlen(depfile_path); - - name = conf_get_autoconfig_name(); - conf_read_simple(name, S_DEF_AUTO); - sym_calc_value(modules_sym); - -- if (chdir("include/generated")) -- return 1; -- -- res = 0; - for_all_symbols(i, sym) { - sym_calc_value(sym); -- if ((sym->flags & SYMBOL_AUTO) || !sym->name) -+ if ((sym->flags & SYMBOL_NO_WRITE) || !sym->name) - continue; - if (sym->flags & SYMBOL_WRITE) { - if (sym->flags & SYMBOL_DEF_AUTO) { -@@ -952,63 +1053,30 @@ static int conf_split_config(void) - * different from 'no'). - */ - -- /* Replace all '_' and append ".h" */ -- s = sym->name; -- d = path; -- while ((c = *s++)) { -- c = tolower(c); -- *d++ = (c == '_') ? '/' : c; -- } -- strcpy(d, ".h"); -- -- /* Assume directory path already exists. */ -- fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644); -- if (fd == -1) { -- if (errno != ENOENT) { -- res = 1; -- break; -- } -- /* -- * Create directory components, -- * unless they exist already. -- */ -- d = path; -- while ((d = strchr(d, '/'))) { -- *d = 0; -- if (stat(path, &sb) && mkdir(path, 0755)) { -- res = 1; -- goto out; -- } -- *d++ = '/'; -- } -- /* Try it again. */ -- fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644); -- if (fd == -1) { -- res = 1; -- break; -- } -- } -- close(fd); -+ res = conf_touch_dep(sym->name); -+ if (res) -+ return res; - } --out: -- if (chdir("../..")) -- return 1; - -- return res; -+ return 0; - } - --int conf_write_autoconf(void) -+int conf_write_autoconf(int overwrite) - { - struct symbol *sym; - const char *name; -+ const char *autoconf_name = conf_get_autoconfig_name(); - FILE *out, *tristate, *out_h, *out_c; - int i; - -+ if (!overwrite && is_present(autoconf_name)) -+ return 0; -+ - sym_clear_all_valid(); - -- file_write_dep("include/generated/auto.conf.cmd"); -+ conf_write_dep("include/generated/auto.conf.cmd"); - -- if (conf_split_config()) -+ if (conf_touch_deps()) - return 1; - - out = fopen(".tmpconfig", "w"); -@@ -1065,24 +1133,35 @@ int conf_write_autoconf(void) - name = getenv("KCONFIG_AUTOHEADER"); - if (!name) - name = "include/generated/autoconf.h"; -+ if (make_parent_dir(name)) -+ return 1; - if (rename(".tmpconfig.h", name)) - return 1; -+ - name = getenv("KCONFIG_TRISTATE"); - if (!name) - name = "include/generated/tristate.conf"; -+ if (make_parent_dir(name)) -+ return 1; - if (rename(".tmpconfig_tristate", name)) - return 1; -+ -+ if (make_parent_dir(autoconf_name)) -+ return 1; -+ - name = getenv("KCONFIG_CMAKE"); - if (!name) - name = "config.cmake"; -+ if (make_parent_dir(name)) -+ return 1; - if (rename(".tmpconfig.cmake", name)) - return 1; -- name = conf_get_autoconfig_name(); -+ - /* - * This must be the last step, kbuild has a dependency on auto.conf - * and this marks the successful completion of the previous steps. - */ -- if (rename(".tmpconfig", name)) -+ if (rename(".tmpconfig", autoconf_name)) - return 1; - - return 0; -@@ -1186,7 +1265,7 @@ void set_all_choice_values(struct symbol *csym) - bool conf_set_all_new_symbols(enum conf_def_mode mode) - { - struct symbol *sym, *csym; -- int i, cnt, pby, pty, ptm; /* pby: probability of boolean = y -+ int i, cnt, pby, pty, ptm; /* pby: probability of bool = y - * pty: probability of tristate = y - * ptm: probability of tristate = m - */ -diff --git a/carl9170fw/config/expr.c b/carl9170fw/config/expr.c -index 8cee597..77ffff3 100644 ---- a/carl9170fw/config/expr.c -+++ b/carl9170fw/config/expr.c -@@ -1,8 +1,10 @@ -+// SPDX-License-Identifier: GPL-2.0 - /* - * Copyright (C) 2002 Roman Zippel -- * Released under the terms of the GNU GPL v2.0. - */ - -+#include -+#include - #include - #include - #include -@@ -94,7 +96,7 @@ struct expr *expr_copy(const struct expr *org) - e->right.expr = expr_copy(org->right.expr); - break; - default: -- printf("can't copy type %d\n", e->type); -+ fprintf(stderr, "can't copy type %d\n", e->type); - free(e); - e = NULL; - break; -@@ -113,7 +115,7 @@ void expr_free(struct expr *e) - break; - case E_NOT: - expr_free(e->left.expr); -- return; -+ break; - case E_EQUAL: - case E_GEQ: - case E_GTH: -@@ -127,7 +129,7 @@ void expr_free(struct expr *e) - expr_free(e->right.expr); - break; - default: -- printf("how to free type %d?\n", e->type); -+ fprintf(stderr, "how to free type %d?\n", e->type); - break; - } - free(e); -@@ -138,8 +140,18 @@ static int trans_count; - #define e1 (*ep1) - #define e2 (*ep2) - -+/* -+ * expr_eliminate_eq() helper. -+ * -+ * Walks the two expression trees given in 'ep1' and 'ep2'. Any node that does -+ * not have type 'type' (E_OR/E_AND) is considered a leaf, and is compared -+ * against all other leaves. Two equal leaves are both replaced with either 'y' -+ * or 'n' as appropriate for 'type', to be eliminated later. -+ */ - static void __expr_eliminate_eq(enum expr_type type, struct expr **ep1, struct expr **ep2) - { -+ /* Recurse down to leaves */ -+ - if (e1->type == type) { - __expr_eliminate_eq(type, &e1->left.expr, &e2); - __expr_eliminate_eq(type, &e1->right.expr, &e2); -@@ -150,12 +162,18 @@ static void __expr_eliminate_eq(enum expr_type type, struct expr **ep1, struct e - __expr_eliminate_eq(type, &e1, &e2->right.expr); - return; - } -+ -+ /* e1 and e2 are leaves. Compare them. */ -+ - if (e1->type == E_SYMBOL && e2->type == E_SYMBOL && - e1->left.sym == e2->left.sym && - (e1->left.sym == &symbol_yes || e1->left.sym == &symbol_no)) - return; - if (!expr_eq(e1, e2)) - return; -+ -+ /* e1 and e2 are equal leaves. Prepare them for elimination. */ -+ - trans_count++; - expr_free(e1); expr_free(e2); - switch (type) { -@@ -172,6 +190,35 @@ static void __expr_eliminate_eq(enum expr_type type, struct expr **ep1, struct e - } - } - -+/* -+ * Rewrites the expressions 'ep1' and 'ep2' to remove operands common to both. -+ * Example reductions: -+ * -+ * ep1: A && B -> ep1: y -+ * ep2: A && B && C -> ep2: C -+ * -+ * ep1: A || B -> ep1: n -+ * ep2: A || B || C -> ep2: C -+ * -+ * ep1: A && (B && FOO) -> ep1: FOO -+ * ep2: (BAR && B) && A -> ep2: BAR -+ * -+ * ep1: A && (B || C) -> ep1: y -+ * ep2: (C || B) && A -> ep2: y -+ * -+ * Comparisons are done between all operands at the same "level" of && or ||. -+ * For example, in the expression 'e1 && (e2 || e3) && (e4 || e5)', the -+ * following operands will be compared: -+ * -+ * - 'e1', 'e2 || e3', and 'e4 || e5', against each other -+ * - e2 against e3 -+ * - e4 against e5 -+ * -+ * Parentheses are irrelevant within a single level. 'e1 && (e2 && e3)' and -+ * '(e1 && e2) && e3' are both a single level. -+ * -+ * See __expr_eliminate_eq() as well. -+ */ - void expr_eliminate_eq(struct expr **ep1, struct expr **ep2) - { - if (!e1 || !e2) -@@ -197,6 +244,12 @@ void expr_eliminate_eq(struct expr **ep1, struct expr **ep2) - #undef e1 - #undef e2 - -+/* -+ * Returns true if 'e1' and 'e2' are equal, after minor simplification. Two -+ * &&/|| expressions are considered equal if every operand in one expression -+ * equals some operand in the other (operands do not need to appear in the same -+ * order), recursively. -+ */ - static int expr_eq(struct expr *e1, struct expr *e2) - { - int res, old_count; -@@ -243,6 +296,17 @@ static int expr_eq(struct expr *e1, struct expr *e2) - return 0; - } - -+/* -+ * Recursively performs the following simplifications in-place (as well as the -+ * corresponding simplifications with swapped operands): -+ * -+ * expr && n -> n -+ * expr && y -> expr -+ * expr || n -> expr -+ * expr || y -> y -+ * -+ * Returns the optimized expression. -+ */ - static struct expr *expr_eliminate_yn(struct expr *e) - { - struct expr *tmp; -@@ -516,12 +580,21 @@ static struct expr *expr_join_and(struct expr *e1, struct expr *e2) - return NULL; - } - -+/* -+ * expr_eliminate_dups() helper. -+ * -+ * Walks the two expression trees given in 'ep1' and 'ep2'. Any node that does -+ * not have type 'type' (E_OR/E_AND) is considered a leaf, and is compared -+ * against all other leaves to look for simplifications. -+ */ - static void expr_eliminate_dups1(enum expr_type type, struct expr **ep1, struct expr **ep2) - { - #define e1 (*ep1) - #define e2 (*ep2) - struct expr *tmp; - -+ /* Recurse down to leaves */ -+ - if (e1->type == type) { - expr_eliminate_dups1(type, &e1->left.expr, &e2); - expr_eliminate_dups1(type, &e1->right.expr, &e2); -@@ -532,6 +605,9 @@ static void expr_eliminate_dups1(enum expr_type type, struct expr **ep1, struct - expr_eliminate_dups1(type, &e1, &e2->right.expr); - return; - } -+ -+ /* e1 and e2 are leaves. Compare and process them. */ -+ - if (e1 == e2) - return; - -@@ -568,6 +644,17 @@ static void expr_eliminate_dups1(enum expr_type type, struct expr **ep1, struct - #undef e2 - } - -+/* -+ * Rewrites 'e' in-place to remove ("join") duplicate and other redundant -+ * operands. -+ * -+ * Example simplifications: -+ * -+ * A || B || A -> A || B -+ * A && B && A=y -> A=y && B -+ * -+ * Returns the deduplicated expression. -+ */ - struct expr *expr_eliminate_dups(struct expr *e) - { - int oldcount; -@@ -584,6 +671,7 @@ struct expr *expr_eliminate_dups(struct expr *e) - ; - } - if (!trans_count) -+ /* No simplifications done in this pass. We're done */ - break; - e = expr_eliminate_yn(e); - } -@@ -591,6 +679,12 @@ struct expr *expr_eliminate_dups(struct expr *e) - return e; - } - -+/* -+ * Performs various simplifications involving logical operators and -+ * comparisons. -+ * -+ * Allocates and returns a new expression. -+ */ - struct expr *expr_transform(struct expr *e) - { - struct expr *tmp; -@@ -805,6 +899,20 @@ bool expr_depends_symbol(struct expr *dep, struct symbol *sym) - return false; - } - -+/* -+ * Inserts explicit comparisons of type 'type' to symbol 'sym' into the -+ * expression 'e'. -+ * -+ * Examples transformations for type == E_UNEQUAL, sym == &symbol_no: -+ * -+ * A -> A!=n -+ * !A -> A=n -+ * A && B -> !(A=n || B=n) -+ * A || B -> !(A=n && B=n) -+ * A && (B || C) -> !(A=n || (B=n && C=n)) -+ * -+ * Allocates and returns a new expression. -+ */ - struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym) - { - struct expr *e1, *e2; -@@ -874,7 +982,6 @@ enum string_value_kind { - k_string, - k_signed, - k_unsigned, -- k_invalid - }; - - union string_value { -@@ -905,13 +1012,10 @@ static enum string_value_kind expr_parse_string(const char *str, - val->u = strtoull(str, &tail, 16); - kind = k_unsigned; - break; -- case S_STRING: -- case S_UNKNOWN: -+ default: - val->s = strtoll(str, &tail, 0); - kind = k_signed; - break; -- default: -- return k_invalid; - } - return !errno && !*tail && tail > str && isxdigit(tail[-1]) - ? kind : k_string; -@@ -967,13 +1071,7 @@ tristate expr_calc_value(struct expr *e) - - if (k1 == k_string || k2 == k_string) - res = strcmp(str1, str2); -- else if (k1 == k_invalid || k2 == k_invalid) { -- if (e->type != E_EQUAL && e->type != E_UNEQUAL) { -- printf("Cannot compare \"%s\" and \"%s\"\n", str1, str2); -- return no; -- } -- res = strcmp(str1, str2); -- } else if (k1 == k_unsigned || k2 == k_unsigned) -+ else if (k1 == k_unsigned || k2 == k_unsigned) - res = (lval.u > rval.u) - (lval.u < rval.u); - else /* if (k1 == k_signed && k2 == k_signed) */ - res = (lval.s > rval.s) - (lval.s < rval.s); -@@ -1031,49 +1129,9 @@ static int expr_compare_type(enum expr_type t1, enum expr_type t2) - return 0; - } - --static inline struct expr * --expr_get_leftmost_symbol(const struct expr *e) --{ -- -- if (e == NULL) -- return NULL; -- -- while (e->type != E_SYMBOL) -- e = e->left.expr; -- -- return expr_copy(e); --} -- --/* -- * Given expression `e1' and `e2', returns the leaf of the longest -- * sub-expression of `e1' not containing 'e2. -- */ --struct expr *expr_simplify_unmet_dep(struct expr *e1, struct expr *e2) --{ -- struct expr *ret; -- -- switch (e1->type) { -- case E_OR: -- return expr_alloc_and( -- expr_simplify_unmet_dep(e1->left.expr, e2), -- expr_simplify_unmet_dep(e1->right.expr, e2)); -- case E_AND: { -- struct expr *e; -- e = expr_alloc_and(expr_copy(e1), expr_copy(e2)); -- e = expr_eliminate_dups(e); -- ret = (!expr_eq(e, e1)) ? e1 : NULL; -- expr_free(e); -- break; -- } -- default: -- ret = e1; -- break; -- } -- -- return expr_get_leftmost_symbol(ret); --} -- --void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken) -+void expr_print(struct expr *e, -+ void (*fn)(void *, struct symbol *, const char *), -+ void *data, int prevtoken) - { - if (!e) { - fn(data, NULL, "y"); -@@ -1207,3 +1265,33 @@ void expr_gstr_print(struct expr *e, struct gstr *gs) - { - expr_print(e, expr_print_gstr_helper, gs, E_NONE); - } -+ -+/* -+ * Transform the top level "||" tokens into newlines and prepend each -+ * line with a minus. This makes expressions much easier to read. -+ * Suitable for reverse dependency expressions. -+ */ -+static void expr_print_revdep(struct expr *e, -+ void (*fn)(void *, struct symbol *, const char *), -+ void *data, tristate pr_type, const char **title) -+{ -+ if (e->type == E_OR) { -+ expr_print_revdep(e->left.expr, fn, data, pr_type, title); -+ expr_print_revdep(e->right.expr, fn, data, pr_type, title); -+ } else if (expr_calc_value(e) == pr_type) { -+ if (*title) { -+ fn(data, NULL, *title); -+ *title = NULL; -+ } -+ -+ fn(data, NULL, " - "); -+ expr_print(e, fn, data, E_NONE); -+ fn(data, NULL, "\n"); -+ } -+} -+ -+void expr_gstr_print_revdep(struct expr *e, struct gstr *gs, -+ tristate pr_type, const char *title) -+{ -+ expr_print_revdep(e, expr_print_gstr_helper, gs, pr_type, &title); -+} -diff --git a/carl9170fw/config/expr.h b/carl9170fw/config/expr.h -index a73f762..999edb6 100644 ---- a/carl9170fw/config/expr.h -+++ b/carl9170fw/config/expr.h -@@ -1,6 +1,6 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ - /* - * Copyright (C) 2002 Roman Zippel -- * Released under the terms of the GNU GPL v2.0. - */ - - #ifndef EXPR_H -@@ -62,7 +62,7 @@ struct symbol_value { - }; - - enum symbol_type { -- S_UNKNOWN, S_BOOLEAN, S_TRISTATE, S_INT, S_HEX, S_STRING, S_OTHER -+ S_UNKNOWN, S_BOOLEAN, S_TRISTATE, S_INT, S_HEX, S_STRING - }; - - /* enum values are used as index to symbol.def[] */ -@@ -74,21 +74,64 @@ enum { - S_DEF_COUNT - }; - -+/* -+ * Represents a configuration symbol. -+ * -+ * Choices are represented as a special kind of symbol and have the -+ * SYMBOL_CHOICE bit set in 'flags'. -+ */ - struct symbol { -+ /* The next symbol in the same bucket in the symbol hash table */ - struct symbol *next; -+ -+ /* The name of the symbol, e.g. "FOO" for 'config FOO' */ - char *name; -+ -+ /* S_BOOLEAN, S_TRISTATE, ... */ - enum symbol_type type; -+ -+ /* -+ * The calculated value of the symbol. The SYMBOL_VALID bit is set in -+ * 'flags' when this is up to date. Note that this value might differ -+ * from the user value set in e.g. a .config file, due to visibility. -+ */ - struct symbol_value curr; -+ -+ /* -+ * Values for the symbol provided from outside. def[S_DEF_USER] holds -+ * the .config value. -+ */ - struct symbol_value def[S_DEF_COUNT]; -+ -+ /* -+ * An upper bound on the tristate value the user can set for the symbol -+ * if it is a boolean or tristate. Calculated from prompt dependencies, -+ * which also inherit dependencies from enclosing menus, choices, and -+ * ifs. If 'n', the user value will be ignored. -+ * -+ * Symbols lacking prompts always have visibility 'n'. -+ */ - tristate visible; -+ -+ /* SYMBOL_* flags */ - int flags; -+ -+ /* List of properties. See prop_type. */ - struct property *prop; -+ -+ /* Dependencies from enclosing menus, choices, and ifs */ - struct expr_value dir_dep; -+ -+ /* Reverse dependencies through being selected by other symbols */ - struct expr_value rev_dep; -+ -+ /* -+ * "Weak" reverse dependencies through being implied by other symbols -+ */ - struct expr_value implied; - }; - --#define for_all_symbols(i, sym) for (i = 0; i < SYMBOL_HASHSIZE; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER) -+#define for_all_symbols(i, sym) for (i = 0; i < SYMBOL_HASHSIZE; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) - - #define SYMBOL_CONST 0x0001 /* symbol is const */ - #define SYMBOL_CHECK 0x0008 /* used during dependency checking */ -@@ -98,7 +141,7 @@ struct symbol { - #define SYMBOL_OPTIONAL 0x0100 /* choice is optional - values can be 'n' */ - #define SYMBOL_WRITE 0x0200 /* write symbol to file (KCONFIG_CONFIG) */ - #define SYMBOL_CHANGED 0x0400 /* ? */ --#define SYMBOL_AUTO 0x1000 /* value from environment variable */ -+#define SYMBOL_NO_WRITE 0x1000 /* Symbol for internal use only; it will not be written */ - #define SYMBOL_CHECKED 0x2000 /* used during dependency checking */ - #define SYMBOL_WARNED 0x8000 /* warning has been issued */ - -@@ -128,18 +171,20 @@ struct symbol { - * config BAZ - * int "BAZ Value" - * range 1..255 -+ * -+ * Please, also check zconf.y:print_symbol() when modifying the -+ * list of property types! - */ - enum prop_type { - P_UNKNOWN, - P_PROMPT, /* prompt "foo prompt" or "BAZ Value" */ - P_COMMENT, /* text associated with a comment */ -- P_MENU, /* prompt associated with a menuconfig option */ -+ P_MENU, /* prompt associated with a menu or menuconfig symbol */ - P_DEFAULT, /* default y */ - P_CHOICE, /* choice value */ - P_SELECT, /* select BAR */ - P_IMPLY, /* imply BAR */ - P_RANGE, /* range 7..100 (for a symbol) */ -- P_ENV, /* value from environment variable */ - P_SYMBOL, /* where a symbol is defined */ - }; - -@@ -166,22 +211,67 @@ struct property { - for (st = sym->prop; st; st = st->next) \ - if (st->text) - -+/* -+ * Represents a node in the menu tree, as seen in e.g. menuconfig (though used -+ * for all front ends). Each symbol, menu, etc. defined in the Kconfig files -+ * gets a node. A symbol defined in multiple locations gets one node at each -+ * location. -+ */ - struct menu { -+ /* The next menu node at the same level */ - struct menu *next; -+ -+ /* The parent menu node, corresponding to e.g. a menu or choice */ - struct menu *parent; -+ -+ /* The first child menu node, for e.g. menus and choices */ - struct menu *list; -+ -+ /* -+ * The symbol associated with the menu node. Choices are implemented as -+ * a special kind of symbol. NULL for menus, comments, and ifs. -+ */ - struct symbol *sym; -+ -+ /* -+ * The prompt associated with the node. This holds the prompt for a -+ * symbol as well as the text for a menu or comment, along with the -+ * type (P_PROMPT, P_MENU, etc.) -+ */ - struct property *prompt; -+ -+ /* -+ * 'visible if' dependencies. If more than one is given, they will be -+ * ANDed together. -+ */ - struct expr *visibility; -+ -+ /* -+ * Ordinary dependencies from e.g. 'depends on' and 'if', ANDed -+ * together -+ */ - struct expr *dep; -+ -+ /* MENU_* flags */ - unsigned int flags; -+ -+ /* Any help text associated with the node */ - char *help; -+ -+ /* The location where the menu node appears in the Kconfig files */ - struct file *file; - int lineno; -+ -+ /* For use by front ends that need to store auxiliary data */ - void *data; - }; - -+/* -+ * Set on a menu node when the corresponding symbol changes state in some way. -+ * Can be checked by front ends. -+ */ - #define MENU_CHANGED 0x0001 -+ - #define MENU_ROOT 0x0002 - - struct jump_key { -@@ -217,11 +307,12 @@ struct expr *expr_transform(struct expr *e); - int expr_contains_symbol(struct expr *dep, struct symbol *sym); - bool expr_depends_symbol(struct expr *dep, struct symbol *sym); - struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym); --struct expr *expr_simplify_unmet_dep(struct expr *e1, struct expr *e2); - - void expr_fprint(struct expr *e, FILE *out); - struct gstr; /* forward */ - void expr_gstr_print(struct expr *e, struct gstr *gs); -+void expr_gstr_print_revdep(struct expr *e, struct gstr *gs, -+ tristate pr_type, const char *title); - - static inline int expr_is_yes(struct expr *e) - { -diff --git a/carl9170fw/config/kconf_id.c b/carl9170fw/config/kconf_id.c -deleted file mode 100644 -index 5abbc72..0000000 ---- a/carl9170fw/config/kconf_id.c -+++ /dev/null -@@ -1,54 +0,0 @@ -- --static struct kconf_id kconf_id_array[] = { -- { "mainmenu", T_MAINMENU, TF_COMMAND }, -- { "menu", T_MENU, TF_COMMAND }, -- { "endmenu", T_ENDMENU, TF_COMMAND }, -- { "source", T_SOURCE, TF_COMMAND }, -- { "choice", T_CHOICE, TF_COMMAND }, -- { "endchoice", T_ENDCHOICE, TF_COMMAND }, -- { "comment", T_COMMENT, TF_COMMAND }, -- { "config", T_CONFIG, TF_COMMAND }, -- { "menuconfig", T_MENUCONFIG, TF_COMMAND }, -- { "help", T_HELP, TF_COMMAND }, -- { "---help---", T_HELP, TF_COMMAND }, -- { "if", T_IF, TF_COMMAND|TF_PARAM }, -- { "endif", T_ENDIF, TF_COMMAND }, -- { "depends", T_DEPENDS, TF_COMMAND }, -- { "optional", T_OPTIONAL, TF_COMMAND }, -- { "default", T_DEFAULT, TF_COMMAND, S_UNKNOWN }, -- { "prompt", T_PROMPT, TF_COMMAND }, -- { "tristate", T_TYPE, TF_COMMAND, S_TRISTATE }, -- { "def_tristate", T_DEFAULT, TF_COMMAND, S_TRISTATE }, -- { "bool", T_TYPE, TF_COMMAND, S_BOOLEAN }, -- { "boolean", T_TYPE, TF_COMMAND, S_BOOLEAN }, -- { "def_bool", T_DEFAULT, TF_COMMAND, S_BOOLEAN }, -- { "int", T_TYPE, TF_COMMAND, S_INT }, -- { "hex", T_TYPE, TF_COMMAND, S_HEX }, -- { "string", T_TYPE, TF_COMMAND, S_STRING }, -- { "select", T_SELECT, TF_COMMAND }, -- { "imply", T_IMPLY, TF_COMMAND }, -- { "range", T_RANGE, TF_COMMAND }, -- { "visible", T_VISIBLE, TF_COMMAND }, -- { "option", T_OPTION, TF_COMMAND }, -- { "on", T_ON, TF_PARAM }, -- { "modules", T_OPT_MODULES, TF_OPTION }, -- { "defconfig_list", T_OPT_DEFCONFIG_LIST, TF_OPTION }, -- { "env", T_OPT_ENV, TF_OPTION }, -- { "allnoconfig_y", T_OPT_ALLNOCONFIG_Y, TF_OPTION }, --}; -- --#define KCONF_ID_ARRAY_SIZE (sizeof(kconf_id_array)/sizeof(struct kconf_id)) -- --static const struct kconf_id *kconf_id_lookup(register const char *str, register unsigned int len) --{ -- int i; -- -- for (i = 0; i < KCONF_ID_ARRAY_SIZE; i++) { -- struct kconf_id *id = kconf_id_array+i; -- int l = strlen(id->name); -- -- if (len == l && !memcmp(str, id->name, len)) -- return id; -- } -- return NULL; --} -diff --git a/carl9170fw/config/lkc.h b/carl9170fw/config/lkc.h -index cdcbe43..531ff7c 100644 ---- a/carl9170fw/config/lkc.h -+++ b/carl9170fw/config/lkc.h -@@ -1,6 +1,6 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ - /* - * Copyright (C) 2002 Roman Zippel -- * Released under the terms of the GNU GPL v2.0. - */ - - #ifndef LKC_H -@@ -8,15 +8,6 @@ - - #include "expr.h" - --#ifndef KBUILD_NO_NLS --# include --#else --static inline const char *gettext(const char *txt) { return txt; } --static inline void textdomain(const char *domainname) {} --static inline void bindtextdomain(const char *name, const char *dir) {} --static inline char *bind_textdomain_codeset(const char *dn, char *c) { return c; } --#endif -- - #ifdef __cplusplus - extern "C" { - #endif -@@ -29,11 +20,6 @@ extern "C" { - #define PACKAGE "linux" - #endif - --#define LOCALEDIR "/usr/share/locale" -- --#define _(text) gettext(text) --#define N_(text) (text) -- - #ifndef CONFIG_ - #define CONFIG_ "CONFIG_" - #endif -@@ -44,10 +30,6 @@ static inline const char *CONFIG_prefix(void) - #undef CONFIG_ - #define CONFIG_ CONFIG_prefix() - --#define TF_COMMAND 0x0001 --#define TF_PARAM 0x0002 --#define TF_OPTION 0x0004 -- - enum conf_def_mode { - def_default, - def_yes, -@@ -56,18 +38,7 @@ enum conf_def_mode { - def_random - }; - --#define T_OPT_MODULES 1 --#define T_OPT_DEFCONFIG_LIST 2 --#define T_OPT_ENV 3 --#define T_OPT_ALLNOCONFIG_Y 4 -- --struct kconf_id { -- const char *name; -- int token; -- unsigned int flags; -- enum symbol_type stype; --}; -- -+extern int yylineno; - void zconfdump(FILE *out); - void zconf_starthelp(void); - FILE *zconf_fopen(const char *name); -@@ -100,21 +71,27 @@ void menu_warn(struct menu *menu, const char *fmt, ...); - struct menu *menu_add_menu(void); - void menu_end_menu(void); - void menu_add_entry(struct symbol *sym); --void menu_end_entry(void); - void menu_add_dep(struct expr *dep); - void menu_add_visibility(struct expr *dep); - struct property *menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep); - void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep); - void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep); --void menu_add_option(int token, char *arg); -+void menu_add_option_modules(void); -+void menu_add_option_defconfig_list(void); -+void menu_add_option_allnoconfig_y(void); - void menu_finalize(struct menu *parent); - void menu_set_type(int type); - - /* util.c */ - struct file *file_lookup(const char *name); --int file_write_dep(const char *name); - void *xmalloc(size_t size); - void *xcalloc(size_t nmemb, size_t size); -+void *xrealloc(void *p, size_t size); -+char *xstrdup(const char *s); -+char *xstrndup(const char *s, size_t n); -+ -+/* zconf.l */ -+int yylex(void); - - struct gstr { - size_t len; -@@ -132,16 +109,13 @@ void str_printf(struct gstr *gs, const char *fmt, ...); - const char *str_get(struct gstr *gs); - - /* symbol.c */ --extern struct expr *sym_env_list; -- --void sym_init(void); - void sym_clear_all_valid(void); - struct symbol *sym_choice_default(struct symbol *sym); -+struct property *sym_get_range_prop(struct symbol *sym); - const char *sym_get_string_default(struct symbol *sym); - struct symbol *sym_check_deps(struct symbol *sym); - struct property *prop_alloc(enum prop_type type, struct symbol *sym); - struct symbol *prop_get_symbol(struct property *prop); --struct property *sym_get_env_prop(struct symbol *sym); - - static inline tristate sym_get_tristate_value(struct symbol *sym) - { -diff --git a/carl9170fw/config/lkc_proto.h b/carl9170fw/config/lkc_proto.h -index 5d86e2d..86c2675 100644 ---- a/carl9170fw/config/lkc_proto.h -+++ b/carl9170fw/config/lkc_proto.h -@@ -7,10 +7,10 @@ int conf_read(const char *name); - int conf_read_simple(const char *name, int); - int conf_write_defconfig(const char *name); - int conf_write(const char *name); --int conf_write_autoconf(void); -+int conf_write_autoconf(int overwrite); - bool conf_get_changed(void); - void conf_set_changed_callback(void (*fn)(void)); --void conf_set_message_callback(void (*fn)(const char *fmt, va_list ap)); -+void conf_set_message_callback(void (*fn)(const char *s)); - - /* menu.c */ - extern struct menu rootmenu; -@@ -31,7 +31,6 @@ extern struct symbol * symbol_hash[SYMBOL_HASHSIZE]; - - struct symbol * sym_lookup(const char *name, int flags); - struct symbol * sym_find(const char *name); --const char * sym_expand_string_value(const char *in); - const char * sym_escape_string_value(const char *in); - struct symbol ** sym_re_search(const char *pattern); - const char * sym_type_name(enum symbol_type type); -@@ -49,5 +48,19 @@ const char * sym_get_string_value(struct symbol *sym); - - const char * prop_get_type_name(enum prop_type type); - -+/* preprocess.c */ -+enum variable_flavor { -+ VAR_SIMPLE, -+ VAR_RECURSIVE, -+ VAR_APPEND, -+}; -+void env_write_dep(FILE *f, const char *auto_conf_name); -+void variable_add(const char *name, const char *value, -+ enum variable_flavor flavor); -+void variable_all_del(void); -+char *expand_string(const char *in); -+char *expand_dollar(const char **str); -+char *expand_one_token(const char **str); -+ - /* expr.c */ - void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken); -diff --git a/carl9170fw/config/menu.c b/carl9170fw/config/menu.c -index e935793..d9d1646 100644 ---- a/carl9170fw/config/menu.c -+++ b/carl9170fw/config/menu.c -@@ -1,6 +1,6 @@ -+// SPDX-License-Identifier: GPL-2.0 - /* - * Copyright (C) 2002 Roman Zippel -- * Released under the terms of the GNU GPL v2.0. - */ - - #include -@@ -62,13 +62,8 @@ void menu_add_entry(struct symbol *sym) - menu_add_symbol(P_SYMBOL, sym, NULL); - } - --void menu_end_entry(void) --{ --} -- - struct menu *menu_add_menu(void) - { -- menu_end_entry(); - last_entry_ptr = ¤t_entry->list; - return current_menu = current_entry; - } -@@ -79,19 +74,23 @@ void menu_end_menu(void) - current_menu = current_menu->parent; - } - --static struct expr *menu_check_dep(struct expr *e) -+/* -+ * Rewrites 'm' to 'm' && MODULES, so that it evaluates to 'n' when running -+ * without modules -+ */ -+static struct expr *rewrite_m(struct expr *e) - { - if (!e) - return e; - - switch (e->type) { - case E_NOT: -- e->left.expr = menu_check_dep(e->left.expr); -+ e->left.expr = rewrite_m(e->left.expr); - break; - case E_OR: - case E_AND: -- e->left.expr = menu_check_dep(e->left.expr); -- e->right.expr = menu_check_dep(e->right.expr); -+ e->left.expr = rewrite_m(e->left.expr); -+ e->right.expr = rewrite_m(e->right.expr); - break; - case E_SYMBOL: - /* change 'm' into 'm' && MODULES */ -@@ -106,7 +105,7 @@ static struct expr *menu_check_dep(struct expr *e) - - void menu_add_dep(struct expr *dep) - { -- current_entry->dep = expr_alloc_and(current_entry->dep, menu_check_dep(dep)); -+ current_entry->dep = expr_alloc_and(current_entry->dep, dep); - } - - void menu_set_type(int type) -@@ -131,7 +130,7 @@ static struct property *menu_add_prop(enum prop_type type, char *prompt, struct - - prop->menu = current_entry; - prop->expr = expr; -- prop->visible.expr = menu_check_dep(dep); -+ prop->visible.expr = dep; - - if (prompt) { - if (isspace(*prompt)) { -@@ -196,31 +195,26 @@ void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep) - menu_add_prop(type, NULL, expr_alloc_symbol(sym), dep); - } - --void menu_add_option(int token, char *arg) -+void menu_add_option_modules(void) - { -- switch (token) { -- case T_OPT_MODULES: -- if (modules_sym) -- zconf_error("symbol '%s' redefines option 'modules'" -- " already defined by symbol '%s'", -- current_entry->sym->name, -- modules_sym->name -- ); -- modules_sym = current_entry->sym; -- break; -- case T_OPT_DEFCONFIG_LIST: -- if (!sym_defconfig_list) -- sym_defconfig_list = current_entry->sym; -- else if (sym_defconfig_list != current_entry->sym) -- zconf_error("trying to redefine defconfig symbol"); -- break; -- case T_OPT_ENV: -- prop_add_env(arg); -- break; -- case T_OPT_ALLNOCONFIG_Y: -- current_entry->sym->flags |= SYMBOL_ALLNOCONFIG_Y; -- break; -- } -+ if (modules_sym) -+ zconf_error("symbol '%s' redefines option 'modules' already defined by symbol '%s'", -+ current_entry->sym->name, modules_sym->name); -+ modules_sym = current_entry->sym; -+} -+ -+void menu_add_option_defconfig_list(void) -+{ -+ if (!sym_defconfig_list) -+ sym_defconfig_list = current_entry->sym; -+ else if (sym_defconfig_list != current_entry->sym) -+ zconf_error("trying to redefine defconfig symbol"); -+ sym_defconfig_list->flags |= SYMBOL_NO_WRITE; -+} -+ -+void menu_add_option_allnoconfig_y(void) -+{ -+ current_entry->sym->flags |= SYMBOL_ALLNOCONFIG_Y; - } - - static int menu_validate_number(struct symbol *sym, struct symbol *sym2) -@@ -252,6 +246,16 @@ static void sym_check_prop(struct symbol *sym) - "'%s': number is invalid", - sym->name); - } -+ if (sym_is_choice(sym)) { -+ struct property *choice_prop = -+ sym_get_choice_prop(sym2); -+ -+ if (!choice_prop || -+ prop_get_symbol(choice_prop) != sym) -+ prop_warn(prop, -+ "choice default symbol '%s' is not contained in the choice", -+ sym2->name); -+ } - break; - case P_SELECT: - case P_IMPLY: -@@ -260,13 +264,13 @@ static void sym_check_prop(struct symbol *sym) - if (sym->type != S_BOOLEAN && sym->type != S_TRISTATE) - prop_warn(prop, - "config symbol '%s' uses %s, but is " -- "not boolean or tristate", sym->name, use); -+ "not bool or tristate", sym->name, use); - else if (sym2->type != S_UNKNOWN && - sym2->type != S_BOOLEAN && - sym2->type != S_TRISTATE) - prop_warn(prop, - "'%s' has wrong type. '%s' only " -- "accept arguments of boolean and " -+ "accept arguments of bool and " - "tristate type", sym2->name, use); - break; - case P_RANGE: -@@ -292,6 +296,11 @@ void menu_finalize(struct menu *parent) - - sym = parent->sym; - if (parent->list) { -+ /* -+ * This menu node has children. We (recursively) process them -+ * and propagate parent dependencies before moving on. -+ */ -+ - if (sym && sym_is_choice(sym)) { - if (sym->type == S_UNKNOWN) { - /* find the first choice value to find out choice type */ -@@ -309,30 +318,83 @@ void menu_finalize(struct menu *parent) - if (menu->sym && menu->sym->type == S_UNKNOWN) - menu_set_type(sym->type); - } -+ -+ /* -+ * Use the choice itself as the parent dependency of -+ * the contained items. This turns the mode of the -+ * choice into an upper bound on the visibility of the -+ * choice value symbols. -+ */ - parentdep = expr_alloc_symbol(sym); - } else if (parent->prompt) -+ /* Menu node for 'menu' */ - parentdep = parent->prompt->visible.expr; - else -+ /* Menu node for 'if' */ - parentdep = parent->dep; - -+ /* For each child menu node... */ - for (menu = parent->list; menu; menu = menu->next) { -- basedep = expr_transform(menu->dep); -+ /* -+ * Propagate parent dependencies to the child menu -+ * node, also rewriting and simplifying expressions -+ */ -+ basedep = rewrite_m(menu->dep); -+ basedep = expr_transform(basedep); - basedep = expr_alloc_and(expr_copy(parentdep), basedep); - basedep = expr_eliminate_dups(basedep); - menu->dep = basedep; -+ - if (menu->sym) -+ /* -+ * Note: For symbols, all prompts are included -+ * too in the symbol's own property list -+ */ - prop = menu->sym->prop; - else -+ /* -+ * For non-symbol menu nodes, we just need to -+ * handle the prompt -+ */ - prop = menu->prompt; -+ -+ /* For each property... */ - for (; prop; prop = prop->next) { - if (prop->menu != menu) -+ /* -+ * Two possibilities: -+ * -+ * 1. The property lacks dependencies -+ * and so isn't location-specific, -+ * e.g. an 'option' -+ * -+ * 2. The property belongs to a symbol -+ * defined in multiple locations and -+ * is from some other location. It -+ * will be handled there in that -+ * case. -+ * -+ * Skip the property. -+ */ - continue; -- dep = expr_transform(prop->visible.expr); -+ -+ /* -+ * Propagate parent dependencies to the -+ * property's condition, rewriting and -+ * simplifying expressions at the same time -+ */ -+ dep = rewrite_m(prop->visible.expr); -+ dep = expr_transform(dep); - dep = expr_alloc_and(expr_copy(basedep), dep); - dep = expr_eliminate_dups(dep); - if (menu->sym && menu->sym->type != S_TRISTATE) - dep = expr_trans_bool(dep); - prop->visible.expr = dep; -+ -+ /* -+ * Handle selects and implies, which modify the -+ * dependencies of the selected/implied symbol -+ */ - if (prop->type == P_SELECT) { - struct symbol *es = prop_get_symbol(prop); - es->rev_dep.expr = expr_alloc_or(es->rev_dep.expr, -@@ -344,34 +406,81 @@ void menu_finalize(struct menu *parent) - } - } - } -+ -+ if (sym && sym_is_choice(sym)) -+ expr_free(parentdep); -+ -+ /* -+ * Recursively process children in the same fashion before -+ * moving on -+ */ - for (menu = parent->list; menu; menu = menu->next) - menu_finalize(menu); - } else if (sym) { -+ /* -+ * Automatic submenu creation. If sym is a symbol and A, B, C, -+ * ... are consecutive items (symbols, menus, ifs, etc.) that -+ * all depend on sym, then the following menu structure is -+ * created: -+ * -+ * sym -+ * +-A -+ * +-B -+ * +-C -+ * ... -+ * -+ * This also works recursively, giving the following structure -+ * if A is a symbol and B depends on A: -+ * -+ * sym -+ * +-A -+ * | +-B -+ * +-C -+ * ... -+ */ -+ - basedep = parent->prompt ? parent->prompt->visible.expr : NULL; - basedep = expr_trans_compare(basedep, E_UNEQUAL, &symbol_no); - basedep = expr_eliminate_dups(expr_transform(basedep)); -+ -+ /* Examine consecutive elements after sym */ - last_menu = NULL; - for (menu = parent->next; menu; menu = menu->next) { - dep = menu->prompt ? menu->prompt->visible.expr : menu->dep; - if (!expr_contains_symbol(dep, sym)) -+ /* No dependency, quit */ - break; - if (expr_depends_symbol(dep, sym)) -+ /* Absolute dependency, put in submenu */ - goto next; -+ -+ /* -+ * Also consider it a dependency on sym if our -+ * dependencies contain sym and are a "superset" of -+ * sym's dependencies, e.g. '(sym || Q) && R' when sym -+ * depends on R. -+ * -+ * Note that 'R' might be from an enclosing menu or if, -+ * making this a more common case than it might seem. -+ */ - dep = expr_trans_compare(dep, E_UNEQUAL, &symbol_no); - dep = expr_eliminate_dups(expr_transform(dep)); - dep2 = expr_copy(basedep); - expr_eliminate_eq(&dep, &dep2); - expr_free(dep); - if (!expr_is_yes(dep2)) { -+ /* Not superset, quit */ - expr_free(dep2); - break; - } -+ /* Superset, put in submenu */ - expr_free(dep2); - next: - menu_finalize(menu); - menu->parent = parent; - last_menu = menu; - } -+ expr_free(basedep); - if (last_menu) { - parent->list = parent->next; - parent->next = last_menu->next; -@@ -420,6 +529,35 @@ void menu_finalize(struct menu *parent) - *ep = expr_alloc_one(E_LIST, NULL); - (*ep)->right.sym = menu->sym; - } -+ -+ /* -+ * This code serves two purposes: -+ * -+ * (1) Flattening 'if' blocks, which do not specify a submenu -+ * and only add dependencies. -+ * -+ * (Automatic submenu creation might still create a submenu -+ * from an 'if' before this code runs.) -+ * -+ * (2) "Undoing" any automatic submenus created earlier below -+ * promptless symbols. -+ * -+ * Before: -+ * -+ * A -+ * if ... (or promptless symbol) -+ * +-B -+ * +-C -+ * D -+ * -+ * After: -+ * -+ * A -+ * if ... (or promptless symbol) -+ * B -+ * C -+ * D -+ */ - if (menu->list && (!menu->prompt || !menu->prompt->text)) { - for (last_menu = menu->list; ; last_menu = last_menu->next) { - last_menu->parent = parent; -@@ -444,6 +582,15 @@ void menu_finalize(struct menu *parent) - sym->flags |= SYMBOL_WARNED; - } - -+ /* -+ * For non-optional choices, add a reverse dependency (corresponding to -+ * a select) of ' && m'. This prevents the user from -+ * setting the choice mode to 'n' when the choice is visible. -+ * -+ * This would also work for non-choice symbols, but only non-optional -+ * choices clear SYMBOL_OPTIONAL as of writing. Choices are implemented -+ * as a type of symbol. -+ */ - if (sym && !sym_is_optional(sym) && parent->prompt) { - sym->rev_dep.expr = expr_alloc_or(sym->rev_dep.expr, - expr_alloc_and(parent->prompt->visible.expr, -@@ -558,7 +705,7 @@ static void get_prompt_str(struct gstr *r, struct property *prop, - struct menu *submenu[8], *menu, *location = NULL; - struct jump_key *jump = NULL; - -- str_printf(r, _("Prompt: %s\n"), _(prop->text)); -+ str_printf(r, "Prompt: %s\n", prop->text); - menu = prop->menu->parent; - for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent) { - bool accessible = menu_is_visible(menu); -@@ -591,16 +738,16 @@ static void get_prompt_str(struct gstr *r, struct property *prop, - } - - if (i > 0) { -- str_printf(r, _(" Location:\n")); -+ str_printf(r, " Location:\n"); - for (j = 4; --i >= 0; j += 2) { - menu = submenu[i]; - if (jump && menu == location) - jump->offset = strlen(r->s); - str_printf(r, "%*c-> %s", j, ' ', -- _(menu_get_prompt(menu))); -+ menu_get_prompt(menu)); - if (menu->sym) { - str_printf(r, " (%s [=%s])", menu->sym->name ? -- menu->sym->name : _(""), -+ menu->sym->name : "", - sym_get_string_value(menu->sym)); - } - str_append(r, "\n"); -@@ -664,27 +811,27 @@ static void get_symbol_str(struct gstr *r, struct symbol *sym, - - prop = get_symbol_prop(sym); - if (prop) { -- str_printf(r, _(" Defined at %s:%d\n"), prop->menu->file->name, -+ str_printf(r, " Defined at %s:%d\n", prop->menu->file->name, - prop->menu->lineno); - if (!expr_is_yes(prop->visible.expr)) { -- str_append(r, _(" Depends on: ")); -+ str_append(r, " Depends on: "); - expr_gstr_print(prop->visible.expr, r); - str_append(r, "\n"); - } - } - -- get_symbol_props_str(r, sym, P_SELECT, _(" Selects: ")); -+ get_symbol_props_str(r, sym, P_SELECT, " Selects: "); - if (sym->rev_dep.expr) { -- str_append(r, _(" Selected by: ")); -- expr_gstr_print(sym->rev_dep.expr, r); -- str_append(r, "\n"); -+ expr_gstr_print_revdep(sym->rev_dep.expr, r, yes, " Selected by [y]:\n"); -+ expr_gstr_print_revdep(sym->rev_dep.expr, r, mod, " Selected by [m]:\n"); -+ expr_gstr_print_revdep(sym->rev_dep.expr, r, no, " Selected by [n]:\n"); - } - -- get_symbol_props_str(r, sym, P_IMPLY, _(" Implies: ")); -+ get_symbol_props_str(r, sym, P_IMPLY, " Implies: "); - if (sym->implied.expr) { -- str_append(r, _(" Implied by: ")); -- expr_gstr_print(sym->implied.expr, r); -- str_append(r, "\n"); -+ expr_gstr_print_revdep(sym->implied.expr, r, yes, " Implied by [y]:\n"); -+ expr_gstr_print_revdep(sym->implied.expr, r, mod, " Implied by [m]:\n"); -+ expr_gstr_print_revdep(sym->implied.expr, r, no, " Implied by [n]:\n"); - } - - str_append(r, "\n\n"); -@@ -699,7 +846,7 @@ struct gstr get_relations_str(struct symbol **sym_arr, struct list_head *head) - for (i = 0; sym_arr && (sym = sym_arr[i]); i++) - get_symbol_str(&res, sym, head); - if (!i) -- str_append(&res, _("No matches found.\n")); -+ str_append(&res, "No matches found.\n"); - return res; - } - -@@ -714,7 +861,7 @@ void menu_get_ext_help(struct menu *menu, struct gstr *help) - str_printf(help, "%s%s:\n\n", CONFIG_, sym->name); - help_text = menu_get_help(menu); - } -- str_printf(help, "%s\n", _(help_text)); -+ str_printf(help, "%s\n", help_text); - if (sym) - get_symbol_str(help, sym, NULL); - } -diff --git a/carl9170fw/config/preprocess.c b/carl9170fw/config/preprocess.c -new file mode 100644 -index 0000000..592dfbf ---- /dev/null -+++ b/carl9170fw/config/preprocess.c -@@ -0,0 +1,573 @@ -+// SPDX-License-Identifier: GPL-2.0 -+// -+// Copyright (C) 2018 Masahiro Yamada -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "list.h" -+#include "lkc.h" -+ -+#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) -+ -+static char *expand_string_with_args(const char *in, int argc, char *argv[]); -+ -+static void __attribute__((noreturn)) pperror(const char *format, ...) -+{ -+ va_list ap; -+ -+ fprintf(stderr, "%s:%d: ", current_file->name, yylineno); -+ va_start(ap, format); -+ vfprintf(stderr, format, ap); -+ va_end(ap); -+ fprintf(stderr, "\n"); -+ -+ exit(1); -+} -+ -+/* -+ * Environment variables -+ */ -+static LIST_HEAD(env_list); -+ -+struct env { -+ char *name; -+ char *value; -+ struct list_head node; -+}; -+ -+static void env_add(const char *name, const char *value) -+{ -+ struct env *e; -+ -+ e = xmalloc(sizeof(*e)); -+ e->name = xstrdup(name); -+ e->value = xstrdup(value); -+ -+ list_add_tail(&e->node, &env_list); -+} -+ -+static void env_del(struct env *e) -+{ -+ list_del(&e->node); -+ free(e->name); -+ free(e->value); -+ free(e); -+} -+ -+/* The returned pointer must be freed when done */ -+static char *env_expand(const char *name) -+{ -+ struct env *e; -+ const char *value; -+ -+ if (!*name) -+ return NULL; -+ -+ list_for_each_entry(e, &env_list, node) { -+ if (!strcmp(name, e->name)) -+ return xstrdup(e->value); -+ } -+ -+ value = getenv(name); -+ if (!value) -+ return NULL; -+ -+ /* -+ * We need to remember all referenced environment variables. -+ * They will be written out to include/config/auto.conf.cmd -+ */ -+ env_add(name, value); -+ -+ return xstrdup(value); -+} -+ -+void env_write_dep(FILE *f, const char *autoconfig_name) -+{ -+ struct env *e, *tmp; -+ -+ list_for_each_entry_safe(e, tmp, &env_list, node) { -+ fprintf(f, "ifneq \"$(%s)\" \"%s\"\n", e->name, e->value); -+ fprintf(f, "%s: FORCE\n", autoconfig_name); -+ fprintf(f, "endif\n"); -+ env_del(e); -+ } -+} -+ -+/* -+ * Built-in functions -+ */ -+struct function { -+ const char *name; -+ unsigned int min_args; -+ unsigned int max_args; -+ char *(*func)(int argc, char *argv[]); -+}; -+ -+static char *do_error_if(int argc, char *argv[]) -+{ -+ if (!strcmp(argv[0], "y")) -+ pperror("%s", argv[1]); -+ -+ return NULL; -+} -+ -+static char *do_filename(int argc, char *argv[]) -+{ -+ return xstrdup(current_file->name); -+} -+ -+static char *do_info(int argc, char *argv[]) -+{ -+ printf("%s\n", argv[0]); -+ -+ return xstrdup(""); -+} -+ -+static char *do_lineno(int argc, char *argv[]) -+{ -+ char buf[16]; -+ -+ sprintf(buf, "%d", yylineno); -+ -+ return xstrdup(buf); -+} -+ -+static char *do_shell(int argc, char *argv[]) -+{ -+ FILE *p; -+ char buf[256]; -+ char *cmd; -+ size_t nread; -+ int i; -+ -+ cmd = argv[0]; -+ -+ p = popen(cmd, "r"); -+ if (!p) { -+ perror(cmd); -+ exit(1); -+ } -+ -+ nread = fread(buf, 1, sizeof(buf), p); -+ if (nread == sizeof(buf)) -+ nread--; -+ -+ /* remove trailing new lines */ -+ while (nread > 0 && buf[nread - 1] == '\n') -+ nread--; -+ -+ buf[nread] = 0; -+ -+ /* replace a new line with a space */ -+ for (i = 0; i < nread; i++) { -+ if (buf[i] == '\n') -+ buf[i] = ' '; -+ } -+ -+ if (pclose(p) == -1) { -+ perror(cmd); -+ exit(1); -+ } -+ -+ return xstrdup(buf); -+} -+ -+static char *do_warning_if(int argc, char *argv[]) -+{ -+ if (!strcmp(argv[0], "y")) -+ fprintf(stderr, "%s:%d: %s\n", -+ current_file->name, yylineno, argv[1]); -+ -+ return xstrdup(""); -+} -+ -+static const struct function function_table[] = { -+ /* Name MIN MAX Function */ -+ { "error-if", 2, 2, do_error_if }, -+ { "filename", 0, 0, do_filename }, -+ { "info", 1, 1, do_info }, -+ { "lineno", 0, 0, do_lineno }, -+ { "shell", 1, 1, do_shell }, -+ { "warning-if", 2, 2, do_warning_if }, -+}; -+ -+#define FUNCTION_MAX_ARGS 16 -+ -+static char *function_expand(const char *name, int argc, char *argv[]) -+{ -+ const struct function *f; -+ int i; -+ -+ for (i = 0; i < ARRAY_SIZE(function_table); i++) { -+ f = &function_table[i]; -+ if (strcmp(f->name, name)) -+ continue; -+ -+ if (argc < f->min_args) -+ pperror("too few function arguments passed to '%s'", -+ name); -+ -+ if (argc > f->max_args) -+ pperror("too many function arguments passed to '%s'", -+ name); -+ -+ return f->func(argc, argv); -+ } -+ -+ return NULL; -+} -+ -+/* -+ * Variables (and user-defined functions) -+ */ -+static LIST_HEAD(variable_list); -+ -+struct variable { -+ char *name; -+ char *value; -+ enum variable_flavor flavor; -+ int exp_count; -+ struct list_head node; -+}; -+ -+static struct variable *variable_lookup(const char *name) -+{ -+ struct variable *v; -+ -+ list_for_each_entry(v, &variable_list, node) { -+ if (!strcmp(name, v->name)) -+ return v; -+ } -+ -+ return NULL; -+} -+ -+static char *variable_expand(const char *name, int argc, char *argv[]) -+{ -+ struct variable *v; -+ char *res; -+ -+ v = variable_lookup(name); -+ if (!v) -+ return NULL; -+ -+ if (argc == 0 && v->exp_count) -+ pperror("Recursive variable '%s' references itself (eventually)", -+ name); -+ -+ if (v->exp_count > 1000) -+ pperror("Too deep recursive expansion"); -+ -+ v->exp_count++; -+ -+ if (v->flavor == VAR_RECURSIVE) -+ res = expand_string_with_args(v->value, argc, argv); -+ else -+ res = xstrdup(v->value); -+ -+ v->exp_count--; -+ -+ return res; -+} -+ -+void variable_add(const char *name, const char *value, -+ enum variable_flavor flavor) -+{ -+ struct variable *v; -+ char *new_value; -+ bool append = false; -+ -+ v = variable_lookup(name); -+ if (v) { -+ /* For defined variables, += inherits the existing flavor */ -+ if (flavor == VAR_APPEND) { -+ flavor = v->flavor; -+ append = true; -+ } else { -+ free(v->value); -+ } -+ } else { -+ /* For undefined variables, += assumes the recursive flavor */ -+ if (flavor == VAR_APPEND) -+ flavor = VAR_RECURSIVE; -+ -+ v = xmalloc(sizeof(*v)); -+ v->name = xstrdup(name); -+ v->exp_count = 0; -+ list_add_tail(&v->node, &variable_list); -+ } -+ -+ v->flavor = flavor; -+ -+ if (flavor == VAR_SIMPLE) -+ new_value = expand_string(value); -+ else -+ new_value = xstrdup(value); -+ -+ if (append) { -+ v->value = xrealloc(v->value, -+ strlen(v->value) + strlen(new_value) + 2); -+ strcat(v->value, " "); -+ strcat(v->value, new_value); -+ free(new_value); -+ } else { -+ v->value = new_value; -+ } -+} -+ -+static void variable_del(struct variable *v) -+{ -+ list_del(&v->node); -+ free(v->name); -+ free(v->value); -+ free(v); -+} -+ -+void variable_all_del(void) -+{ -+ struct variable *v, *tmp; -+ -+ list_for_each_entry_safe(v, tmp, &variable_list, node) -+ variable_del(v); -+} -+ -+/* -+ * Evaluate a clause with arguments. argc/argv are arguments from the upper -+ * function call. -+ * -+ * Returned string must be freed when done -+ */ -+static char *eval_clause(const char *str, size_t len, int argc, char *argv[]) -+{ -+ char *tmp, *name, *res, *endptr, *prev, *p; -+ int new_argc = 0; -+ char *new_argv[FUNCTION_MAX_ARGS]; -+ int nest = 0; -+ int i; -+ unsigned long n; -+ -+ tmp = xstrndup(str, len); -+ -+ /* -+ * If variable name is '1', '2', etc. It is generally an argument -+ * from a user-function call (i.e. local-scope variable). If not -+ * available, then look-up global-scope variables. -+ */ -+ n = strtoul(tmp, &endptr, 10); -+ if (!*endptr && n > 0 && n <= argc) { -+ res = xstrdup(argv[n - 1]); -+ goto free_tmp; -+ } -+ -+ prev = p = tmp; -+ -+ /* -+ * Split into tokens -+ * The function name and arguments are separated by a comma. -+ * For example, if the function call is like this: -+ * $(foo,$(x),$(y)) -+ * -+ * The input string for this helper should be: -+ * foo,$(x),$(y) -+ * -+ * and split into: -+ * new_argv[0] = 'foo' -+ * new_argv[1] = '$(x)' -+ * new_argv[2] = '$(y)' -+ */ -+ while (*p) { -+ if (nest == 0 && *p == ',') { -+ *p = 0; -+ if (new_argc >= FUNCTION_MAX_ARGS) -+ pperror("too many function arguments"); -+ new_argv[new_argc++] = prev; -+ prev = p + 1; -+ } else if (*p == '(') { -+ nest++; -+ } else if (*p == ')') { -+ nest--; -+ } -+ -+ p++; -+ } -+ new_argv[new_argc++] = prev; -+ -+ /* -+ * Shift arguments -+ * new_argv[0] represents a function name or a variable name. Put it -+ * into 'name', then shift the rest of the arguments. This simplifies -+ * 'const' handling. -+ */ -+ name = expand_string_with_args(new_argv[0], argc, argv); -+ new_argc--; -+ for (i = 0; i < new_argc; i++) -+ new_argv[i] = expand_string_with_args(new_argv[i + 1], -+ argc, argv); -+ -+ /* Search for variables */ -+ res = variable_expand(name, new_argc, new_argv); -+ if (res) -+ goto free; -+ -+ /* Look for built-in functions */ -+ res = function_expand(name, new_argc, new_argv); -+ if (res) -+ goto free; -+ -+ /* Last, try environment variable */ -+ if (new_argc == 0) { -+ res = env_expand(name); -+ if (res) -+ goto free; -+ } -+ -+ res = xstrdup(""); -+free: -+ for (i = 0; i < new_argc; i++) -+ free(new_argv[i]); -+ free(name); -+free_tmp: -+ free(tmp); -+ -+ return res; -+} -+ -+/* -+ * Expand a string that follows '$' -+ * -+ * For example, if the input string is -+ * ($(FOO)$($(BAR)))$(BAZ) -+ * this helper evaluates -+ * $($(FOO)$($(BAR))) -+ * and returns a new string containing the expansion (note that the string is -+ * recursively expanded), also advancing 'str' to point to the next character -+ * after the corresponding closing parenthesis, in this case, *str will be -+ * $(BAR) -+ */ -+static char *expand_dollar_with_args(const char **str, int argc, char *argv[]) -+{ -+ const char *p = *str; -+ const char *q; -+ int nest = 0; -+ -+ /* -+ * In Kconfig, variable/function references always start with "$(". -+ * Neither single-letter variables as in $A nor curly braces as in ${CC} -+ * are supported. '$' not followed by '(' loses its special meaning. -+ */ -+ if (*p != '(') { -+ *str = p; -+ return xstrdup("$"); -+ } -+ -+ p++; -+ q = p; -+ while (*q) { -+ if (*q == '(') { -+ nest++; -+ } else if (*q == ')') { -+ if (nest-- == 0) -+ break; -+ } -+ q++; -+ } -+ -+ if (!*q) -+ pperror("unterminated reference to '%s': missing ')'", p); -+ -+ /* Advance 'str' to after the expanded initial portion of the string */ -+ *str = q + 1; -+ -+ return eval_clause(p, q - p, argc, argv); -+} -+ -+char *expand_dollar(const char **str) -+{ -+ return expand_dollar_with_args(str, 0, NULL); -+} -+ -+static char *__expand_string(const char **str, bool (*is_end)(char c), -+ int argc, char *argv[]) -+{ -+ const char *in, *p; -+ char *expansion, *out; -+ size_t in_len, out_len; -+ -+ out = xmalloc(1); -+ *out = 0; -+ out_len = 1; -+ -+ p = in = *str; -+ -+ while (1) { -+ if (*p == '$') { -+ in_len = p - in; -+ p++; -+ expansion = expand_dollar_with_args(&p, argc, argv); -+ out_len += in_len + strlen(expansion); -+ out = xrealloc(out, out_len); -+ strncat(out, in, in_len); -+ strcat(out, expansion); -+ free(expansion); -+ in = p; -+ continue; -+ } -+ -+ if (is_end(*p)) -+ break; -+ -+ p++; -+ } -+ -+ in_len = p - in; -+ out_len += in_len; -+ out = xrealloc(out, out_len); -+ strncat(out, in, in_len); -+ -+ /* Advance 'str' to the end character */ -+ *str = p; -+ -+ return out; -+} -+ -+static bool is_end_of_str(char c) -+{ -+ return !c; -+} -+ -+/* -+ * Expand variables and functions in the given string. Undefined variables -+ * expand to an empty string. -+ * The returned string must be freed when done. -+ */ -+static char *expand_string_with_args(const char *in, int argc, char *argv[]) -+{ -+ return __expand_string(&in, is_end_of_str, argc, argv); -+} -+ -+char *expand_string(const char *in) -+{ -+ return expand_string_with_args(in, 0, NULL); -+} -+ -+static bool is_end_of_token(char c) -+{ -+ return !(isalnum(c) || c == '_' || c == '-'); -+} -+ -+/* -+ * Expand variables in a token. The parsing stops when a token separater -+ * (in most cases, it is a whitespace) is encountered. 'str' is updated to -+ * point to the next character. -+ * -+ * The returned string must be freed when done. -+ */ -+char *expand_one_token(const char **str) -+{ -+ return __expand_string(str, is_end_of_token, 0, NULL); -+} -diff --git a/carl9170fw/config/symbol.c b/carl9170fw/config/symbol.c -index 3c8bd9b..1f9266d 100644 ---- a/carl9170fw/config/symbol.c -+++ b/carl9170fw/config/symbol.c -@@ -1,6 +1,6 @@ -+// SPDX-License-Identifier: GPL-2.0 - /* - * Copyright (C) 2002 Roman Zippel -- * Released under the terms of the GNU GPL v2.0. - */ - - #include -@@ -33,33 +33,6 @@ struct symbol *sym_defconfig_list; - struct symbol *modules_sym; - tristate modules_val; - --struct expr *sym_env_list; -- --static void sym_add_default(struct symbol *sym, const char *def) --{ -- struct property *prop = prop_alloc(P_DEFAULT, sym); -- -- prop->expr = expr_alloc_symbol(sym_lookup(def, SYMBOL_CONST)); --} -- --void sym_init(void) --{ -- struct symbol *sym; -- struct utsname uts; -- static bool inited = false; -- -- if (inited) -- return; -- inited = true; -- -- uname(&uts); -- -- sym = sym_lookup("UNAME_RELEASE", 0); -- sym->type = S_STRING; -- sym->flags |= SYMBOL_AUTO; -- sym_add_default(sym, uts.release); --} -- - enum symbol_type sym_get_type(struct symbol *sym) - { - enum symbol_type type = sym->type; -@@ -77,7 +50,7 @@ const char *sym_type_name(enum symbol_type type) - { - switch (type) { - case S_BOOLEAN: -- return "boolean"; -+ return "bool"; - case S_TRISTATE: - return "tristate"; - case S_INT: -@@ -88,8 +61,6 @@ const char *sym_type_name(enum symbol_type type) - return "string"; - case S_UNKNOWN: - return "unknown"; -- case S_OTHER: -- break; - } - return "???"; - } -@@ -103,15 +74,6 @@ struct property *sym_get_choice_prop(struct symbol *sym) - return NULL; - } - --struct property *sym_get_env_prop(struct symbol *sym) --{ -- struct property *prop; -- -- for_all_properties(sym, prop, P_ENV) -- return prop; -- return NULL; --} -- - static struct property *sym_get_default_prop(struct symbol *sym) - { - struct property *prop; -@@ -124,7 +86,7 @@ static struct property *sym_get_default_prop(struct symbol *sym) - return NULL; - } - --static struct property *sym_get_range_prop(struct symbol *sym) -+struct property *sym_get_range_prop(struct symbol *sym) - { - struct property *prop; - -@@ -183,7 +145,7 @@ static void sym_validate_range(struct symbol *sym) - sprintf(str, "%lld", val2); - else - sprintf(str, "0x%llx", val2); -- sym->curr.val = strdup(str); -+ sym->curr.val = xstrdup(str); - } - - static void sym_set_changed(struct symbol *sym) -@@ -243,7 +205,7 @@ static void sym_calc_visibility(struct symbol *sym) - tri = yes; - if (sym->dir_dep.expr) - tri = expr_calc_value(sym->dir_dep.expr); -- if (tri == mod) -+ if (tri == mod && sym_get_type(sym) == S_BOOLEAN) - tri = yes; - if (sym->dir_dep.tri != tri) { - sym->dir_dep.tri = tri; -@@ -333,6 +295,27 @@ static struct symbol *sym_calc_choice(struct symbol *sym) - return def_sym; - } - -+static void sym_warn_unmet_dep(struct symbol *sym) -+{ -+ struct gstr gs = str_new(); -+ -+ str_printf(&gs, -+ "\nWARNING: unmet direct dependencies detected for %s\n", -+ sym->name); -+ str_printf(&gs, -+ " Depends on [%c]: ", -+ sym->dir_dep.tri == mod ? 'm' : 'n'); -+ expr_gstr_print(sym->dir_dep.expr, &gs); -+ str_printf(&gs, "\n"); -+ -+ expr_gstr_print_revdep(sym->rev_dep.expr, &gs, yes, -+ " Selected by [y]:\n"); -+ expr_gstr_print_revdep(sym->rev_dep.expr, &gs, mod, -+ " Selected by [m]:\n"); -+ -+ fputs(str_get(&gs), stderr); -+} -+ - void sym_calc_value(struct symbol *sym) - { - struct symbol_value newval, oldval; -@@ -371,11 +354,13 @@ void sym_calc_value(struct symbol *sym) - sym->curr.tri = no; - return; - } -- if (!sym_is_choice_value(sym)) -- sym->flags &= ~SYMBOL_WRITE; -+ sym->flags &= ~SYMBOL_WRITE; - - sym_calc_visibility(sym); - -+ if (sym->visible != no) -+ sym->flags |= SYMBOL_WRITE; -+ - /* set default if recursively called */ - sym->curr = newval; - -@@ -390,7 +375,6 @@ void sym_calc_value(struct symbol *sym) - /* if the symbol is visible use the user value - * if available, otherwise try the default value - */ -- sym->flags |= SYMBOL_WRITE; - if (sym_has_value(sym)) { - newval.tri = EXPR_AND(sym->def[S_DEF_USER].tri, - sym->visible); -@@ -402,9 +386,10 @@ void sym_calc_value(struct symbol *sym) - if (!sym_is_choice(sym)) { - prop = sym_get_default_prop(sym); - if (prop) { -- sym->flags |= SYMBOL_WRITE; - newval.tri = EXPR_AND(expr_calc_value(prop->expr), - prop->visible.tri); -+ if (newval.tri != no) -+ sym->flags |= SYMBOL_WRITE; - } - if (sym->implied.tri != no) { - sym->flags |= SYMBOL_WRITE; -@@ -412,18 +397,8 @@ void sym_calc_value(struct symbol *sym) - } - } - calc_newval: -- if (sym->dir_dep.tri == no && sym->rev_dep.tri != no) { -- struct expr *e; -- e = expr_simplify_unmet_dep(sym->rev_dep.expr, -- sym->dir_dep.expr); -- fprintf(stderr, "warning: ("); -- expr_fprint(e, stderr); -- fprintf(stderr, ") selects %s which has unmet direct dependencies (", -- sym->name); -- expr_fprint(sym->dir_dep.expr, stderr); -- fprintf(stderr, ")\n"); -- expr_free(e); -- } -+ if (sym->dir_dep.tri < sym->rev_dep.tri) -+ sym_warn_unmet_dep(sym); - newval.tri = EXPR_OR(newval.tri, sym->rev_dep.tri); - } - if (newval.tri == mod && -@@ -433,12 +408,9 @@ void sym_calc_value(struct symbol *sym) - case S_STRING: - case S_HEX: - case S_INT: -- if (sym->visible != no) { -- sym->flags |= SYMBOL_WRITE; -- if (sym_has_value(sym)) { -- newval.val = sym->def[S_DEF_USER].val; -- break; -- } -+ if (sym->visible != no && sym_has_value(sym)) { -+ newval.val = sym->def[S_DEF_USER].val; -+ break; - } - prop = sym_get_default_prop(sym); - if (prop) { -@@ -480,7 +452,7 @@ void sym_calc_value(struct symbol *sym) - } - } - -- if (sym->flags & SYMBOL_AUTO) -+ if (sym->flags & SYMBOL_NO_WRITE) - sym->flags &= ~SYMBOL_WRITE; - - if (sym->flags & SYMBOL_NEED_SET_CHOICE_VALUES) -@@ -783,7 +755,6 @@ const char *sym_get_string_default(struct symbol *sym) - return str; - case S_STRING: - return str; -- case S_OTHER: - case S_UNKNOWN: - break; - } -@@ -851,7 +822,7 @@ struct symbol *sym_lookup(const char *name, int flags) - : !(symbol->flags & (SYMBOL_CONST|SYMBOL_CHOICE)))) - return symbol; - } -- new_name = strdup(name); -+ new_name = xstrdup(name); - } else { - new_name = NULL; - hash = 0; -@@ -896,55 +867,6 @@ struct symbol *sym_find(const char *name) - return symbol; - } - --/* -- * Expand symbol's names embedded in the string given in argument. Symbols' -- * name to be expanded shall be prefixed by a '$'. Unknown symbol expands to -- * the empty string. -- */ --const char *sym_expand_string_value(const char *in) --{ -- const char *src; -- char *res; -- size_t reslen; -- -- reslen = strlen(in) + 1; -- res = xmalloc(reslen); -- res[0] = '\0'; -- -- while ((src = strchr(in, '$'))) { -- char *p, name[SYMBOL_MAXLENGTH]; -- const char *symval = ""; -- struct symbol *sym; -- size_t newlen; -- -- strncat(res, in, src - in); -- src++; -- -- p = name; -- while (isalnum(*src) || *src == '_') -- *p++ = *src++; -- *p = '\0'; -- -- sym = sym_find(name); -- if (sym != NULL) { -- sym_calc_value(sym); -- symval = sym_get_string_value(sym); -- } -- -- newlen = strlen(res) + strlen(symval) + strlen(src) + 1; -- if (newlen > reslen) { -- reslen = newlen; -- res = realloc(res, reslen); -- } -- -- strcat(res, symval); -- in = src; -- } -- strcat(res, in); -- -- return res; --} -- - const char *sym_escape_string_value(const char *in) - { - const char *p; -@@ -1086,7 +1008,7 @@ static struct dep_stack { - struct dep_stack *prev, *next; - struct symbol *sym; - struct property *prop; -- struct expr *expr; -+ struct expr **expr; - } *check_top; - - static void dep_stack_insert(struct dep_stack *stack, struct symbol *sym) -@@ -1150,37 +1072,52 @@ static void sym_check_print_recursive(struct symbol *last_sym) - if (stack->sym == last_sym) - fprintf(stderr, "%s:%d:error: recursive dependency detected!\n", - prop->file->name, prop->lineno); -- fprintf(stderr, "For a resolution refer to Documentation/kbuild/kconfig-language.txt\n"); -- fprintf(stderr, "subsection \"Kconfig recursive dependency limitations\"\n"); -- if (stack->expr) { -- fprintf(stderr, "%s:%d:\tsymbol %s %s value contains %s\n", -- prop->file->name, prop->lineno, -+ -+ if (sym_is_choice(sym)) { -+ fprintf(stderr, "%s:%d:\tchoice %s contains symbol %s\n", -+ menu->file->name, menu->lineno, - sym->name ? sym->name : "", -- prop_get_type_name(prop->type), - next_sym->name ? next_sym->name : ""); -- } else if (stack->prop) { -+ } else if (sym_is_choice_value(sym)) { -+ fprintf(stderr, "%s:%d:\tsymbol %s is part of choice %s\n", -+ menu->file->name, menu->lineno, -+ sym->name ? sym->name : "", -+ next_sym->name ? next_sym->name : ""); -+ } else if (stack->expr == &sym->dir_dep.expr) { - fprintf(stderr, "%s:%d:\tsymbol %s depends on %s\n", - prop->file->name, prop->lineno, - sym->name ? sym->name : "", - next_sym->name ? next_sym->name : ""); -- } else if (sym_is_choice(sym)) { -- fprintf(stderr, "%s:%d:\tchoice %s contains symbol %s\n", -- menu->file->name, menu->lineno, -+ } else if (stack->expr == &sym->rev_dep.expr) { -+ fprintf(stderr, "%s:%d:\tsymbol %s is selected by %s\n", -+ prop->file->name, prop->lineno, - sym->name ? sym->name : "", - next_sym->name ? next_sym->name : ""); -- } else if (sym_is_choice_value(sym)) { -- fprintf(stderr, "%s:%d:\tsymbol %s is part of choice %s\n", -- menu->file->name, menu->lineno, -+ } else if (stack->expr == &sym->implied.expr) { -+ fprintf(stderr, "%s:%d:\tsymbol %s is implied by %s\n", -+ prop->file->name, prop->lineno, -+ sym->name ? sym->name : "", -+ next_sym->name ? next_sym->name : ""); -+ } else if (stack->expr) { -+ fprintf(stderr, "%s:%d:\tsymbol %s %s value contains %s\n", -+ prop->file->name, prop->lineno, - sym->name ? sym->name : "", -+ prop_get_type_name(prop->type), - next_sym->name ? next_sym->name : ""); - } else { -- fprintf(stderr, "%s:%d:\tsymbol %s is selected by %s\n", -+ fprintf(stderr, "%s:%d:\tsymbol %s %s is visible depending on %s\n", - prop->file->name, prop->lineno, - sym->name ? sym->name : "", -+ prop_get_type_name(prop->type), - next_sym->name ? next_sym->name : ""); - } - } - -+ fprintf(stderr, -+ "For a resolution refer to Documentation/kbuild/kconfig-language.txt\n" -+ "subsection \"Kconfig recursive dependency limitations\"\n" -+ "\n"); -+ - if (check_top == &cv_stack) - dep_stack_remove(); - } -@@ -1215,7 +1152,7 @@ static struct symbol *sym_check_expr_deps(struct expr *e) - default: - break; - } -- printf("Oops! How to check %d?\n", e->type); -+ fprintf(stderr, "Oops! How to check %d?\n", e->type); - return NULL; - } - -@@ -1228,12 +1165,26 @@ static struct symbol *sym_check_sym_deps(struct symbol *sym) - - dep_stack_insert(&stack, sym); - -+ stack.expr = &sym->dir_dep.expr; -+ sym2 = sym_check_expr_deps(sym->dir_dep.expr); -+ if (sym2) -+ goto out; -+ -+ stack.expr = &sym->rev_dep.expr; - sym2 = sym_check_expr_deps(sym->rev_dep.expr); - if (sym2) - goto out; - -+ stack.expr = &sym->implied.expr; -+ sym2 = sym_check_expr_deps(sym->implied.expr); -+ if (sym2) -+ goto out; -+ -+ stack.expr = NULL; -+ - for (prop = sym->prop; prop; prop = prop->next) { -- if (prop->type == P_CHOICE || prop->type == P_SELECT) -+ if (prop->type == P_CHOICE || prop->type == P_SELECT || -+ prop->type == P_IMPLY) - continue; - stack.prop = prop; - sym2 = sym_check_expr_deps(prop->visible.expr); -@@ -1241,7 +1192,7 @@ static struct symbol *sym_check_sym_deps(struct symbol *sym) - break; - if (prop->type != P_DEFAULT || sym_is_choice(sym)) - continue; -- stack.expr = prop->expr; -+ stack.expr = &prop->expr; - sym2 = sym_check_expr_deps(prop->expr); - if (sym2) - break; -@@ -1319,9 +1270,6 @@ struct symbol *sym_check_deps(struct symbol *sym) - sym->flags &= ~SYMBOL_CHECK; - } - -- if (sym2 && sym2 == sym) -- sym2 = NULL; -- - return sym2; - } - -@@ -1360,8 +1308,6 @@ const char *prop_get_type_name(enum prop_type type) - switch (type) { - case P_PROMPT: - return "prompt"; -- case P_ENV: -- return "env"; - case P_COMMENT: - return "comment"; - case P_MENU: -@@ -1383,32 +1329,3 @@ const char *prop_get_type_name(enum prop_type type) - } - return "unknown"; - } -- --static void prop_add_env(const char *env) --{ -- struct symbol *sym, *sym2; -- struct property *prop; -- char *p; -- -- sym = current_entry->sym; -- sym->flags |= SYMBOL_AUTO; -- for_all_properties(sym, prop, P_ENV) { -- sym2 = prop_get_symbol(prop); -- if (strcmp(sym2->name, env)) -- menu_warn(current_entry, "redefining environment symbol from %s", -- sym2->name); -- return; -- } -- -- prop = prop_alloc(P_ENV, sym); -- prop->expr = expr_alloc_symbol(sym_lookup(env, SYMBOL_CONST)); -- -- sym_env_list = expr_alloc_one(E_LIST, sym_env_list); -- sym_env_list->right.sym = sym; -- -- p = getenv(env); -- if (p) -- sym_add_default(sym, p); -- else -- menu_warn(current_entry, "environment variable %s undefined", env); --} -diff --git a/carl9170fw/config/util.c b/carl9170fw/config/util.c -index 0e76042..2958539 100644 ---- a/carl9170fw/config/util.c -+++ b/carl9170fw/config/util.c -@@ -1,8 +1,7 @@ -+// SPDX-License-Identifier: GPL-2.0 - /* - * Copyright (C) 2002-2005 Roman Zippel - * Copyright (C) 2002-2005 Sam Ravnborg -- * -- * Released under the terms of the GNU GPL v2.0. - */ - - #include -@@ -14,69 +13,21 @@ - struct file *file_lookup(const char *name) - { - struct file *file; -- const char *file_name = sym_expand_string_value(name); - - for (file = file_list; file; file = file->next) { - if (!strcmp(name, file->name)) { -- free((void *)file_name); - return file; - } - } - - file = xmalloc(sizeof(*file)); - memset(file, 0, sizeof(*file)); -- file->name = file_name; -+ file->name = xstrdup(name); - file->next = file_list; - file_list = file; - return file; - } - --/* write a dependency file as used by kbuild to track dependencies */ --int file_write_dep(const char *name) --{ -- struct symbol *sym, *env_sym; -- struct expr *e; -- struct file *file; -- FILE *out; -- -- if (!name) -- name = ".kconfig.d"; -- out = fopen("..config.tmp", "w"); -- if (!out) -- return 1; -- fprintf(out, "deps_config := \\\n"); -- for (file = file_list; file; file = file->next) { -- if (file->next) -- fprintf(out, "\t%s \\\n", file->name); -- else -- fprintf(out, "\t%s\n", file->name); -- } -- fprintf(out, "\n%s: \\\n" -- "\t$(deps_config)\n\n", conf_get_autoconfig_name()); -- -- expr_list_for_each_sym(sym_env_list, e, sym) { -- struct property *prop; -- const char *value; -- -- prop = sym_get_env_prop(sym); -- env_sym = prop_get_symbol(prop); -- if (!env_sym) -- continue; -- value = getenv(env_sym->name); -- if (!value) -- value = ""; -- fprintf(out, "ifneq \"$(%s)\" \"%s\"\n", env_sym->name, value); -- fprintf(out, "%s: FORCE\n", conf_get_autoconfig_name()); -- fprintf(out, "endif\n"); -- } -- -- fprintf(out, "\n$(deps_config): ;\n"); -- fclose(out); -- rename("..config.tmp", name); -- return 0; --} -- -- - /* Allocate initial growable string */ - struct gstr str_new(void) - { -@@ -104,7 +55,7 @@ void str_append(struct gstr *gs, const char *s) - if (s) { - l = strlen(gs->s) + strlen(s) + 1; - if (l > gs->len) { -- gs->s = realloc(gs->s, l); -+ gs->s = xrealloc(gs->s, l); - gs->len = l; - } - strcat(gs->s, s); -@@ -145,3 +96,34 @@ void *xcalloc(size_t nmemb, size_t size) - fprintf(stderr, "Out of memory.\n"); - exit(1); - } -+ -+void *xrealloc(void *p, size_t size) -+{ -+ p = realloc(p, size); -+ if (p) -+ return p; -+ fprintf(stderr, "Out of memory.\n"); -+ exit(1); -+} -+ -+char *xstrdup(const char *s) -+{ -+ char *p; -+ -+ p = strdup(s); -+ if (p) -+ return p; -+ fprintf(stderr, "Out of memory.\n"); -+ exit(1); -+} -+ -+char *xstrndup(const char *s, size_t n) -+{ -+ char *p; -+ -+ p = strndup(s, n); -+ if (p) -+ return p; -+ fprintf(stderr, "Out of memory.\n"); -+ exit(1); -+} -diff --git a/carl9170fw/config/zconf.l b/carl9170fw/config/zconf.l -index 9720530..c52cce8 100644 ---- a/carl9170fw/config/zconf.l -+++ b/carl9170fw/config/zconf.l -@@ -1,13 +1,13 @@ --%option nostdinit noyywrap never-interactive full ecs --%option 8bit nodefault perf-report perf-report --%option noinput --%x COMMAND HELP STRING PARAM --%{ -+/* SPDX-License-Identifier: GPL-2.0 */ - /* - * Copyright (C) 2002 Roman Zippel -- * Released under the terms of the GNU GPL v2.0. - */ -+%option nostdinit noyywrap never-interactive full ecs -+%option 8bit nodefault yylineno -+%x ASSIGN_VAL HELP STRING -+%{ - -+#include - #include - #include - #include -@@ -15,6 +15,9 @@ - #include - - #include "lkc.h" -+#include "zconf.tab.h" -+ -+#define YY_DECL static int yylex1(void) - - #define START_STRSIZE 16 - -@@ -23,6 +26,8 @@ static struct { - int lineno; - } current_pos; - -+static int prev_prev_token = T_EOL; -+static int prev_token = T_EOL; - static char *text; - static int text_size, text_asize; - -@@ -35,6 +40,8 @@ struct buffer *current_buf; - - static int last_ts, first_ts; - -+static char *expand_token(const char *in, size_t n); -+static void append_expanded_string(const char *in); - static void zconf_endhelp(void); - static void zconf_endfile(void); - -@@ -52,7 +59,7 @@ static void append_string(const char *str, int size) - if (new_size > text_asize) { - new_size += START_STRSIZE - 1; - new_size &= -START_STRSIZE; -- text = realloc(text, new_size); -+ text = xrealloc(text, new_size); - text_asize = new_size; - } - memcpy(text + text_size, str, size); -@@ -71,7 +78,7 @@ static void warn_ignored_character(char chr) - { - fprintf(stderr, - "%s:%d:warning: ignoring unsupported character '%c'\n", -- zconf_curname(), zconf_lineno(), chr); -+ current_file->name, yylineno, chr); - } - %} - -@@ -81,116 +88,113 @@ n [A-Za-z0-9_-] - int str = 0; - int ts, i; - --[ \t]*#.*\n | --[ \t]*\n { -- current_file->lineno++; -- return T_EOL; --} --[ \t]*#.* -- -- --[ \t]+ { -- BEGIN(COMMAND); --} -- --. { -- unput(yytext[0]); -- BEGIN(COMMAND); --} -- -- --{ -- {n}+ { -- const struct kconf_id *id = kconf_id_lookup(yytext, yyleng); -- BEGIN(PARAM); -- current_pos.file = current_file; -- current_pos.lineno = current_file->lineno; -- if (id && id->flags & TF_COMMAND) { -- zconflval.id = id; -- return id->token; -- } -- alloc_string(yytext, yyleng); -- zconflval.string = text; -- return T_WORD; -- } -- . warn_ignored_character(*yytext); -- \n { -- BEGIN(INITIAL); -- current_file->lineno++; -- return T_EOL; -- } --} -+#.* /* ignore comment */ -+[ \t]* /* whitespaces */ -+\\\n /* escaped new line */ -+\n return T_EOL; -+"allnoconfig_y" return T_ALLNOCONFIG_Y; -+"bool" return T_BOOL; -+"choice" return T_CHOICE; -+"comment" return T_COMMENT; -+"config" return T_CONFIG; -+"def_bool" return T_DEF_BOOL; -+"def_tristate" return T_DEF_TRISTATE; -+"default" return T_DEFAULT; -+"defconfig_list" return T_DEFCONFIG_LIST; -+"depends" return T_DEPENDS; -+"endchoice" return T_ENDCHOICE; -+"endif" return T_ENDIF; -+"endmenu" return T_ENDMENU; -+"help"|"---help---" return T_HELP; -+"hex" return T_HEX; -+"if" return T_IF; -+"imply" return T_IMPLY; -+"int" return T_INT; -+"mainmenu" return T_MAINMENU; -+"menu" return T_MENU; -+"menuconfig" return T_MENUCONFIG; -+"modules" return T_MODULES; -+"on" return T_ON; -+"option" return T_OPTION; -+"optional" return T_OPTIONAL; -+"prompt" return T_PROMPT; -+"range" return T_RANGE; -+"select" return T_SELECT; -+"source" return T_SOURCE; -+"string" return T_STRING; -+"tristate" return T_TRISTATE; -+"visible" return T_VISIBLE; -+"||" return T_OR; -+"&&" return T_AND; -+"=" return T_EQUAL; -+"!=" return T_UNEQUAL; -+"<" return T_LESS; -+"<=" return T_LESS_EQUAL; -+">" return T_GREATER; -+">=" return T_GREATER_EQUAL; -+"!" return T_NOT; -+"(" return T_OPEN_PAREN; -+")" return T_CLOSE_PAREN; -+":=" return T_COLON_EQUAL; -+"+=" return T_PLUS_EQUAL; -+\"|\' { -+ str = yytext[0]; -+ new_string(); -+ BEGIN(STRING); -+ } -+{n}+ { -+ alloc_string(yytext, yyleng); -+ yylval.string = text; -+ return T_WORD; -+ } -+({n}|$)+ { -+ /* this token includes at least one '$' */ -+ yylval.string = expand_token(yytext, yyleng); -+ if (strlen(yylval.string)) -+ return T_WORD; -+ free(yylval.string); -+ } -+. warn_ignored_character(*yytext); - --{ -- "&&" return T_AND; -- "||" return T_OR; -- "(" return T_OPEN_PAREN; -- ")" return T_CLOSE_PAREN; -- "!" return T_NOT; -- "=" return T_EQUAL; -- "!=" return T_UNEQUAL; -- "<=" return T_LESS_EQUAL; -- ">=" return T_GREATER_EQUAL; -- "<" return T_LESS; -- ">" return T_GREATER; -- \"|\' { -- str = yytext[0]; -- new_string(); -- BEGIN(STRING); -- } -- \n BEGIN(INITIAL); current_file->lineno++; return T_EOL; -- ({n}|[/.])+ { -- const struct kconf_id *id = kconf_id_lookup(yytext, yyleng); -- if (id && id->flags & TF_PARAM) { -- zconflval.id = id; -- return id->token; -- } -+{ -+ [^[:blank:]\n]+.* { - alloc_string(yytext, yyleng); -- zconflval.string = text; -- return T_WORD; -- } -- #.* /* comment */ -- \\\n current_file->lineno++; -- [[:blank:]]+ -- . warn_ignored_character(*yytext); -- <> { -- BEGIN(INITIAL); -+ yylval.string = text; -+ return T_ASSIGN_VAL; - } -+ \n { BEGIN(INITIAL); return T_EOL; } -+ . - } - - { -- [^'"\\\n]+/\n { -- append_string(yytext, yyleng); -- zconflval.string = text; -- return T_WORD_QUOTE; -- } -- [^'"\\\n]+ { -+ "$".* append_expanded_string(yytext); -+ [^$'"\\\n]+ { - append_string(yytext, yyleng); - } -- \\.?/\n { -- append_string(yytext + 1, yyleng - 1); -- zconflval.string = text; -- return T_WORD_QUOTE; -- } - \\.? { - append_string(yytext + 1, yyleng - 1); - } - \'|\" { - if (str == yytext[0]) { -- BEGIN(PARAM); -- zconflval.string = text; -+ BEGIN(INITIAL); -+ yylval.string = text; - return T_WORD_QUOTE; - } else - append_string(yytext, 1); - } - \n { -- printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno()); -- current_file->lineno++; -+ fprintf(stderr, -+ "%s:%d:warning: multi-line strings not supported\n", -+ zconf_curname(), zconf_lineno()); -+ unput('\n'); - BEGIN(INITIAL); -- return T_EOL; -+ yylval.string = text; -+ return T_WORD_QUOTE; - } - <> { - BEGIN(INITIAL); -+ yylval.string = text; -+ return T_WORD_QUOTE; - } - } - -@@ -218,12 +222,10 @@ n [A-Za-z0-9_-] - } - } - [ \t]*\n/[^ \t\n] { -- current_file->lineno++; - zconf_endhelp(); - return T_HELPTEXT; - } - [ \t]*\n { -- current_file->lineno++; - append_string("\n", 1); - } - [^ \t\n].* { -@@ -243,6 +245,12 @@ n [A-Za-z0-9_-] - } - - <> { -+ BEGIN(INITIAL); -+ -+ if (prev_token != T_EOL && prev_token != T_HELPTEXT) -+ fprintf(stderr, "%s:%d:warning: no new line at end of file\n", -+ current_file->name, yylineno); -+ - if (current_file) { - zconf_endfile(); - return T_EOL; -@@ -252,6 +260,93 @@ n [A-Za-z0-9_-] - } - - %% -+ -+/* second stage lexer */ -+int yylex(void) -+{ -+ int token; -+ -+repeat: -+ token = yylex1(); -+ -+ if (prev_token == T_EOL || prev_token == T_HELPTEXT) { -+ if (token == T_EOL) { -+ /* Do not pass unneeded T_EOL to the parser. */ -+ goto repeat; -+ } else { -+ /* -+ * For the parser, update file/lineno at the first token -+ * of each statement. Generally, \n is a statement -+ * terminator in Kconfig, but it is not always true -+ * because \n could be escaped by a backslash. -+ */ -+ current_pos.file = current_file; -+ current_pos.lineno = yylineno; -+ } -+ } -+ -+ if (prev_prev_token == T_EOL && prev_token == T_WORD && -+ (token == T_EQUAL || token == T_COLON_EQUAL || token == T_PLUS_EQUAL)) -+ BEGIN(ASSIGN_VAL); -+ -+ prev_prev_token = prev_token; -+ prev_token = token; -+ -+ return token; -+} -+ -+static char *expand_token(const char *in, size_t n) -+{ -+ char *out; -+ int c; -+ char c2; -+ const char *rest, *end; -+ -+ new_string(); -+ append_string(in, n); -+ -+ /* get the whole line because we do not know the end of token. */ -+ while ((c = input()) != EOF) { -+ if (c == '\n') { -+ unput(c); -+ break; -+ } -+ c2 = c; -+ append_string(&c2, 1); -+ } -+ -+ rest = text; -+ out = expand_one_token(&rest); -+ -+ /* push back unused characters to the input stream */ -+ end = rest + strlen(rest); -+ while (end > rest) -+ unput(*--end); -+ -+ free(text); -+ -+ return out; -+} -+ -+static void append_expanded_string(const char *str) -+{ -+ const char *end; -+ char *res; -+ -+ str++; -+ -+ res = expand_dollar(&str); -+ -+ /* push back unused characters to the input stream */ -+ end = str + strlen(str); -+ while (end > str) -+ unput(*--end); -+ -+ append_string(res, strlen(res)); -+ -+ free(res); -+} -+ - void zconf_starthelp(void) - { - new_string(); -@@ -261,7 +356,7 @@ void zconf_starthelp(void) - - static void zconf_endhelp(void) - { -- zconflval.string = text; -+ yylval.string = text; - BEGIN(INITIAL); - } - -@@ -294,7 +389,7 @@ void zconf_initscan(const char *name) - { - yyin = zconf_fopen(name); - if (!yyin) { -- printf("can't find file %s\n", name); -+ fprintf(stderr, "can't find file %s\n", name); - exit(1); - } - -@@ -302,7 +397,7 @@ void zconf_initscan(const char *name) - memset(current_buf, 0, sizeof(*current_buf)); - - current_file = file_lookup(name); -- current_file->lineno = 1; -+ yylineno = 1; - } - - void zconf_nextfile(const char *name) -@@ -315,35 +410,34 @@ void zconf_nextfile(const char *name) - current_buf->state = YY_CURRENT_BUFFER; - yyin = zconf_fopen(file->name); - if (!yyin) { -- printf("%s:%d: can't open file \"%s\"\n", -- zconf_curname(), zconf_lineno(), file->name); -+ fprintf(stderr, "%s:%d: can't open file \"%s\"\n", -+ zconf_curname(), zconf_lineno(), file->name); - exit(1); - } - yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE)); - buf->parent = current_buf; - current_buf = buf; - -- for (iter = current_file->parent; iter; iter = iter->parent ) { -- if (!strcmp(current_file->name,iter->name) ) { -- printf("%s:%d: recursive inclusion detected. " -- "Inclusion path:\n current file : '%s'\n", -- zconf_curname(), zconf_lineno(), -- zconf_curname()); -- iter = current_file->parent; -- while (iter && \ -- strcmp(iter->name,current_file->name)) { -- printf(" included from: '%s:%d'\n", -- iter->name, iter->lineno-1); -+ current_file->lineno = yylineno; -+ file->parent = current_file; -+ -+ for (iter = current_file; iter; iter = iter->parent) { -+ if (!strcmp(iter->name, file->name)) { -+ fprintf(stderr, -+ "Recursive inclusion detected.\n" -+ "Inclusion path:\n" -+ " current file : %s\n", file->name); -+ iter = file; -+ do { - iter = iter->parent; -- } -- if (iter) -- printf(" included from: '%s:%d'\n", -- iter->name, iter->lineno+1); -+ fprintf(stderr, " included from: %s:%d\n", -+ iter->name, iter->lineno - 1); -+ } while (strcmp(iter->name, file->name)); - exit(1); - } - } -- file->lineno = 1; -- file->parent = current_file; -+ -+ yylineno = 1; - current_file = file; - } - -@@ -352,6 +446,8 @@ static void zconf_endfile(void) - struct buffer *parent; - - current_file = current_file->parent; -+ if (current_file) -+ yylineno = current_file->lineno; - - parent = current_buf->parent; - if (parent) { -diff --git a/carl9170fw/config/zconf.y b/carl9170fw/config/zconf.y -index 79c4f04..60936c7 100644 ---- a/carl9170fw/config/zconf.y -+++ b/carl9170fw/config/zconf.y -@@ -1,8 +1,8 @@ --%{ -+/* SPDX-License-Identifier: GPL-2.0 */ - /* - * Copyright (C) 2002 Roman Zippel -- * Released under the terms of the GNU GPL v2.0. - */ -+%{ - - #include - #include -@@ -20,63 +20,69 @@ - - int cdebug = PRINTD; - --extern int zconflex(void); -+static void yyerror(const char *err); - static void zconfprint(const char *err, ...); - static void zconf_error(const char *err, ...); --static void zconferror(const char *err); --static bool zconf_endtoken(const struct kconf_id *id, int starttoken, int endtoken); -+static bool zconf_endtoken(const char *tokenname, -+ const char *expected_tokenname); - - struct symbol *symbol_hash[SYMBOL_HASHSIZE]; - - static struct menu *current_menu, *current_entry; - - %} --%expect 32 - - %union - { - char *string; -- struct file *file; - struct symbol *symbol; - struct expr *expr; - struct menu *menu; -- const struct kconf_id *id; -+ enum symbol_type type; -+ enum variable_flavor flavor; - } - --%token T_MAINMENU --%token T_MENU --%token T_ENDMENU --%token T_SOURCE --%token T_CHOICE --%token T_ENDCHOICE --%token T_COMMENT --%token T_CONFIG --%token T_MENUCONFIG --%token T_HELP - %token T_HELPTEXT --%token T_IF --%token T_ENDIF --%token T_DEPENDS --%token T_OPTIONAL --%token T_PROMPT --%token T_TYPE --%token T_DEFAULT --%token T_SELECT --%token T_IMPLY --%token T_RANGE --%token T_VISIBLE --%token T_OPTION --%token T_ON - %token T_WORD - %token T_WORD_QUOTE --%token T_UNEQUAL --%token T_LESS --%token T_LESS_EQUAL --%token T_GREATER --%token T_GREATER_EQUAL -+%token T_ALLNOCONFIG_Y -+%token T_BOOL -+%token T_CHOICE - %token T_CLOSE_PAREN -+%token T_COLON_EQUAL -+%token T_COMMENT -+%token T_CONFIG -+%token T_DEFAULT -+%token T_DEFCONFIG_LIST -+%token T_DEF_BOOL -+%token T_DEF_TRISTATE -+%token T_DEPENDS -+%token T_ENDCHOICE -+%token T_ENDIF -+%token T_ENDMENU -+%token T_HELP -+%token T_HEX -+%token T_IF -+%token T_IMPLY -+%token T_INT -+%token T_MAINMENU -+%token T_MENU -+%token T_MENUCONFIG -+%token T_MODULES -+%token T_ON - %token T_OPEN_PAREN -+%token T_OPTION -+%token T_OPTIONAL -+%token T_PLUS_EQUAL -+%token T_PROMPT -+%token T_RANGE -+%token T_SELECT -+%token T_SOURCE -+%token T_STRING -+%token T_TRISTATE -+%token T_VISIBLE - %token T_EOL -+%token T_ASSIGN_VAL - - %left T_OR - %left T_AND -@@ -85,13 +91,15 @@ static struct menu *current_menu, *current_entry; - %nonassoc T_NOT - - %type prompt -+%type nonconst_symbol - %type symbol -+%type type logic_type default - %type expr - %type if_expr --%type end --%type option_name -+%type end - %type if_entry menu_entry choice_entry --%type symbol_option_arg word_opt -+%type word_opt assign_val -+%type assign_op - - %destructor { - fprintf(stderr, "%s:%d: missing end statement for this entry\n", -@@ -100,71 +108,53 @@ static struct menu *current_menu, *current_entry; - menu_end_menu(); - } if_entry menu_entry choice_entry - --%{ --/* Include zconf_id.c here so it can see the token constants. */ --#include "kconf_id.c" --%} -- - %% --input: nl start | start; -+input: mainmenu_stmt stmt_list | stmt_list; - --start: mainmenu_stmt stmt_list | stmt_list; -+/* mainmenu entry */ -+ -+mainmenu_stmt: T_MAINMENU prompt T_EOL -+{ -+ menu_add_prompt(P_MENU, $2, NULL); -+}; - - stmt_list: - /* empty */ - | stmt_list common_stmt - | stmt_list choice_stmt - | stmt_list menu_stmt -- | stmt_list end { zconf_error("unexpected end statement"); } - | stmt_list T_WORD error T_EOL { zconf_error("unknown statement \"%s\"", $2); } -- | stmt_list option_name error T_EOL --{ -- zconf_error("unexpected option \"%s\"", $2->name); --} - | stmt_list error T_EOL { zconf_error("invalid statement"); } - ; - --option_name: -- T_DEPENDS | T_PROMPT | T_TYPE | T_SELECT | T_IMPLY | T_OPTIONAL | T_RANGE | T_DEFAULT | T_VISIBLE --; -- - common_stmt: -- T_EOL -- | if_stmt -+ if_stmt - | comment_stmt - | config_stmt - | menuconfig_stmt - | source_stmt -+ | assignment_stmt - ; - --option_error: -- T_WORD error T_EOL { zconf_error("unknown option \"%s\"", $1); } -- | error T_EOL { zconf_error("invalid option"); } --; -- -- - /* config/menuconfig entry */ - --config_entry_start: T_CONFIG T_WORD T_EOL -+config_entry_start: T_CONFIG nonconst_symbol T_EOL - { -- struct symbol *sym = sym_lookup($2, 0); -- sym->flags |= SYMBOL_OPTIONAL; -- menu_add_entry(sym); -- printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), $2); -+ $2->flags |= SYMBOL_OPTIONAL; -+ menu_add_entry($2); -+ printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), $2->name); - }; - - config_stmt: config_entry_start config_option_list - { -- menu_end_entry(); - printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno()); - }; - --menuconfig_entry_start: T_MENUCONFIG T_WORD T_EOL -+menuconfig_entry_start: T_MENUCONFIG nonconst_symbol T_EOL - { -- struct symbol *sym = sym_lookup($2, 0); -- sym->flags |= SYMBOL_OPTIONAL; -- menu_add_entry(sym); -- printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), $2); -+ $2->flags |= SYMBOL_OPTIONAL; -+ menu_add_entry($2); -+ printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), $2->name); - }; - - menuconfig_stmt: menuconfig_entry_start config_option_list -@@ -173,26 +163,22 @@ menuconfig_stmt: menuconfig_entry_start config_option_list - current_entry->prompt->type = P_MENU; - else - zconfprint("warning: menuconfig statement without prompt"); -- menu_end_entry(); - printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno()); - }; - - config_option_list: - /* empty */ - | config_option_list config_option -- | config_option_list symbol_option - | config_option_list depends - | config_option_list help -- | config_option_list option_error -- | config_option_list T_EOL - ; - --config_option: T_TYPE prompt_stmt_opt T_EOL -+config_option: type prompt_stmt_opt T_EOL - { -- menu_set_type($1->stype); -+ menu_set_type($1); - printd(DEBUG_PARSE, "%s:%d:type(%u)\n", - zconf_curname(), zconf_lineno(), -- $1->stype); -+ $1); - }; - - config_option: T_PROMPT prompt if_expr T_EOL -@@ -201,25 +187,25 @@ config_option: T_PROMPT prompt if_expr T_EOL - printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); - }; - --config_option: T_DEFAULT expr if_expr T_EOL -+config_option: default expr if_expr T_EOL - { - menu_add_expr(P_DEFAULT, $2, $3); -- if ($1->stype != S_UNKNOWN) -- menu_set_type($1->stype); -+ if ($1 != S_UNKNOWN) -+ menu_set_type($1); - printd(DEBUG_PARSE, "%s:%d:default(%u)\n", - zconf_curname(), zconf_lineno(), -- $1->stype); -+ $1); - }; - --config_option: T_SELECT T_WORD if_expr T_EOL -+config_option: T_SELECT nonconst_symbol if_expr T_EOL - { -- menu_add_symbol(P_SELECT, sym_lookup($2, 0), $3); -+ menu_add_symbol(P_SELECT, $2, $3); - printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno()); - }; - --config_option: T_IMPLY T_WORD if_expr T_EOL -+config_option: T_IMPLY nonconst_symbol if_expr T_EOL - { -- menu_add_symbol(P_IMPLY, sym_lookup($2, 0), $3); -+ menu_add_symbol(P_IMPLY, $2, $3); - printd(DEBUG_PARSE, "%s:%d:imply\n", zconf_curname(), zconf_lineno()); - }; - -@@ -229,34 +215,30 @@ config_option: T_RANGE symbol symbol if_expr T_EOL - printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno()); - }; - --symbol_option: T_OPTION symbol_option_list T_EOL --; -+config_option: T_OPTION T_MODULES T_EOL -+{ -+ menu_add_option_modules(); -+}; - --symbol_option_list: -- /* empty */ -- | symbol_option_list T_WORD symbol_option_arg -+config_option: T_OPTION T_DEFCONFIG_LIST T_EOL - { -- const struct kconf_id *id = kconf_id_lookup($2, strlen($2)); -- if (id && id->flags & TF_OPTION) -- menu_add_option(id->token, $3); -- else -- zconfprint("warning: ignoring unknown option %s", $2); -- free($2); -+ menu_add_option_defconfig_list(); - }; - --symbol_option_arg: -- /* empty */ { $$ = NULL; } -- | T_EQUAL prompt { $$ = $2; } --; -+config_option: T_OPTION T_ALLNOCONFIG_Y T_EOL -+{ -+ menu_add_option_allnoconfig_y(); -+}; - - /* choice entry */ - - choice: T_CHOICE word_opt T_EOL - { - struct symbol *sym = sym_lookup($2, SYMBOL_CHOICE); -- sym->flags |= SYMBOL_AUTO; -+ sym->flags |= SYMBOL_NO_WRITE; - menu_add_entry(sym); - menu_add_expr(P_CHOICE, NULL, NULL); -+ free($2); - printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno()); - }; - -@@ -267,7 +249,7 @@ choice_entry: choice choice_option_list - - choice_end: end - { -- if (zconf_endtoken($1, T_CHOICE, T_ENDCHOICE)) { -+ if (zconf_endtoken($1, "choice")) { - menu_end_menu(); - printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno()); - } -@@ -281,8 +263,6 @@ choice_option_list: - | choice_option_list choice_option - | choice_option_list depends - | choice_option_list help -- | choice_option_list T_EOL -- | choice_option_list option_error - ; - - choice_option: T_PROMPT prompt if_expr T_EOL -@@ -291,15 +271,11 @@ choice_option: T_PROMPT prompt if_expr T_EOL - printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); - }; - --choice_option: T_TYPE prompt_stmt_opt T_EOL -+choice_option: logic_type prompt_stmt_opt T_EOL - { -- if ($1->stype == S_BOOLEAN || $1->stype == S_TRISTATE) { -- menu_set_type($1->stype); -- printd(DEBUG_PARSE, "%s:%d:type(%u)\n", -- zconf_curname(), zconf_lineno(), -- $1->stype); -- } else -- YYERROR; -+ menu_set_type($1); -+ printd(DEBUG_PARSE, "%s:%d:type(%u)\n", -+ zconf_curname(), zconf_lineno(), $1); - }; - - choice_option: T_OPTIONAL T_EOL -@@ -308,16 +284,28 @@ choice_option: T_OPTIONAL T_EOL - printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno()); - }; - --choice_option: T_DEFAULT T_WORD if_expr T_EOL -+choice_option: T_DEFAULT nonconst_symbol if_expr T_EOL - { -- if ($1->stype == S_UNKNOWN) { -- menu_add_symbol(P_DEFAULT, sym_lookup($2, 0), $3); -- printd(DEBUG_PARSE, "%s:%d:default\n", -- zconf_curname(), zconf_lineno()); -- } else -- YYERROR; -+ menu_add_symbol(P_DEFAULT, $2, $3); -+ printd(DEBUG_PARSE, "%s:%d:default\n", -+ zconf_curname(), zconf_lineno()); - }; - -+type: -+ logic_type -+ | T_INT { $$ = S_INT; } -+ | T_HEX { $$ = S_HEX; } -+ | T_STRING { $$ = S_STRING; } -+ -+logic_type: -+ T_BOOL { $$ = S_BOOLEAN; } -+ | T_TRISTATE { $$ = S_TRISTATE; } -+ -+default: -+ T_DEFAULT { $$ = S_UNKNOWN; } -+ | T_DEF_BOOL { $$ = S_BOOLEAN; } -+ | T_DEF_TRISTATE { $$ = S_TRISTATE; } -+ - choice_block: - /* empty */ - | choice_block common_stmt -@@ -325,7 +313,7 @@ choice_block: - - /* if entry */ - --if_entry: T_IF expr nl -+if_entry: T_IF expr T_EOL - { - printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno()); - menu_add_entry(NULL); -@@ -335,29 +323,15 @@ if_entry: T_IF expr nl - - if_end: end - { -- if (zconf_endtoken($1, T_IF, T_ENDIF)) { -+ if (zconf_endtoken($1, "if")) { - menu_end_menu(); - printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno()); - } - }; - --if_stmt: if_entry if_block if_end -+if_stmt: if_entry stmt_list if_end - ; - --if_block: -- /* empty */ -- | if_block common_stmt -- | if_block menu_stmt -- | if_block choice_stmt --; -- --/* mainmenu entry */ -- --mainmenu_stmt: T_MAINMENU prompt nl --{ -- menu_add_prompt(P_MENU, $2, NULL); --}; -- - /* menu entry */ - - menu: T_MENU prompt T_EOL -@@ -367,33 +341,33 @@ menu: T_MENU prompt T_EOL - printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno()); - }; - --menu_entry: menu visibility_list depends_list -+menu_entry: menu menu_option_list - { - $$ = menu_add_menu(); - }; - - menu_end: end - { -- if (zconf_endtoken($1, T_MENU, T_ENDMENU)) { -+ if (zconf_endtoken($1, "menu")) { - menu_end_menu(); - printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno()); - } - }; - --menu_stmt: menu_entry menu_block menu_end -+menu_stmt: menu_entry stmt_list menu_end - ; - --menu_block: -+menu_option_list: - /* empty */ -- | menu_block common_stmt -- | menu_block menu_stmt -- | menu_block choice_stmt -+ | menu_option_list visible -+ | menu_option_list depends - ; - - source_stmt: T_SOURCE prompt T_EOL - { - printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), $2); - zconf_nextfile($2); -+ free($2); - }; - - /* comment entry */ -@@ -405,10 +379,13 @@ comment: T_COMMENT prompt T_EOL - printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno()); - }; - --comment_stmt: comment depends_list --{ -- menu_end_entry(); --}; -+comment_stmt: comment comment_option_list -+; -+ -+comment_option_list: -+ /* empty */ -+ | comment_option_list depends -+; - - /* help option */ - -@@ -420,18 +397,22 @@ help_start: T_HELP T_EOL - - help: help_start T_HELPTEXT - { -+ if (current_entry->help) { -+ free(current_entry->help); -+ zconfprint("warning: '%s' defined with more than one help text -- only the last one will be used", -+ current_entry->sym->name ?: ""); -+ } -+ -+ /* Is the help text empty or all whitespace? */ -+ if ($2[strspn($2, " \f\n\r\t\v")] == '\0') -+ zconfprint("warning: '%s' defined with blank help text", -+ current_entry->sym->name ?: ""); -+ - current_entry->help = $2; - }; - - /* depends option */ - --depends_list: -- /* empty */ -- | depends_list depends -- | depends_list T_EOL -- | depends_list option_error --; -- - depends: T_DEPENDS T_ON expr T_EOL - { - menu_add_dep($3); -@@ -439,14 +420,7 @@ depends: T_DEPENDS T_ON expr T_EOL - }; - - /* visibility option */ -- --visibility_list: -- /* empty */ -- | visibility_list visible -- | visibility_list T_EOL --; -- --visible: T_VISIBLE if_expr -+visible: T_VISIBLE if_expr T_EOL - { - menu_add_visibility($2); - }; -@@ -464,14 +438,9 @@ prompt: T_WORD - | T_WORD_QUOTE - ; - --end: T_ENDMENU T_EOL { $$ = $1; } -- | T_ENDCHOICE T_EOL { $$ = $1; } -- | T_ENDIF T_EOL { $$ = $1; } --; -- --nl: -- T_EOL -- | nl T_EOL -+end: T_ENDMENU T_EOL { $$ = "menu"; } -+ | T_ENDCHOICE T_EOL { $$ = "choice"; } -+ | T_ENDIF T_EOL { $$ = "if"; } - ; - - if_expr: /* empty */ { $$ = NULL; } -@@ -491,13 +460,31 @@ expr: symbol { $$ = expr_alloc_symbol($1); } - | expr T_AND expr { $$ = expr_alloc_two(E_AND, $1, $3); } - ; - --symbol: T_WORD { $$ = sym_lookup($1, 0); free($1); } -+/* For symbol definitions, selects, etc., where quotes are not accepted */ -+nonconst_symbol: T_WORD { $$ = sym_lookup($1, 0); free($1); }; -+ -+symbol: nonconst_symbol - | T_WORD_QUOTE { $$ = sym_lookup($1, SYMBOL_CONST); free($1); } - ; - - word_opt: /* empty */ { $$ = NULL; } - | T_WORD - -+/* assignment statement */ -+ -+assignment_stmt: T_WORD assign_op assign_val T_EOL { variable_add($1, $3, $2); free($1); free($3); } -+ -+assign_op: -+ T_EQUAL { $$ = VAR_RECURSIVE; } -+ | T_COLON_EQUAL { $$ = VAR_SIMPLE; } -+ | T_PLUS_EQUAL { $$ = VAR_APPEND; } -+; -+ -+assign_val: -+ /* empty */ { $$ = xstrdup(""); }; -+ | T_ASSIGN_VAL -+; -+ - %% - - void conf_parse(const char *name) -@@ -507,61 +494,51 @@ void conf_parse(const char *name) - - zconf_initscan(name); - -- sym_init(); - _menu_init(); -- rootmenu.prompt = menu_add_prompt(P_MENU, "CARL9170 Firmware Configuration", NULL); - - if (getenv("ZCONF_DEBUG")) -- zconfdebug = 1; -- zconfparse(); -- if (zconfnerrs) -+ yydebug = 1; -+ yyparse(); -+ -+ /* Variables are expanded in the parse phase. We can free them here. */ -+ variable_all_del(); -+ -+ if (yynerrs) - exit(1); - if (!modules_sym) - modules_sym = sym_find( "n" ); - -- rootmenu.prompt->text = _(rootmenu.prompt->text); -- rootmenu.prompt->text = sym_expand_string_value(rootmenu.prompt->text); -+ if (!menu_has_prompt(&rootmenu)) { -+ current_entry = &rootmenu; -+ menu_add_prompt(P_MENU, "Main menu", NULL); -+ } - - menu_finalize(&rootmenu); - for_all_symbols(i, sym) { - if (sym_check_deps(sym)) -- zconfnerrs++; -+ yynerrs++; - } -- if (zconfnerrs) -+ if (yynerrs) - exit(1); - sym_set_change_count(1); - } - --static const char *zconf_tokenname(int token) --{ -- switch (token) { -- case T_MENU: return "menu"; -- case T_ENDMENU: return "endmenu"; -- case T_CHOICE: return "choice"; -- case T_ENDCHOICE: return "endchoice"; -- case T_IF: return "if"; -- case T_ENDIF: return "endif"; -- case T_DEPENDS: return "depends"; -- case T_VISIBLE: return "visible"; -- } -- return ""; --} -- --static bool zconf_endtoken(const struct kconf_id *id, int starttoken, int endtoken) -+static bool zconf_endtoken(const char *tokenname, -+ const char *expected_tokenname) - { -- if (id->token != endtoken) { -+ if (strcmp(tokenname, expected_tokenname)) { - zconf_error("unexpected '%s' within %s block", -- id->name, zconf_tokenname(starttoken)); -- zconfnerrs++; -+ tokenname, expected_tokenname); -+ yynerrs++; - return false; - } - if (current_menu->file != current_file) { - zconf_error("'%s' in different file than '%s'", -- id->name, zconf_tokenname(starttoken)); -+ tokenname, expected_tokenname); - fprintf(stderr, "%s:%d: location of the '%s'\n", - current_menu->file->name, current_menu->lineno, -- zconf_tokenname(starttoken)); -- zconfnerrs++; -+ expected_tokenname); -+ yynerrs++; - return false; - } - return true; -@@ -582,7 +559,7 @@ static void zconf_error(const char *err, ...) - { - va_list ap; - -- zconfnerrs++; -+ yynerrs++; - fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno()); - va_start(ap, err); - vfprintf(stderr, err, ap); -@@ -590,7 +567,7 @@ static void zconf_error(const char *err, ...) - fprintf(stderr, "\n"); - } - --static void zconferror(const char *err) -+static void yyerror(const char *err) - { - fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err); - } -@@ -623,7 +600,7 @@ static void print_symbol(FILE *out, struct menu *menu) - fprintf(out, "\nconfig %s\n", sym->name); - switch (sym->type) { - case S_BOOLEAN: -- fputs(" boolean\n", out); -+ fputs(" bool\n", out); - break; - case S_TRISTATE: - fputs(" tristate\n", out); -@@ -686,6 +663,10 @@ static void print_symbol(FILE *out, struct menu *menu) - print_quoted_string(out, prop->text); - fputc('\n', out); - break; -+ case P_SYMBOL: -+ fputs( " symbol ", out); -+ fprintf(out, "%s\n", prop->sym->name); -+ break; - default: - fprintf(out, " unknown prop %d!\n", prop->type); - break; -@@ -746,9 +727,5 @@ void zconfdump(FILE *out) - } - } - --#include "zconf.lex.c" - #include "util.c" --#include "confdata.c" --#include "expr.c" --#include "symbol.c" - #include "menu.c" -diff --git a/carl9170fw/include/linux/ieee80211.h b/carl9170fw/include/linux/ieee80211.h -index 31c59ea..46ce6cf 100644 ---- a/carl9170fw/include/linux/ieee80211.h -+++ b/carl9170fw/include/linux/ieee80211.h -@@ -897,33 +897,33 @@ struct ieee80211_mgmt { - __le16 status_code; - /* possibly followed by Challenge text */ - u8 variable[0]; -- } __packed auth; -+ } __packed __aligned(4) auth; - struct { - __le16 reason_code; -- } __packed deauth; -+ } __packed __aligned(4) deauth; - struct { - __le16 capab_info; - __le16 listen_interval; - /* followed by SSID and Supported rates */ - u8 variable[0]; -- } __packed assoc_req; -+ } __packed __aligned(4) assoc_req; - struct { - __le16 capab_info; - __le16 status_code; - __le16 aid; - /* followed by Supported rates */ - u8 variable[0]; -- } __packed assoc_resp, reassoc_resp; -+ } __packed __aligned(4) assoc_resp, reassoc_resp; - struct { - __le16 capab_info; - __le16 listen_interval; - u8 current_ap[6]; - /* followed by SSID and Supported rates */ - u8 variable[0]; -- } __packed reassoc_req; -+ } __packed __aligned(4) reassoc_req; - struct { - __le16 reason_code; -- } __packed disassoc; -+ } __packed __aligned(4) disassoc; - struct { - __le64 timestamp; - __le16 beacon_int; -@@ -931,11 +931,11 @@ struct ieee80211_mgmt { - /* followed by some of SSID, Supported rates, - * FH Params, DS Params, CF Params, IBSS Params, TIM */ - u8 variable[0]; -- } __packed beacon; -+ } __packed __aligned(4) beacon; - struct { - /* only variable items: SSID, Supported rates */ - u8 variable[0]; -- } __packed probe_req; -+ } __packed __aligned(4) probe_req; - struct { - __le64 timestamp; - __le16 beacon_int; -@@ -943,7 +943,7 @@ struct ieee80211_mgmt { - /* followed by some of SSID, Supported rates, - * FH Params, DS Params, CF Params, IBSS Params */ - u8 variable[0]; -- } __packed probe_resp; -+ } __packed __aligned(4) probe_resp; - struct { - u8 category; - union { -@@ -1041,8 +1041,8 @@ struct ieee80211_mgmt { - u8 variable[0]; - } __packed ftm; - } u; -- } __packed action; -- } u; -+ } __packed __aligned(4) action; -+ } u __aligned(2); - } __packed __aligned(2); - - /* Supported rates membership selectors */ -@@ -1245,7 +1245,7 @@ struct ieee80211_bar { - __u8 ta[6]; - __le16 control; - __le16 start_seq_num; --} __packed __aligned(4); -+} __packed __aligned(2); - - /* 802.11 BA(R) control masks */ - #define IEEE80211_BAR_CTRL_ACK_POLICY_NORMAL 0x0000 -diff --git a/carl9170fw/include/shared/wlan.h b/carl9170fw/include/shared/wlan.h -index 9c6b7ff..117f005 100644 ---- a/carl9170fw/include/shared/wlan.h -+++ b/carl9170fw/include/shared/wlan.h -@@ -273,7 +273,7 @@ struct ar9170_tx_frame { - struct ieee80211_hdr i3e; - u8 payload[0]; - } data; --} __packed; -+} __packed __aligned(4); - - struct carl9170_tx_superframe { - struct carl9170_tx_superdesc s; -diff --git a/carl9170fw/toolchain/Makefile b/carl9170fw/toolchain/Makefile -index 11db906..43e546d 100644 ---- a/carl9170fw/toolchain/Makefile -+++ b/carl9170fw/toolchain/Makefile -@@ -1,16 +1,16 @@ --BINUTILS_VER=2.31.1 -+BINUTILS_VER=2.32 - BINUTILS_TAR=binutils-$(BINUTILS_VER).tar.xz - BINUTILS_URL="https://ftp.gnu.org/gnu/binutils/$(BINUTILS_TAR)" - --NEWLIB_VER=3.0.0 -+NEWLIB_VER=3.1.0 - NEWLIB_TAR=newlib-$(NEWLIB_VER).tar.gz - NEWLIB_URL="ftp://sourceware.org/pub/newlib/$(NEWLIB_TAR)" - --GCC_VER=8.2.0 -+GCC_VER=9.1.0 - GCC_TAR=gcc-$(GCC_VER).tar.xz - GCC_URL="https://ftp.gnu.org/gnu/gcc/gcc-$(GCC_VER)/$(GCC_TAR)" - --MPFR_VER=4.0.1 -+MPFR_VER=4.0.2 - MPFR_TAR=mpfr-$(MPFR_VER).tar.xz - MPFR_URL="https://ftp.gnu.org/gnu/mpfr/$(MPFR_TAR)" - -diff --git a/carl9170fw/toolchain/SHA256SUMS b/carl9170fw/toolchain/SHA256SUMS -index 1b65040..3a53959 100644 ---- a/carl9170fw/toolchain/SHA256SUMS -+++ b/carl9170fw/toolchain/SHA256SUMS -@@ -1,16 +1,6 @@ --1cf7adf8ff4b5aa49041c8734bbcf1ad18cc4c94d0029aae0f4e48841088479a src/gcc-7.2.0.tar.xz --5b76a9b97c9464209772ed25ce55181a7bb144a66e5669aaec945aa64da3189b src/newlib-2.5.0.tar.gz --0b871e271c4c620444f8264f72143b4d224aa305306d85dd77ab8dce785b1e85 src/binutils-2.29.tar.xz - 87b565e89a9a684fe4ebeeddb8399dce2599f9c9049854ca8c0dfbdea0e21912 src/gmp-6.1.2.tar.xz --617decc6ea09889fb08ede330917a00b16809b8db88c29c31bfbb49cbf88ecc3 src/mpc-1.0.3.tar.gz --7a62ac1a04408614fccdc506e4844b10cf0ad2c2b1677097f8f35d3a1344a950 src/mpfr-3.1.6.tar.xz - 6985c538143c1208dcb1ac42cedad6ff52e267b47e5f970183a3e75125b43c2e src/mpc-1.1.0.tar.gz --fbe2cd1418b321f5c899ce4f0f0f4e73f5ecc7d02145b0e1fd096f5c3afb8a1d src/mpfr-4.0.0.tar.xz --c8566335ee74e5fcaeb8595b4ebd0400c4b043d6acb3263ecb1314f8f5501332 src/newlib-3.0.0.tar.gz --832ca6ae04636adbb430e865a1451adf6979ab44ca1c8374f61fba65645ce15c src/gcc-7.3.0.tar.xz --e7010a46969f9d3e53b650a518663f98a5dde3c3ae21b7d71e5e6803bc36b577 src/binutils-2.29.1.tar.xz --67874a60826303ee2fb6affc6dc0ddd3e749e9bfcb4c8655e3953d0458a6e16e src/mpfr-4.0.1.tar.xz --6e46b8aeae2f727a36f0bd9505e405768a72218f1796f0d09757d45209871ae6 src/binutils-2.30.tar.xz --1d1866f992626e61349a1ccd0b8d5253816222cdc13390dcfaa74b093aa2b153 src/gcc-8.1.0.tar.xz --5d20086ecf5752cc7d9134246e9588fa201740d540f7eb84d795b1f7a93bca86 src/binutils-2.31.1.tar.xz --196c3c04ba2613f893283977e6011b2345d1cd1af9abeac58e916b1aab3e0080 src/gcc-8.2.0.tar.xz -\ No newline at end of file -+fb4fa1cc21e9060719208300a61420e4089d6de6ef59cf533b57fe74801d102a src/newlib-3.1.0.tar.gz -+1d3be708604eae0e42d578ba93b390c2a145f17743a744d8f3f8c2ad5855a38a src/mpfr-4.0.2.tar.xz -+0ab6c55dd86a92ed561972ba15b9b70a8b9f75557f896446c82e8b36e473ee04 src/binutils-2.32.tar.xz -+79a66834e96a6050d8fe78db2c3b32fb285b230b855d0a66288235bc04b327a0 src/gcc-9.1.0.tar.xz --- -2.26.0 - diff --git a/libre/linux-libre-firmware/0002-Add-firmware-for-the-ATUSB-IEEE-802.15.4-USB-Adapter.patch b/libre/linux-libre-firmware/0002-Add-firmware-for-the-ATUSB-IEEE-802.15.4-USB-Adapter.patch deleted file mode 100644 index aa4cb07..0000000 --- a/libre/linux-libre-firmware/0002-Add-firmware-for-the-ATUSB-IEEE-802.15.4-USB-Adapter.patch +++ /dev/null @@ -1,4893 +0,0 @@ -From dd4bc9ff49b9a7075e579fdd62fd930d27a9a7df Mon Sep 17 00:00:00 2001 -From: Jason Self -Date: Thu, 4 Jul 2019 15:55:48 -0700 -Subject: [PATCH 2/8] Add firmware for the ATUSB IEEE 802.15.4 USB Adapter - -http://shop.sysmocom.de/products/atusb/ ---- - INSTALL | 20 +- - Makefile | 6 +- - WHENCE | 12 ++ - atusb/Makefile | 236 +++++++++++++++++++++ - atusb/README | 94 +++++++++ - atusb/an/README | 25 +++ - atusb/an/dec.py | 127 ++++++++++++ - atusb/an/get.py | 31 +++ - atusb/an/plot | 12 ++ - atusb/atusb.c | 63 ++++++ - atusb/board.c | 120 +++++++++++ - atusb/board.h | 95 +++++++++ - atusb/board_app.c | 173 ++++++++++++++++ - atusb/board_atusb.c | 162 +++++++++++++++ - atusb/board_atusb.h | 48 +++++ - atusb/board_hulusb.c | 179 ++++++++++++++++ - atusb/board_hulusb.h | 66 ++++++ - atusb/board_rzusb.c | 169 +++++++++++++++ - atusb/board_rzusb.h | 48 +++++ - atusb/boot.c | 77 +++++++ - atusb/descr.c | 104 ++++++++++ - atusb/ep0.c | 338 ++++++++++++++++++++++++++++++ - atusb/flash.c | 97 +++++++++ - atusb/include/at86rf230.h | 402 ++++++++++++++++++++++++++++++++++++ - atusb/include/atusb/atusb.h | 97 +++++++++ - atusb/include/atusb/ep0.h | 64 ++++++ - atusb/mac.c | 250 ++++++++++++++++++++++ - atusb/mac.h | 26 +++ - atusb/sernum.c | 47 +++++ - atusb/sernum.h | 37 ++++ - atusb/spi.c | 51 +++++ - atusb/spi.h | 30 +++ - atusb/uart.c | 64 ++++++ - atusb/uart.h | 25 +++ - atusb/usb/atu2.c | 247 ++++++++++++++++++++++ - atusb/usb/dfu.c | 260 +++++++++++++++++++++++ - atusb/usb/dfu.h | 119 +++++++++++ - atusb/usb/dfu_common.c | 101 +++++++++ - atusb/usb/usb.c | 181 ++++++++++++++++ - atusb/usb/usb.h | 189 +++++++++++++++++ - atusb/version.h | 23 +++ - 42 files changed, 4512 insertions(+), 3 deletions(-) - create mode 100644 atusb/Makefile - create mode 100644 atusb/README - create mode 100644 atusb/an/README - create mode 100755 atusb/an/dec.py - create mode 100755 atusb/an/get.py - create mode 100755 atusb/an/plot - create mode 100644 atusb/atusb.c - create mode 100644 atusb/board.c - create mode 100644 atusb/board.h - create mode 100644 atusb/board_app.c - create mode 100644 atusb/board_atusb.c - create mode 100644 atusb/board_atusb.h - create mode 100644 atusb/board_hulusb.c - create mode 100644 atusb/board_hulusb.h - create mode 100644 atusb/board_rzusb.c - create mode 100644 atusb/board_rzusb.h - create mode 100644 atusb/boot.c - create mode 100644 atusb/descr.c - create mode 100644 atusb/ep0.c - create mode 100644 atusb/flash.c - create mode 100644 atusb/include/at86rf230.h - create mode 100644 atusb/include/atusb/atusb.h - create mode 100644 atusb/include/atusb/ep0.h - create mode 100644 atusb/mac.c - create mode 100644 atusb/mac.h - create mode 100644 atusb/sernum.c - create mode 100644 atusb/sernum.h - create mode 100644 atusb/spi.c - create mode 100644 atusb/spi.h - create mode 100644 atusb/uart.c - create mode 100644 atusb/uart.h - create mode 100644 atusb/usb/atu2.c - create mode 100644 atusb/usb/dfu.c - create mode 100644 atusb/usb/dfu.h - create mode 100644 atusb/usb/dfu_common.c - create mode 100644 atusb/usb/usb.c - create mode 100644 atusb/usb/usb.h - create mode 100644 atusb/version.h - -diff --git a/INSTALL b/INSTALL -index 74c5cfd..7fb1116 100644 ---- a/INSTALL -+++ b/INSTALL -@@ -16,6 +16,8 @@ In order to build everything you will need the following on the host - system: - - * A C/C++ compiler, like GCC -+ * AVR-GCC -+ * Standard C library for AVR-GCC - * Cmake - * GNU Bison/YACC - * GNU Flex -@@ -32,13 +34,27 @@ system: - - On GNU/Linux distros that use apt you can install these with: - -- apt install binutils-arm-linux-gnueabi binutils-arm-none-eabi bison \ -- cmake flex g++ gcc gcc-arm-linux-gnueabi gcc-arm-none-eabi gperf make wget -+ apt install avr-gcc avr-libc binutils-arm-linux-gnueabi \ -+ binutils-arm-none-eabi bison cmake flex g++ gcc \ -+ gcc-arm-linux-gnueabi gcc-arm-none-eabi gperf make wget - - CARL9170 Firmware Configuration -+------------------------------- - When building the carl9170 firmware you will be prompted with - configuration questions. - -+atusb: Firmware for the ATUSB IEEE 802.15.4 USB Adapter -+------------------------------------------------------- -+ -+To flash the firmware you need dfu-util on the host. Issue -+ -+ make dfu -+ -+right after plugging the device into the USB port while the red led is -+still on. -+ -+Refer to the included README file for more information. -+ - Licensing - --------- - -diff --git a/Makefile b/Makefile -index 21d16fb..8474b30 100644 ---- a/Makefile -+++ b/Makefile -@@ -17,7 +17,7 @@ shell=/bin/sh - prefix=/lib/firmware - install_program=install - --.PHONY: all test clean install a56 as31 aica ath9k_htc_toolchain ath9k_htc av7110 b43-tools carl9170fw-toolchain carl9170fw cis-tools cis dsp56k ihex2fw isci keyspan_pda openfwwf usbdux -+.PHONY: all test clean install a56 as31 aica ath9k_htc_toolchain ath9k_htc atusb av7110 b43-tools carl9170fw-toolchain carl9170fw cis-tools cis dsp56k ihex2fw isci keyspan_pda openfwwf usbdux - - all: aica ath9k_htc av7110 carl9170fw cis dsp56k isci keyspan_pda openfwwf usbdux - -@@ -36,6 +36,9 @@ ath9k_htc_toolchain: - ath9k_htc: ath9k_htc_toolchain - cd ath9k_htc && $(MAKE) -C target_firmware - -+atusb: -+ cd atusb && $(MAKE) -+ - av7110: - cd av7110 && $(MAKE) - -@@ -81,6 +84,7 @@ clean: - if [ -a as31/Makefile ]; then cd as31 && $(MAKE) clean; fi; - cd ath9k_htc && $(MAKE) toolchain-clean - cd ath9k_htc && $(MAKE) -C target_firmware clean -+ cd atusb && $(MAKE) clean - cd av7110 && $(MAKE) clean - cd carl9170fw/toolchain && $(MAKE) clean - if [ -a carl9170fw/Makefile ]; then cd carl9170fw && $(MAKE) clean; fi; -diff --git a/WHENCE b/WHENCE -index 2932155..756de43 100644 ---- a/WHENCE -+++ b/WHENCE -@@ -112,6 +112,18 @@ From https://github.com/qca/open-ath9k-htc-firmware - - -------------------------------------------------------------------------- - -+atusb: Firmware for the ATUSB IEEE 802.15.4 USB Adapter -+http://shop.sysmocom.de/products/atusb/ -+ -+From http://projects.qi-hardware.com/index.php/p/ben-wpan/source/tree/master/atusb/fw -+ -+License: GPL-2.0-or-later -+ -+Version: Based on commit 805db6ebf5d80692158acadf88e239da9d3e67af -+dated September 13 2017 -+ -+-------------------------------------------------------------------------- -+ - Driver: b43 - OpenFWWF -- Free firmware for some Broadcom 43xx series WLAN chips - - License: GPLv2 -diff --git a/atusb/Makefile b/atusb/Makefile -new file mode 100644 -index 0000000..c79cb26 ---- /dev/null -+++ b/atusb/Makefile -@@ -0,0 +1,236 @@ -+# -+# Makefile - Makefile of the ATUSB firmware -+# -+# Written 2010-2011, 2013 by Werner Almesberger -+# Copyright 2010-2011, 2013 by Werner Almesberger -+# -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 2 of the License, or -+# (at your option) any later version. -+# -+ -+SHELL = /bin/bash -+ -+NAME = atusb -+DEBUG = false -+ -+CFLAGS = -g -mmcu=$(CHIP) -DBOOT_ADDR=$(BOOT_ADDR) \ -+ -Wall -Wextra -Wshadow -Werror -Wno-unused-parameter \ -+ -Wmissing-prototypes -Wmissing-declarations -Wstrict-prototypes -+ -+ifeq ($(DEBUG),true) -+CFLAGS += -DDEBUG -+endif -+ -+ifeq ($(NAME),rzusb) -+CHIP=at90usb1287 -+CFLAGS += -DRZUSB -DAT86RF230 -+else ifeq ($(NAME),hulusb) -+CHIP=at90usb1287 -+CFLAGS += -DHULUSB -DAT86RF212 -+else -+CHIP=atmega32u2 -+CFLAGS += -DATUSB -DAT86RF231 -+endif -+HOST=jlime -+BOOT_ADDR=0x7000 -+ -+AVR_PREFIX = $(BIN_PATH) avr- -+CC = $(AVR_PREFIX)gcc -+OBJCOPY = $(AVR_PREFIX)objcopy -+#OBJDUMP = $(AVR_PREFIX)objdump -+SIZE = $(AVR_PREFIX)size -+ -+# BCD notion is 0xJJMM with JJ being major and MM being minor. Thus 0x0020 is -+# version 0.2 */ -+USB_BCD_VERSION = 0030 -+USB_VENDOR_ID = 20b7 -+USB_PRODUCT_ID = 1540 -+USB_ID = $(USB_VENDOR_ID):$(USB_PRODUCT_ID) -+ -+OBJS = atusb.o board.o board_app.o sernum.o spi.o descr.o ep0.o \ -+ dfu_common.o usb.o app-atu2.o mac.o -+BOOT_OBJS = boot.o board.o sernum.o spi.o flash.o dfu.o \ -+ dfu_common.o usb.o boot-atu2.o -+ -+ifeq ($(DEBUG),true) -+OBJS += uart.o -+endif -+ -+ifeq ($(NAME),rzusb) -+OBJS += board_rzusb.o -+BOOT_OBJS += board_rzusb.o -+else ifeq ($(NAME),hulusb) -+OBJS += board_hulusb.o -+BOOT_OBJS += board_hulusb.o -+else -+OBJS += board_atusb.o -+BOOT_OBJS += board_atusb.o -+endif -+ -+ -+vpath %.c usb/ -+ -+CFLAGS += -Iinclude -Iusb -I. -+ -+# ----- Verbosity control ----------------------------------------------------- -+ -+CC_normal := $(CC) -+BUILD_normal := -+DEPEND_normal := $(CPP) $(CFLAGS) -MM -MG -+ -+CC_quiet = @echo " CC " $@ && $(CC_normal) -+BUILD_quiet = @echo " BUILD " $@ && $(BUILD_normal) -+DEPEND_quiet = @$(DEPEND_normal) -+ -+ifeq ($(V),1) -+ CC = $(CC_normal) -+ BUILD = $(BUILD_normal) -+ DEPEND = $(DEPEND_normal) -+else -+ CC = $(CC_quiet) -+ BUILD = $(BUILD_quiet) -+ DEPEND = $(DEPEND_quiet) -+endif -+ -+# ----- Rules ----------------------------------------------------------------- -+ -+.PHONY: all clean upload prog dfu update version.c bindist -+.PHONY: prog-app prog-read on off reset -+ -+all: $(NAME).bin boot.hex -+ -+$(NAME).elf: $(OBJS) -+ $(MAKE) version.o -+ $(CC) $(CFLAGS) -o $@ $(OBJS) version.o -+ $(SIZE) $@ -+ -+boot.elf: $(BOOT_OBJS) -+ $(CC) $(CFLAGS) -o $@ $(BOOT_OBJS) \ -+ -Wl,--section-start=.text=$(BOOT_ADDR) -+ $(SIZE) $@ -+ -+%.bin: %.elf -+ $(BUILD) $(OBJCOPY) -j .text -j .data -O binary $< $@ -+ @echo "build #`cat .version`, `ls -l $@`" -+ -+%.dfu: %.bin -+ cp $(NAME).bin $(NAME).dfu -+ dfu-suffix -a $(NAME).dfu -d 0x$(USB_BCD_VERSION) \ -+ -p 0x$(USB_PRODUCT_ID) -v 0x$(USB_VENDOR_ID) -+ -+%.hex: %.elf -+ $(BUILD) $(OBJCOPY) -j .text -j .data -O ihex $< $@ -+ @echo "Size: `$(SIZE) -A boot.hex | sed '/Total */s///p;d'` B" -+ -+# ----- Cleanup --------------------------------------------------------------- -+ -+clean: -+ rm -f $(NAME).bin $(NAME).elf $(NAME).dfu -+ rm -f $(OBJS) $(OBJS:.o=.d) -+ rm -f boot.hex boot.elf -+ rm -f $(BOOT_OBJS) $(BOOT_OBJS:.o=.d) -+ rm -f version.c version.d version.o -+ -+# ----- Build version --------------------------------------------------------- -+ -+version.c: -+ @if [ -f .version ]; then \ -+ v=`cat .version`; \ -+ expr $$v + 1 >.version; \ -+ else \ -+ echo 0 >.version; \ -+ fi -+ @[ -s .version ] || echo 0 >.version -+ @echo '/* MACHINE-GENERATED. DO NOT EDIT ! */' >version.c -+ @echo '#include "version.h"' >>version.c -+ @echo "const char *build_date = \"`date`\";" >>version.c -+ @echo "const uint16_t build_number = `cat .version`;" \ -+ >>version.c -+ -+# ----- Dependencies ---------------------------------------------------------- -+ -+MKDEP = \ -+ $(DEPEND) $< | \ -+ sed \ -+ -e 's|^$(basename $(notdir $<)).o:|$@:|' \ -+ -e '/^\(.*:\)\? */{p;s///;s/ *\\\?$$/ /;s/ */:\n/g;H;}' \ -+ -e '$${g;p;}' \ -+ -e d >$(basename $@).d; \ -+ [ "$${PIPESTATUS[*]}" = "0 0" ] || \ -+ { rm -f $(basename $@).d; exit 1; } -+ -+%.o: %.c -+ $(CC) $(CFLAGS) -Os -c $< -+ $(MKDEP) -+ -+-include $(OBJS:.o=.d) -+ -+# ----- Object file variants -------------------------------------------------- -+ -+app-%.o: usb/%.c -+ $(CC) $(CFLAGS) -Os -o $@ -c $< -+ $(MKDEP) -+ -+boot-%.o: usb/%.c -+ $(CC) $(CFLAGS) -DBOOT_LOADER -Os -o $@ -c $< -+ $(MKDEP) -+ -+# ----- Distribution ---------------------------------------------------------- -+ -+BINDIST_BASE=http://downloads.qi-hardware.com/people/werner/wpan/bindist -+ATUSB_BIN_NAME=atusb-`git rev-parse HEAD | cut -c 1-7`.bin -+ -+bindist: -+ qippl atusb.bin wpan/bindist/$(ATUSB_BIN_NAME) -+ @echo $(BINDIST_BASE)/$(ATUSB_BIN_NAME) -+ @echo md5sum: `md5sum atusb.bin | sed 's/ .*//'` -+ @echo atrf-id: \ -+ `sed '/.*number = \(.*\);/s//#\1/p;d' version.c` \ -+ `sed '/.*date = "\(.*\)";/s//\1/p;d' version.c` -+ -+# ----- Programming and device control ---------------------------------------- -+ -+upload: $(NAME).bin boot.hex -+ scp $(NAME).bin boot.hex $(HOST): -+ -+# lfuse: external clock, slow start-up -+# hfuse: 4 kB boot loader, reset into boot loader -+# lock: allow everything but SPM to the boot loader -+# Note: when trying to program 0xef, we get back 0x2f, failing -+# verification. So we just program 0x2f. -+ -+prog-app: -+ ssh $(HOST) avrdude -F -p $(CHIP) -c nanonote_atusb -e \ -+ -U flash:w:atusb.bin:r \ -+ -U lfuse:w:0x60:m -+ -+prog: -+ ssh $(HOST) avrdude -F -p $(CHIP) -c nanonote_atusb -e \ -+ -U flash:w:boot.hex:i \ -+ -U lfuse:w:0x60:m \ -+ -U hfuse:w:0xd8:m \ -+ -U lock:w:0x2f:m -+ -+prog-read: -+ ssh $(HOST) avrdude -F -p $(CHIP) -c nanonote_atusb \ -+ -U flash:r:mcu.bin:r -+ -+dfu: $(NAME).dfu -+ dfu-util -d $(USB_ID) -D $(NAME).dfu -+ -+update: $(NAME).bin -+ -atrf-reset -a -+ usbwait -r -i 0.01 -t 5 $(USB_ID) -+ $(MAKE) dfu -+ -+on: -+ ssh $(HOST) poke 0x10010318 4 -+ -+off: -+ ssh $(HOST) poke 0x10010314 4 -+ -+reset: -+ ssh $(HOST) poke 0x10010318 2048 -+ ssh $(HOST) poke 0x10010314 2048 -diff --git a/atusb/README b/atusb/README -new file mode 100644 -index 0000000..99ceb22 ---- /dev/null -+++ b/atusb/README -@@ -0,0 +1,94 @@ -+Requires a very recent toolchain, because ATmega32U2 is relatively new. -+ -+- Building: -+ -+ make -+ -+- Uploading the firmware to a Ben (for flashing with the atusb-pgm cable): -+ -+ make HOST= upload -+ -+ Example: -+ -+ make HOST=ben upload -+ -+ HOST defaults to "jlime". -+ -+- Flashing the boot loader: -+ -+ Prerequisite: avrdude on the Ben. -+ -+ Disconnect the atusb board from USB. Insert the atusb-pgm connector into -+ the Ben. Place the atusb-pgm adapter on the exposed contact pads of the -+ atusb board and push it down. Then run -+ -+ make prog -+ -+ This takes about 30 seconds. If the programming fails with an error -+ message like "Yikes! Invalid device signature.", verify that the -+ atusb-pgm board is properly connected and placed, then try again. -+ -+- Uploading the application: -+ -+ Prerequisite: dfu-util installed on the PC. -+ -+ Insert atusb into the PC, then run -+ -+ make dfu -+ -+ Note: since the boot loader resets the USB bus after timing out, -+ this operation can fail with a message like "No DFU capable USB device -+ found". Just retry, and it will eventually get through. -+ -+ -+HULUSB notes: -+------------- -+To prepare and flash the firmware on a HULUSB device some additional steps are -+needed; -+ -+avr-objcopy -O ihex -R .signature -R .fuse -R .eeprom hulusb.elf hulusb.hex -+dfu-programmer at90usb1287 flash hulusb.hex -+dfu-programmer at90usb1287 reset -+ -+-------------------------- -+ -+Making the toolchain: -+ -+# patches according to -+# http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&p=789527 -+ -+# some gcc prerequisites -+ -+apt-get remove avr-libc gcc-avr binutils-avr -+apt-get install libmpfr-dev libmpc-dev -+ -+# binutils -+ -+wget http://ftp.gnu.org/gnu/binutils/binutils-2.21.tar.bz2 -+tar xfj binutils-2.21.tar.bz2 -+cd binutils-2.21 -+./configure --target=avr --disable-nls -+make -+make install -+ -+# gcc -+ -+wget http://ftpmirror.gnu.org/gcc/gcc-4.5.2/gcc-4.5.2.tar.bz2 -+wget -O gcc_452_avr.patch http://gcc.gnu.org/bugzilla/attachment.cgi?id=23050 -+tar xfj gcc-4.5.2.tar.bz2 -+cd gcc-4.5.2 -+patch -p1 -s <../gcc_452_avr.patch -+mkdir obj-avr -+cd obj-avr -+../configure --target=avr --enable-languages=c \ -+ --disable-nls --disable-libssp --with-dwarf2 -+make -+make install -+ -+wget http://download.savannah.gnu.org/releases/avr-libc/avr-libc-1.7.1.tar.bz2 -+tar xfj avr-libc-1.7.1.tar.bz2 -+cd avr-libc-1.7.1 -+./bootstrap # the automake at the end takes a while -+./configure --build=`./config.guess` --host=avr -+make -+make install -diff --git a/atusb/an/README b/atusb/an/README -new file mode 100644 -index 0000000..8e0d2fc ---- /dev/null -+++ b/atusb/an/README -@@ -0,0 +1,25 @@ -+workflow: -+ -+- connect zprobe (note: it currently inverts because it didn't have any -+ other chips around. this may change later.) -+ -+- capture the USB signals at an interesting moment with a sample rate of -+ 50 MSa/s -+ -+- zoom into the frame(s) of interest -+ -+- download the data with -+ ./get.py -+ -+- decode with -+ ./dec.py -+ -+ For manual decoding, set the coders to D+ and D- (we need D- for SE0 -+ and SE1 detection), then click on a rising clock edge left of the -+ packet and move the cursor to the right. -+ -+- if there are problems with the clock, the analog signal and digital -+ signals derived from it can be examined after running dec.py with -+ ./plot -+ -+ (Note that the digital zprobe hides any analog anomalies.) -diff --git a/atusb/an/dec.py b/atusb/an/dec.py -new file mode 100755 -index 0000000..8534857 ---- /dev/null -+++ b/atusb/an/dec.py -@@ -0,0 +1,127 @@ -+#!/usr/bin/python -+ -+from tmc.wave import * -+from tmc.dxplore import dxplore -+from tmc.decode import d_usb_stream -+ -+ -+# -+# Clock recovery: we assume that each change in the wave is triggered by a -+# clock edge. We know the clock's nominal period and resynchronize on each -+# edge. Additionally, we can obtain a list of times when a timing violation -+# has occurred. -+# -+# Note that the timing violations logic doesn't make much sense in its present -+# form, since it mainly measures noise (particularly if we're digitizing slow -+# edges) and not clock drift. -+# -+# A more useful metric would be accumulated error from some point of reference -+# or at least the timing of same edges, to eliminate (generally harmless) time -+# offsets introduced by digitizing. -+# -+# So it would probably make more sense for "recover" not to check for timing -+# violations at all, and leave this to more specialized functions. -+# -+def recover(self, period, min = None, max = None, t0 = None): -+ if t0 is None: -+ t0 = self.data[0] -+ v = not self.initial -+ res = [] -+ violations = [] -+ for t in self.data: -+ v = not v -+ if t <= t0: -+ continue -+ n = 0 -+ while t0 < t-period/2: -+ res.append(t0) -+ t0 += period -+ n += 1 -+ if min is not None: -+ if t0-t > n*min: -+ violations.append(t) -+ if max is not None: -+ if t-t0 > n*max: -+ violations.append(t) -+ t0 = t -+ return res, violations -+ -+ -+# -+# Load the analog waves saved by get.py -+# -+wv = waves() -+wv.load("_wv") -+ -+# -+# Digitize the waves and save the result. -+# -+dp = wv[0].digitize(1.5, 1.8) -+dm = wv[1].digitize(1.5, 1.8) -+wv = waves(dp, dm, dp-dm) -+wv.save("_dig") -+ -+# -+# Also record the differential signal. -+# -+wd = wv[1]-wv[0] -+dd = wd.digitize(-0.5, 0.5) -+wd.save("_diff") -+ -+# -+# Run clock recovery on D+/D-. We only need one, but check both to be sure. -+# -+#p = 1/1.5e6 -+p = 1/12e6 -+dp_t, viol = recover(dp, p, p*0.9, p*1.1) -+print viol -+dm_t, viol = recover(dm, p, p*.9, p*1.1, t0 = dp.data[0]) -+print viol -+ -+# -+# Shift the clock by half a period, add a few periods to get steady state and -+# SE0s (if any), and then sample the data lines. -+# -+clk = map(lambda t: t+p/2, dp_t) -+clk.extend((clk[-1]+p, clk[-1]+2*p, clk[-1]+3*p)) -+dp_bv = dp.get(clk) -+dm_bv = dm.get(clk) -+ -+# -+# Save a wave with the recovered clock to make it easier to find the bits in -+# analog graphs. -+# -+dd.data = dp_t; -+dd.save("_clk") -+ -+# -+# For decoding, we need a fake bit clock. We generate it by doubling each data -+# bit and generating a L->H transition during this bit. -+# -+dpd = [] -+dmd = [] -+dck = [] -+ -+# err, silly, seems that we've mixed up D+ and D- all over the place :-) -+print d_usb_stream(dm_bv[:], dp_bv[:]) -+ -+for v in dp_bv: -+ dpd.append(v) -+ dpd.append(v) -+ dck.append(0) -+ dck.append(1) -+ -+for v in dm_bv: -+ dmd.append(v) -+ dmd.append(v) -+ -+# -+# Display the reconstructed digital signal. Note that the absolute time is only -+# correct at the beginning and that relative time is only accurate over -+# intervals in which no significant clock resynchronization has occurred. -+# -+# In fact, dxplore should probably have an option to either turn off time -+# entirely or to display a user-provided time axis. The latter may be a bit -+# tricky to implement. -+# -+dxplore((dmd, dpd, dck), 0, p/2, labels = ("D+", "D-", "CLK")) -diff --git a/atusb/an/get.py b/atusb/an/get.py -new file mode 100755 -index 0000000..685e00f ---- /dev/null -+++ b/atusb/an/get.py -@@ -0,0 +1,31 @@ -+#!/usr/bin/python -+ -+from tmc.scope import rigol_ds1000c -+ -+#-800, +1600 -+s = rigol_ds1000c() -+#s.debug = False -+ -+pos = s.hor.pos -+scale = s.hor.scale -+t0 = pos-scale*s.div_hor/2 -+t1 = pos+scale*s.div_hor/2 -+print t0, t1 -+ -+#zoom = 10 -+#step = scale/s.samples_per_div/zoom -+#print step -+step = 4e-9 -+step = 2e-9 -+ -+w = s.wave((s.ch[0], s.ch[1]), start = t0, end = t1, step = step) -+w[0] = 3.3-w[0] -+w[1] = 3.3-w[1] -+ -+s.hor.pos = pos -+s.hor.scale = scale -+ -+w[0].label = "D+"; -+w[1].label = "D-"; -+ -+w.save("_wv") -diff --git a/atusb/an/plot b/atusb/an/plot -new file mode 100755 -index 0000000..1dea789 ---- /dev/null -+++ b/atusb/an/plot -@@ -0,0 +1,12 @@ -+#!/bin/sh -+# -+# Plot output of "dec" -+# -+gnuplot -persist < -+ -+#include -+#include -+#include -+ -+#include "usb.h" -+ -+#include "board.h" -+#include "sernum.h" -+#include "spi.h" -+#include "atusb/ep0.h" -+ -+#ifdef DEBUG -+#include "uart.h" -+#endif -+ -+ -+int main(void) -+{ -+ board_init(); -+ board_app_init(); -+ reset_rf(); -+ -+ user_get_descriptor = sernum_get_descr; -+ -+ /* now we should be at 8 MHz */ -+ -+#ifdef DEBUG -+ uart_init(); -+ static FILE atben_stdout = FDEV_SETUP_STREAM(uart_write_char, NULL, -+ _FDEV_SETUP_WRITE); -+ stdout = &atben_stdout; -+#endif -+ -+ usb_init(); -+ ep0_init(); -+#ifdef ATUSB -+ timer_init(); -+ -+ /* move interrupt vectors to 0 */ -+ MCUCR = 1 << IVCE; -+ MCUCR = 0; -+#endif -+ -+ sei(); -+ -+ while (1) -+ sleep_mode(); -+} -diff --git a/atusb/board.c b/atusb/board.c -new file mode 100644 -index 0000000..c3b8d26 ---- /dev/null -+++ b/atusb/board.c -@@ -0,0 +1,120 @@ -+/* -+ * fw/board.c - Board-specific functions (for boot loader and application) -+ * -+ * Written 2011, 2013 by Werner Almesberger -+ * Copyright 2011, 2013 Werner Almesberger -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+ -+#include -+#include -+ -+#include -+#include -+#include -+ -+#define F_CPU 8000000UL -+#include -+ -+#include "usb.h" -+#include "at86rf230.h" -+#include "board.h" -+#include "spi.h" -+ -+ -+uint8_t board_sernum[42] = { 42, USB_DT_STRING }; -+ -+/* ----- Register access --------------------------------------------------- */ -+ -+void change_state(uint8_t new) -+{ -+ while ((reg_read(REG_TRX_STATUS) & TRX_STATUS_MASK) == -+ TRX_STATUS_TRANSITION); -+ reg_write(REG_TRX_STATE, new); -+} -+ -+ -+uint8_t reg_read(uint8_t reg) -+{ -+ uint8_t value; -+ -+ spi_begin(); -+ spi_send(AT86RF230_REG_READ | reg); -+ value = spi_recv(); -+ spi_end(); -+ -+ return value; -+} -+ -+ -+uint8_t subreg_read(uint8_t address, uint8_t mask, uint8_t position) -+{ -+ /* Read current register value and mask out subregister. */ -+ uint8_t register_value = reg_read(address); -+ register_value &= mask; -+ register_value >>= position; /* Align subregister value. */ -+ -+ return register_value; -+} -+ -+ -+void reg_write(uint8_t reg, uint8_t value) -+{ -+ spi_begin(); -+ spi_send(AT86RF230_REG_WRITE | reg); -+ spi_send(value); -+ spi_end(); -+} -+ -+ -+void subreg_write(uint8_t address, uint8_t mask, uint8_t position, uint8_t value) -+{ -+ /* Read current register value and mask area outside the subregister. */ -+ uint8_t register_value = reg_read(address); -+ register_value &= ~mask; -+ -+ /* Start preparing the new subregister value. shift in place and mask. */ -+ value <<= position; -+ value &= mask; -+ -+ value |= register_value; /* Set the new subregister value. */ -+ -+ /* Write the modified register value. */ -+ reg_write(address, value); -+} -+ -+ -+void panic(void) -+{ -+ cli(); -+ while (1) { -+ SET(LED); -+ _delay_ms(100); -+ CLR(LED); -+ _delay_ms(100); -+ } -+} -+ -+ -+static char hex(uint8_t nibble) -+{ -+ return nibble < 10 ? '0'+nibble : 'a'+nibble-10; -+} -+ -+ -+void get_sernum(void) -+{ -+ uint8_t sig; -+ uint8_t i; -+ -+ for (i = 0; i != 10; i++) { -+ sig = boot_signature_byte_get(i+0xe); -+ board_sernum[(i << 2)+2] = hex(sig >> 4); -+ board_sernum[(i << 2)+4] = hex(sig & 0xf); -+ } -+} -diff --git a/atusb/board.h b/atusb/board.h -new file mode 100644 -index 0000000..dbcd410 ---- /dev/null -+++ b/atusb/board.h -@@ -0,0 +1,95 @@ -+/* -+ * fw/board.h - Board-specific functions and definitions -+ * -+ * Written 2008-2011, 2013, 2013 by Werner Almesberger -+ * Copyright 2008-2011, 2013, 2013 Werner Almesberger -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+#ifndef BOARD_H -+#define BOARD_H -+ -+#include -+#include -+ -+#include -+ -+#ifdef ATUSB -+#include "board_atusb.h" -+#endif -+#ifdef RZUSB -+#include "board_rzusb.h" -+#endif -+#ifdef HULUSB -+#include "board_hulusb.h" -+#endif -+ -+#define SET_2(p, b) PORT##p |= 1 << (b) -+#define CLR_2(p, b) PORT##p &= ~(1 << (b)) -+#define IN_2(p, b) DDR##p &= ~(1 << (b)) -+#define OUT_2(p, b) DDR##p |= 1 << (b) -+#define PIN_2(p, b) ((PIN##p >> (b)) & 1) -+ -+#define SET_1(p, b) SET_2(p, b) -+#define CLR_1(p, b) CLR_2(p, b) -+#define IN_1(p, b) IN_2(p, b) -+#define OUT_1(p, b) OUT_2(p, b) -+#define PIN_1(p, b) PIN_2(p, b) -+ -+#define SET(n) SET_1(n##_PORT, n##_BIT) -+#define CLR(n) CLR_1(n##_PORT, n##_BIT) -+#define IN(n) IN_1(n##_PORT, n##_BIT) -+#define OUT(n) OUT_1(n##_PORT, n##_BIT) -+#define PIN(n) PIN_1(n##_PORT, n##_BIT) -+ -+ -+#define USB_VENDOR ATUSB_VENDOR_ID -+#define USB_PRODUCT ATUSB_PRODUCT_ID -+ -+#define DFU_USB_VENDOR USB_VENDOR -+#define DFU_USB_PRODUCT USB_PRODUCT -+ -+ -+#define BOARD_MAX_mA 40 -+ -+#ifdef BOOT_LOADER -+#define NUM_EPS 1 -+#else -+#define NUM_EPS 2 -+#endif -+ -+#define HAS_BOARD_SERNUM -+ -+extern uint8_t board_sernum[42]; -+extern uint8_t irq_serial; -+ -+ -+void reset_rf(void); -+void reset_cpu(void); -+uint8_t read_irq(void); -+void slp_tr(void); -+ -+void led(bool on); -+void panic(void); -+ -+uint64_t timer_read(void); -+void timer_init(void); -+ -+bool gpio(uint8_t port, uint8_t data, uint8_t dir, uint8_t mask, uint8_t *res); -+void gpio_cleanup(void); -+ -+void get_sernum(void); -+ -+void board_app_init(void); -+ -+uint8_t reg_read(uint8_t reg); -+uint8_t subreg_read(uint8_t address, uint8_t mask, uint8_t position); -+void reg_write(uint8_t reg, uint8_t value); -+void subreg_write(uint8_t address, uint8_t mask, uint8_t position, uint8_t value); -+void change_state(uint8_t new); -+ -+#endif /* !BOARD_H */ -diff --git a/atusb/board_app.c b/atusb/board_app.c -new file mode 100644 -index 0000000..1fa9bf4 ---- /dev/null -+++ b/atusb/board_app.c -@@ -0,0 +1,173 @@ -+/* -+ * fw/board_app.c - Board-specific functions (for the application) -+ * -+ * Written 2011, 2013 by Werner Almesberger -+ * Copyright 2011, 2013 Werner Almesberger -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+ -+#include -+#include -+#include -+ -+#include -+#include -+ -+#define F_CPU 8000000UL -+#include -+ -+#include "usb.h" -+#include "at86rf230.h" -+#include "spi.h" -+#include "mac.h" -+#include "board.h" -+ -+ -+static volatile uint32_t timer_h = 0; /* 2^(16+32) / 8 MHz = ~1.1 years */ -+ -+ -+void reset_cpu(void) -+{ -+ WDTCSR = 1 << WDE; -+} -+ -+ -+uint8_t read_irq(void) -+{ -+ return PIN(IRQ_RF); -+} -+ -+ -+void slp_tr(void) -+{ -+ SET(SLP_TR); -+ CLR(SLP_TR); -+} -+ -+ -+ISR(TIMER1_OVF_vect) -+{ -+ timer_h++; -+} -+ -+ -+uint64_t timer_read(void) -+{ -+ uint32_t high; -+ uint8_t low, mid; -+ -+ do { -+ if (TIFR1 & (1 << TOV1)) { -+ TIFR1 = 1 << TOV1; -+ timer_h++; -+ } -+ high = timer_h; -+ low = TCNT1L; -+ mid = TCNT1H; -+ } -+ while (TIFR1 & (1 << TOV1)); -+ -+ /* -+ * We need all these casts because the intermediate results are handled -+ * as if they were signed and thus get sign-expanded. Sounds wrong-ish. -+ */ -+ return (uint64_t) high << 16 | (uint64_t) mid << 8 | (uint64_t) low; -+} -+ -+ -+void timer_init(void) -+{ -+ /* configure timer 1 as a free-running CLK counter */ -+ -+ TCCR1A = 0; -+ TCCR1B = 1 << CS10; -+ -+ /* enable timer overflow interrupt */ -+ -+ TIMSK1 = 1 << TOIE1; -+} -+ -+ -+bool gpio(uint8_t port, uint8_t data, uint8_t dir, uint8_t mask, uint8_t *res) -+{ -+ EIMSK = 0; /* recover INT_RF to ATUSB_GPIO_CLEANUP or an MCU reset */ -+ -+ switch (port) { -+ case 1: -+ DDRB = (DDRB & ~mask) | dir; -+ PORTB = (PORTB & ~mask) | data; -+ break; -+ case 2: -+ DDRC = (DDRC & ~mask) | dir; -+ PORTC = (PORTC & ~mask) | data; -+ break; -+ case 3: -+ DDRD = (DDRD & ~mask) | dir; -+ PORTD = (PORTD & ~mask) | data; -+ break; -+ default: -+ return 0; -+ } -+ -+ /* disable the UART so that we can meddle with these pins as well. */ -+ spi_off(); -+ _delay_ms(1); -+ -+ switch (port) { -+ case 1: -+ res[0] = PINB; -+ res[1] = PORTB; -+ res[2] = DDRB; -+ break; -+ case 2: -+ res[0] = PINC; -+ res[1] = PORTC; -+ res[2] = DDRC; -+ break; -+ case 3: -+ res[0] = PIND; -+ res[1] = PORTD; -+ res[2] = DDRD; -+ break; -+ } -+ -+ return 1; -+} -+ -+ -+void gpio_cleanup(void) -+{ -+ EIMSK = 1 << 0; -+} -+ -+ -+static void done(void *user) -+{ -+ led(0); -+} -+ -+ -+uint8_t irq_serial; -+ -+#if defined(ATUSB) || defined(HULUSB) -+ISR(INT0_vect) -+#endif -+#ifdef RZUSB -+ISR(TIMER1_CAPT_vect) -+#endif -+{ -+ if (mac_irq) { -+ if (mac_irq()) -+ return; -+ } -+ if (eps[1].state == EP_IDLE) { -+ led(1); -+ irq_serial = (irq_serial+1) | 0x80; -+ usb_send(&eps[1], &irq_serial, 1, done, NULL); -+ } -+} -diff --git a/atusb/board_atusb.c b/atusb/board_atusb.c -new file mode 100644 -index 0000000..a02fb7f ---- /dev/null -+++ b/atusb/board_atusb.c -@@ -0,0 +1,162 @@ -+/* -+ * fw/board_atusb.c - ATUSB Board-specific functions (for boot loader and application) -+ * -+ * Written 2016 by Stefan Schmidt -+ * Copyright 2016 Stefan Schmidt -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+ -+#include -+#include -+ -+#include -+#include -+#include -+ -+#define F_CPU 8000000UL -+#include -+ -+#include "usb.h" -+#include "at86rf230.h" -+#include "board.h" -+#include "spi.h" -+#include "usb/usb.h" -+ -+static bool spi_initialized = 0; -+ -+void reset_rf(void) -+{ -+ /* set up all the outputs; default port value is 0 */ -+ -+ DDRB = 0; -+ DDRC = 0; -+ DDRD = 0; -+ PORTB = 0; -+ PORTC = 0; -+ PORTD = 0; -+ -+ OUT(LED); -+ OUT(nRST_RF); /* this also resets the transceiver */ -+ OUT(SLP_TR); -+ -+ spi_init(); -+ -+ /* AT86RF231 data sheet, 12.4.13, reset pulse width: 625 ns (min) */ -+ -+ CLR(nRST_RF); -+ _delay_us(2); -+ SET(nRST_RF); -+ -+ /* 12.4.14: SPI access latency after reset: 625 ns (min) */ -+ -+ _delay_us(2); -+ -+ /* we must restore TRX_CTRL_0 after each reset (9.6.4) */ -+ -+ set_clkm(); -+} -+ -+void led(bool on) -+{ -+ if (on) -+ SET(LED); -+ else -+ CLR(LED); -+} -+ -+void set_clkm(void) -+{ -+ /* switch CLKM to 8 MHz */ -+ -+ /* -+ * @@@ Note: Atmel advise against changing the external clock in -+ * mid-flight. We should therefore switch to the RC clock first, then -+ * crank up the external clock, and finally switch back to the external -+ * clock. The clock switching procedure is described in the ATmega32U2 -+ * data sheet in secton 8.2.2. -+ */ -+ spi_begin(); -+ spi_send(AT86RF230_REG_WRITE | REG_TRX_CTRL_0); -+ spi_send(CLKM_CTRL_8MHz); -+ spi_end(); -+} -+ -+void board_init(void) -+{ -+ /* Disable the watchdog timer */ -+ -+ MCUSR = 0; /* Remove override */ -+ WDTCSR |= 1 << WDCE; /* Enable change */ -+ WDTCSR = 1 << WDCE; /* Disable watchdog while still enabling -+ change */ -+ -+ CLKPR = 1 << CLKPCE; -+ /* We start with a 1 MHz/8 clock. Disable the prescaler. */ -+ CLKPR = 0; -+ -+ get_sernum(); -+} -+ -+void spi_begin(void) -+{ -+ if (!spi_initialized) -+ spi_init(); -+ CLR(nSS); -+} -+ -+void spi_off(void) -+{ -+ spi_initialized = 0; -+ UCSR1B = 0; -+} -+ -+void spi_init(void) -+{ -+ SET(nSS); -+ OUT(SCLK); -+ OUT(MOSI); -+ OUT(nSS); -+ IN(MISO); -+ -+ UBRR1 = 0; /* set bit rate to zero to begin */ -+ UCSR1C = 1 << UMSEL11 | 1 << UMSEL10; -+ /* set MSPI, MSB first, SPI data mode 0 */ -+ UCSR1B = 1 << RXEN1 | 1 << TXEN1; -+ /* enable receiver and transmitter */ -+ UBRR1 = 0; /* reconfirm the bit rate */ -+ -+ spi_initialized = 1; -+} -+ -+void usb_init(void) -+{ -+ USBCON |= 1 << FRZCLK; /* freeze the clock */ -+ -+ /* enable the PLL and wait for it to lock */ -+ PLLCSR &= ~(1 << PLLP2 | 1 << PLLP1 | 1 << PLLP0); -+ PLLCSR |= 1 << PLLE; -+ while (!(PLLCSR & (1 << PLOCK))); -+ -+ USBCON &= ~(1 << USBE); /* reset the controller */ -+ USBCON |= 1 << USBE; -+ -+ USBCON &= ~(1 << FRZCLK); /* thaw the clock */ -+ -+ UDCON &= ~(1 << DETACH); /* attach the pull-up */ -+ UDIEN = 1 << EORSTE; /* enable device interrupts */ -+// UDCON |= 1 << RSTCPU; /* reset CPU on bus reset */ -+ -+ ep_init(); -+} -+ -+void board_app_init(void) -+{ -+ /* enable INT0, trigger on rising edge */ -+ EICRA = 1 << ISC01 | 1 << ISC00; -+ EIMSK = 1 << 0; -+} -diff --git a/atusb/board_atusb.h b/atusb/board_atusb.h -new file mode 100644 -index 0000000..e5974c7 ---- /dev/null -+++ b/atusb/board_atusb.h -@@ -0,0 +1,48 @@ -+/* -+ * fw/board_atusb.h - ATUSB Board-specific functions and definitions -+ * -+ * Written 2016 by Stefan Schmidt -+ * Copyright 2016 Stefan Schmidt -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+#ifndef BOARD_ATUSB_H -+#define BOARD_ATUSB_H -+ -+#include -+#include -+ -+#define LED_PORT B -+#define LED_BIT 6 -+#define nRST_RF_PORT C -+#define nRST_RF_BIT 7 -+#define SLP_TR_PORT B -+#define SLP_TR_BIT 4 -+ -+#define SCLK_PORT D -+#define SCLK_BIT 5 -+#define MOSI_PORT D -+#define MOSI_BIT 3 -+ -+#define MISO_PORT D -+#define MISO_BIT 2 -+#define nSS_PORT D -+#define nSS_BIT 1 -+#define IRQ_RF_PORT D -+#define IRQ_RF_BIT 0 -+ -+#define SPI_WAIT_DONE() while (!(UCSR1A & 1 << RXC1)) -+#define SPI_DATA UDR1 -+ -+void set_clkm(void); -+void board_init(void); -+ -+void spi_begin(void); -+void spi_off(void); -+void spi_init(void); -+ -+#endif /* !BOARD_H */ -diff --git a/atusb/board_hulusb.c b/atusb/board_hulusb.c -new file mode 100644 -index 0000000..084714e ---- /dev/null -+++ b/atusb/board_hulusb.c -@@ -0,0 +1,179 @@ -+/* -+ * fw/board_hulusb.c - Busware HUL Board-specific functions (for boot loader and application) -+ * -+ * Written 2017 by Filzmaier Josef -+ * Based on fw/board_rzusb written and Copyright 2016 Stefan Schmidt -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+ -+#include -+#include -+ -+#include -+#include -+#include -+ -+#define F_CPU 8000000UL -+#include -+ -+#include "usb.h" -+#include "at86rf230.h" -+#include "board.h" -+#include "spi.h" -+#include "usb/usb.h" -+ -+static bool spi_initialized = 0; -+ -+void reset_rf(void) -+{ -+ /* set up all the outputs; default port value is 0 */ -+ -+ DDRB = 0; -+ DDRC = 0; -+ DDRD = 0; -+ PORTB = 0; -+ PORTC = 0; -+ PORTD = 0; -+ -+ OUT(LED_RED); -+ OUT(LED_GREEN); -+ SET(LED_RED); /* Leds are active low on HULUSB board */ -+ CLR(LED_GREEN); /* Green Led indicates the dongle is running */ -+ OUT(nRST_RF); /* this also resets the transceiver */ -+ OUT(SLP_TR); -+ -+ spi_init(); -+ -+ /* AT86RF212 data sheet, Appendix B, p166 Power-On Reset procedure */ -+ /*-----------------------------------------------------------------*/ -+ CLR(SLP_TR); -+ SET(nRST_RF); -+ SET(nSS); -+ _delay_us(400); -+ -+ CLR(nRST_RF); -+ _delay_us(2); -+ SET(nRST_RF); -+ -+ /* 5.1.4.5: Wait t10: 625 ns (min) */ -+ -+ _delay_us(2); -+ -+ reg_write(REG_TRX_CTRL_0, 0x19); -+ -+ change_state(TRX_CMD_FORCE_TRX_OFF); -+ /*-----------------------------------------------------------------*/ -+ -+ /* we must restore TRX_CTRL_0 after each reset (7.7.4) */ -+ -+ set_clkm(); -+} -+ -+void led_red(bool on) { -+ if (on) -+ CLR(LED_RED); -+ else -+ SET(LED_RED); -+} -+ -+void led_green(bool on) { -+ if (on) -+ CLR(LED_GREEN); -+ else -+ SET(LED_GREEN); -+} -+ -+void led(bool on) -+{ -+ led_red(on); -+} -+ -+void set_clkm(void) -+{ -+ /* CLKM is not connected on BUSWARE HUL and therefore it is running in -+ * async mode. */ -+ reg_write(REG_TRX_CTRL_0, 0x00); -+ -+ /* TX_AUTO_CRC_ON, default disabled */ -+ subreg_write(SR_TX_AUTO_CRC_ON, 1); -+} -+ -+void board_init(void) -+{ -+ /* Disable the watchdog timer */ -+ -+ MCUSR = 0; /* Remove override */ -+ WDTCSR |= 1 << WDCE; /* Enable change */ -+ WDTCSR = 1 << WDCE; /* Disable watchdog while still enabling -+ change */ -+ -+ CLKPR = 1 << CLKPCE; -+ /* We start with a 16 MHz/8 clock. Put the prescaler to 2. */ -+ CLKPR = 1 << CLKPS0; -+ -+ get_sernum(); -+} -+ -+void spi_begin(void) -+{ -+ if (!spi_initialized) -+ spi_init(); -+ CLR(nSS); -+} -+ -+void spi_off(void) -+{ -+ spi_initialized = 0; -+ SPCR &= ~(1 << SPE); -+} -+ -+void spi_init(void) -+{ -+ SET(nSS); -+ OUT(SCLK); -+ OUT(MOSI); -+ OUT(nSS); -+ IN(MISO); -+ -+ SPCR = (1 << SPE) | (1 << MSTR); -+ SPSR = (1 << SPI2X); -+ -+ spi_initialized = 1; -+} -+ -+void usb_init(void) -+{ -+ USBCON |= 1 << FRZCLK; /* freeze the clock */ -+ -+ /* enable the PLL and wait for it to lock */ -+ /* TODO sheet page 50 For Atmel AT90USB128x only. Do not use with Atmel AT90USB64x. */ -+ /* FOR 8 XTAL Mhz only!!! */ -+ PLLCSR = ((1 << PLLP1) | (1 << PLLP0)); -+ PLLCSR |= 1 << PLLE; -+ while (!(PLLCSR & (1 << PLOCK))); -+ -+ UHWCON |= (1 << UVREGE); -+ -+ USBCON &= ~((1 << USBE) | (1 << OTGPADE)); /* reset the controller */ -+ USBCON |= ((1 << USBE) | (1 << OTGPADE)); -+ -+ USBCON &= ~(1 << FRZCLK); /* thaw the clock */ -+ -+ UDCON &= ~(1 << DETACH); /* attach the pull-up */ -+ UDIEN = 1 << EORSTE; /* enable device interrupts */ -+ // UDCON |= 1 << RSTCPU; /* reset CPU on bus reset */ -+ -+ ep_init(); -+} -+ -+void board_app_init(void) -+{ -+ /* enable INT0, trigger on rising edge */ -+ EICRA = 1 << ISC01 | 1 << ISC00; -+ EIMSK = 1 << INT0; -+} -diff --git a/atusb/board_hulusb.h b/atusb/board_hulusb.h -new file mode 100644 -index 0000000..a1dadf0 ---- /dev/null -+++ b/atusb/board_hulusb.h -@@ -0,0 +1,66 @@ -+/* -+ * fw/board_hulusb.h - Busware HUL Board-specific functions (for boot loader and application) -+ * -+ * Written 2017 by Filzmaier Josef -+ * Based on fw/board_rzusb written and Copyright 2016 Stefan Schmidt -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+#ifndef BOARD_HULUSB_H -+#define BOARD_HULUSB_H -+ -+#include -+#include -+ -+#define LED_RED_PORT A -+#define LED_GREEN_PORT A -+#define LED_RED_BIT 3 -+#define LED_GREEN_BIT 4 -+#define LED_PORT LED_RED_PORT -+#define LED_BIT LED_RED_BIT -+ -+#define nRST_RF_PORT B -+#define nRST_RF_BIT 5 -+#define SLP_TR_PORT B -+#define SLP_TR_BIT 4 -+ -+#define SCLK_PORT B -+#define SCLK_BIT 1 -+#define MOSI_PORT B -+#define MOSI_BIT 2 -+ -+#define MISO_PORT B -+#define MISO_BIT 3 -+#define nSS_PORT B -+#define nSS_BIT 0 -+#define IRQ_RF_PORT D -+#define IRQ_RF_BIT 4 -+ -+#define SR_TX_AUTO_CRC_ON 0x04, 0x20, 5 -+#define SR_CHANNEL 0x08, 0x1f, 0 -+ -+#define RG_CC_CTRL_1 (0x14) -+ -+#define SPI_WAIT_DONE() while ((SPSR & (1 << SPIF)) == 0) -+#define SPI_DATA SPDR -+ -+void set_clkm(void); -+void board_init(void); -+ -+void led_red(bool on); -+void led_green(bool on); -+ -+void spi_begin(void); -+void spi_off(void); -+void spi_init(void); -+ -+#ifdef DEBUG -+void printStatus(void); -+#define PRINT_STATUS() printStatus() -+#endif -+ -+#endif /* !BOARD_HULUSB_H */ -diff --git a/atusb/board_rzusb.c b/atusb/board_rzusb.c -new file mode 100644 -index 0000000..e83d6fa ---- /dev/null -+++ b/atusb/board_rzusb.c -@@ -0,0 +1,169 @@ -+/* -+ * fw/board_rzusb.c - RZUSB Board-specific functions (for boot loader and application) -+ * -+ * Written 2016 by Stefan Schmidt -+ * Copyright 2016 Stefan Schmidt -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+ -+#include -+#include -+ -+#include -+#include -+#include -+ -+#define F_CPU 8000000UL -+#include -+ -+#include "usb.h" -+#include "at86rf230.h" -+#include "board.h" -+#include "spi.h" -+#include "usb/usb.h" -+ -+static bool spi_initialized = 0; -+ -+void reset_rf(void) -+{ -+ /* set up all the outputs; default port value is 0 */ -+ -+ DDRB = 0; -+ DDRC = 0; -+ DDRD = 0; -+ PORTB = 0; -+ PORTC = 0; -+ PORTD = 0; -+ -+ OUT(LED); -+ OUT(nRST_RF); /* this also resets the transceiver */ -+ OUT(SLP_TR); -+ -+ spi_init(); -+ -+ /* AT86RF231 data sheet, 12.4.13, reset pulse width: 625 ns (min) */ -+ -+ CLR(nRST_RF); -+ _delay_us(2); -+ SET(nRST_RF); -+ -+ /* 12.4.14: SPI access latency after reset: 625 ns (min) */ -+ -+ _delay_us(2); -+ -+ /* we must restore TRX_CTRL_0 after each reset (9.6.4) */ -+ -+ set_clkm(); -+} -+ -+void led(bool on) -+{ -+ if (on) -+ SET(LED); -+ else -+ CLR(LED); -+} -+ -+void set_clkm(void) -+{ -+ /* switch CLKM to 8 MHz */ -+ -+ /* -+ * @@@ Note: Atmel advise against changing the external clock in -+ * mid-flight. We should therefore switch to the RC clock first, then -+ * crank up the external clock, and finally switch back to the external -+ * clock. The clock switching procedure is described in the ATmega32U2 -+ * data sheet in secton 8.2.2. -+ */ -+ spi_begin(); -+ spi_send(AT86RF230_REG_WRITE | REG_TRX_CTRL_0); -+ spi_send(0x10); -+ spi_end(); -+ -+ /* TX_AUTO_CRC_ON, default disabled */ -+ spi_begin(); -+ spi_send(AT86RF230_REG_WRITE | 0x05); -+ spi_send(0x80); -+ spi_end(); -+} -+ -+void board_init(void) -+{ -+ /* Disable the watchdog timer */ -+ -+ MCUSR = 0; /* Remove override */ -+ WDTCSR |= 1 << WDCE; /* Enable change */ -+ WDTCSR = 1 << WDCE; /* Disable watchdog while still enabling -+ change */ -+ -+ CLKPR = 1 << CLKPCE; -+ /* We start with a 16 MHz/8 clock. Put the prescaler to 2. */ -+ CLKPR = 1 << CLKPS0; -+ -+ get_sernum(); -+} -+ -+void spi_begin(void) -+{ -+ if (!spi_initialized) -+ spi_init(); -+ CLR(nSS); -+} -+ -+void spi_off(void) -+{ -+ spi_initialized = 0; -+ SPCR &= ~(1 << SPE); -+} -+ -+void spi_init(void) -+{ -+ SET(nSS); -+ OUT(SCLK); -+ OUT(MOSI); -+ OUT(nSS); -+ IN(MISO); -+ -+ SPCR = (1 << SPE) | (1 << MSTR); -+ SPSR = (1 << SPI2X); -+ -+ spi_initialized = 1; -+} -+ -+void usb_init(void) -+{ -+ USBCON |= 1 << FRZCLK; /* freeze the clock */ -+ -+ /* enable the PLL and wait for it to lock */ -+ /* TODO sheet page 50 For Atmel AT90USB128x only. Do not use with Atmel AT90USB64x. */ -+ /* FOR 8 XTAL Mhz only!!! */ -+ PLLCSR = ((1 << PLLP1) | (1 << PLLP0)); -+ PLLCSR |= 1 << PLLE; -+ while (!(PLLCSR & (1 << PLOCK))); -+ -+ UHWCON |= (1 << UVREGE); -+ -+ USBCON &= ~((1 << USBE) | (1 << OTGPADE)); /* reset the controller */ -+ USBCON |= ((1 << USBE) | (1 << OTGPADE)); -+ -+ USBCON &= ~(1 << FRZCLK); /* thaw the clock */ -+ -+ UDCON &= ~(1 << DETACH); /* attach the pull-up */ -+ UDIEN = 1 << EORSTE; /* enable device interrupts */ -+// UDCON |= 1 << RSTCPU; /* reset CPU on bus reset */ -+ -+ ep_init(); -+} -+ -+void board_app_init(void) -+{ -+ /* enable timer input capture 1, trigger on rising edge */ -+ TCCR1B = (1 << ICES1); -+ TIFR1 = (1 << ICF1); -+ TIMSK1 = (1 << ICIE1); -+} -diff --git a/atusb/board_rzusb.h b/atusb/board_rzusb.h -new file mode 100644 -index 0000000..c2e518f ---- /dev/null -+++ b/atusb/board_rzusb.h -@@ -0,0 +1,48 @@ -+/* -+ * fw/board_rzusb.h - RZUSB Board-specific functions and definitions -+ * -+ * Written 2016 by Stefan Schmidt -+ * Copyright 2016 Stefan Schmidt -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+#ifndef BOARD_RZUSB_H -+#define BOARD_RZUSB_H -+ -+#include -+#include -+ -+#define LED_PORT D -+#define LED_BIT 7 -+#define nRST_RF_PORT B -+#define nRST_RF_BIT 5 -+#define SLP_TR_PORT B -+#define SLP_TR_BIT 4 -+ -+#define SCLK_PORT B -+#define SCLK_BIT 1 -+#define MOSI_PORT B -+#define MOSI_BIT 2 -+ -+#define MISO_PORT B -+#define MISO_BIT 3 -+#define nSS_PORT B -+#define nSS_BIT 0 -+#define IRQ_RF_PORT D -+#define IRQ_RF_BIT 4 -+ -+#define SPI_WAIT_DONE() while ((SPSR & (1 << SPIF)) == 0) -+#define SPI_DATA SPDR -+ -+void set_clkm(void); -+void board_init(void); -+ -+void spi_begin(void); -+void spi_off(void); -+void spi_init(void); -+ -+#endif /* !BOARD_H */ -diff --git a/atusb/boot.c b/atusb/boot.c -new file mode 100644 -index 0000000..6826ac6 ---- /dev/null -+++ b/atusb/boot.c -@@ -0,0 +1,77 @@ -+/* -+ * fw/boot.c - DFU boot loader for ATUSB -+ * -+ * Written 2008-2011 by Werner Almesberger -+ * Copyright 2008-2011 Werner Almesberger -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+ -+#include -+ -+#include -+#include -+#include -+ -+#define F_CPU 8000000UL -+#include -+ -+#include "usb.h" -+#include "dfu.h" -+ -+#include "board.h" -+#include "spi.h" -+#include "atusb/ep0.h" -+ -+ -+#define MS_TO_LOOPS(ms) ((uint32_t) (ms)*335) -+ -+ -+static void (*run_payload)(void) = 0; -+ -+ -+int main(void) -+{ -+ /* -+ * pgm_read_byte gets cached and there doesn't seem to be any other -+ * way to dissuade gcc from doing this. -+ */ -+ volatile int zero = 0; -+ uint32_t loop = 0; -+ -+ board_init(); -+ reset_rf(); -+ -+ /* now we should be at 8 MHz */ -+ -+ usb_init(); -+ dfu_init(); -+ -+ /* move interrupt vectors to the boot loader */ -+ MCUCR = 1 << IVCE; -+ MCUCR = 1 << IVSEL; -+ -+ sei(); -+ -+ led(1); -+ -+ while (loop != MS_TO_LOOPS(2500)) { -+ if (dfu.state == dfuIDLE && pgm_read_byte(zero) != 0xff) -+ loop++; -+ else -+ loop = 0; -+ } -+ -+ led(0); -+ -+ cli(); -+ -+ usb_reset(); -+ run_payload(); -+ -+ while (1); /* not reached */ -+} -diff --git a/atusb/descr.c b/atusb/descr.c -new file mode 100644 -index 0000000..f96b0ee ---- /dev/null -+++ b/atusb/descr.c -@@ -0,0 +1,104 @@ -+/* -+ * fw/descr.c - USB descriptors -+ * -+ * Written 2008-2011, 2014 by Werner Almesberger -+ * Copyright 2008-2011, 2014 Werner Almesberger -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+ -+#include "usb.h" -+#include "dfu.h" -+#include "board.h" -+ -+ -+#define LE(x) ((uint16_t) (x) & 0xff), ((uint16_t) (x) >> 8) -+ -+/* -+ * Device descriptor -+ */ -+ -+const uint8_t device_descriptor[18] = { -+ 18, /* bLength */ -+ USB_DT_DEVICE, /* bDescriptorType */ -+ LE(0x200), /* bcdUSB */ -+ USB_CLASS_VENDOR_SPEC, /* bDeviceClass */ -+ 0x00, /* bDeviceSubClass */ -+ 0x00, /* bDeviceProtocol */ -+ EP0_SIZE, /* bMaxPacketSize */ -+ LE(USB_VENDOR), /* idVendor */ -+ LE(USB_PRODUCT), /* idProduct */ -+ LE(0x0001), /* bcdDevice */ -+ 0, /* iManufacturer */ -+ 0, /* iProduct */ -+#ifdef HAS_BOARD_SERNUM -+ 1, /* iSerialNumber */ -+#else -+ 0, /* iSerialNumber */ -+#endif -+ 1 /* bNumConfigurations */ -+}; -+ -+ -+/* -+ * Our configuration -+ * -+ * We're always bus-powered. -+ */ -+ -+const uint8_t config_descriptor[] = { -+ 9, /* bLength */ -+ USB_DT_CONFIG, /* bDescriptorType */ -+#if 0 -+ LE(9+9+7+7), /* wTotalLength */ -+#else -+ LE(9+9+7+9), /* wTotalLength */ -+#endif -+ 2, /* bNumInterfaces */ -+ 1, /* bConfigurationValue (> 0 !) */ -+ 0, /* iConfiguration */ -+ USB_ATTR_BUS_POWERED, /* bmAttributes */ -+ ((BOARD_MAX_mA)+1)/2, /* bMaxPower */ -+ -+ /* Interface #0 */ -+ -+ 9, /* bLength */ -+ USB_DT_INTERFACE, /* bDescriptorType */ -+ 0, /* bInterfaceNumber */ -+ 0, /* bAlternateSetting */ -+ 1, /* bNumEndpoints */ -+ USB_CLASS_VENDOR_SPEC, /* bInterfaceClass */ -+ 0, /* bInterfaceSubClass */ -+ 0, /* bInterfaceProtocol */ -+ 0, /* iInterface */ -+ -+#if 0 -+ /* EP OUT */ -+ -+ 7, /* bLength */ -+ USB_DT_ENDPOINT, /* bDescriptorType */ -+ 0x01, /* bEndPointAddress */ -+ 0x02, /* bmAttributes (bulk) */ -+ LE(EP1_SIZE), /* wMaxPacketSize */ -+ 0, /* bInterval */ -+#endif -+ -+#if 1 -+ /* EP IN */ -+ -+ 7, /* bLength */ -+ USB_DT_ENDPOINT, /* bDescriptorType */ -+ 0x81, /* bEndPointAddress */ -+ 0x02, /* bmAttributes (bulk) */ -+ LE(EP1_SIZE), /* wMaxPacketSize */ -+ 0, /* bInterval */ -+#endif -+ -+ /* Interface #1 */ -+ -+ DFU_ITF_DESCR(1, 0, dfu_proto_runtime, 0) -+}; -diff --git a/atusb/ep0.c b/atusb/ep0.c -new file mode 100644 -index 0000000..fa43f3b ---- /dev/null -+++ b/atusb/ep0.c -@@ -0,0 +1,338 @@ -+/* -+ * fw/ep0.c - EP0 extension protocol -+ * -+ * Written 2008-2011, 2013 by Werner Almesberger -+ * Copyright 2008-2011, 2013 Werner Almesberger -+ * Copyright 2015-2016 Stefan Schmidt -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+ -+#include -+#include -+#include -+ -+#include -+#include -+ -+#define F_CPU 8000000UL -+#include -+ -+#ifndef NULL -+#define NULL 0 -+#endif -+ -+#include "usb.h" -+#include "dfu.h" -+ -+#include "at86rf230.h" -+#include "atusb/ep0.h" -+#include "version.h" -+#include "board.h" -+#include "sernum.h" -+#include "spi.h" -+#include "mac.h" -+ -+#ifdef ATUSB -+#define HW_TYPE ATUSB_HW_TYPE_110131 -+#endif -+ -+#ifdef RZUSB -+#define HW_TYPE ATUSB_HW_TYPE_RZUSB -+#endif -+ -+#ifdef HULUSB -+#define HW_TYPE ATUSB_HW_TYPE_HULUSB -+#endif -+ -+#ifdef DEBUG -+#include "uart.h" -+#include -+#define debug(FORMAT,args...) printf(FORMAT,##args) -+#define error(FORMAT,args...) printf(FORMAT,##args) -+#else -+#define debug(...) -+#define error(...) -+#endif -+ -+ -+static const uint8_t id[] = { EP0ATUSB_MAJOR, EP0ATUSB_MINOR, HW_TYPE }; -+static uint8_t buf[MAX_PSDU+3]; /* command, PHDR, and LQI */ -+static uint8_t size; -+ -+ -+static void do_eeprom_write(void *user) -+{ -+ int i; -+ -+ for (i = 0; i < size; i++) -+ eeprom_update_byte((uint8_t*)i, buf[i]); -+} -+ -+static void do_buf_write(void *user) -+{ -+ uint8_t i; -+ -+ spi_begin(); -+ for (i = 0; i != size; i++) -+ spi_send(buf[i]); -+ spi_end(); -+} -+ -+ -+#define BUILD_OFFSET 7 /* '#' plus "65535" plus ' ' */ -+ -+ -+static bool my_setup(const struct setup_request *setup) -+{ -+ uint16_t req = setup->bmRequestType | setup->bRequest << 8; -+ unsigned tmp; -+ uint8_t i; -+ uint64_t tmp64; -+ -+ switch (req) { -+ case ATUSB_FROM_DEV(ATUSB_ID): -+ debug("ATUSB_ID\n"); -+ if (setup->wLength > 3) -+ return 0; -+ usb_send(&eps[0], id, setup->wLength, NULL, NULL); -+ return 1; -+ case ATUSB_FROM_DEV(ATUSB_BUILD): -+ debug("ATUSB_BUILD\n"); -+ tmp = build_number; -+ for (i = BUILD_OFFSET-2; tmp; i--) { -+ buf[i] = (tmp % 10)+'0'; -+ tmp /= 10; -+ } -+ buf[i] = '#'; -+ buf[BUILD_OFFSET-1] = ' '; -+ for (size = 0; build_date[size]; size++) -+ buf[BUILD_OFFSET+size] = build_date[size]; -+ size += BUILD_OFFSET-i; -+ if (size > setup->wLength) -+ return 0; -+ usb_send(&eps[0], buf+i, size, NULL, NULL); -+ return 1; -+ -+ case ATUSB_TO_DEV(ATUSB_RESET): -+ debug("ATUSB_RESET\n"); -+ reset_cpu(); -+ while (1); -+ -+ case ATUSB_TO_DEV(ATUSB_RF_RESET): -+ debug("ATUSB_RF_RESET\n"); -+ reset_rf(); -+ mac_reset(); -+ //ep_send_zlp(EP_CTRL); -+ return 1; -+ -+ case ATUSB_FROM_DEV(ATUSB_POLL_INT): -+ debug("ATUSB_POLL_INT\n"); -+ if (setup->wLength < 1) -+ return 0; -+ *buf = read_irq(); -+ usb_send(&eps[0], buf, 1, NULL, NULL); -+ return 1; -+ -+ case ATUSB_FROM_DEV(ATUSB_TIMER): -+ debug("ATUSB_TIMER\n"); -+ size = setup->wLength; -+ if (size > sizeof(tmp64)) -+ size = sizeof(tmp64); -+ tmp64 = timer_read(); -+ memcpy(buf, &tmp64, sizeof(tmp64)); -+ usb_send(&eps[0], buf, size, NULL, NULL); -+ return 1; -+ -+ case ATUSB_FROM_DEV(ATUSB_GPIO): -+ debug("ATUSB_GPIO\n"); -+ if (setup->wLength < 3) -+ return 0; -+ if (!gpio(setup->wIndex, setup->wValue, setup->wValue >> 8, -+ setup->wIndex >> 8, buf)) -+ return 0; -+ usb_send(&eps[0], buf, 3, NULL, NULL); -+ return 1; -+ case ATUSB_TO_DEV(ATUSB_GPIO_CLEANUP): -+ gpio_cleanup(); -+ return 1; -+ -+ case ATUSB_TO_DEV(ATUSB_SLP_TR): -+ debug("ATUSB_SLP_TR\n"); -+ slp_tr(); -+ return 1; -+ -+ case ATUSB_TO_DEV(ATUSB_REG_WRITE): -+ debug("ATUSB_REG_WRITE\n"); -+ spi_begin(); -+ spi_send(AT86RF230_REG_WRITE | setup->wIndex); -+ spi_send(setup->wValue); -+ spi_end(); -+ //ep_send_zlp(EP_CTRL); -+ return 1; -+ case ATUSB_FROM_DEV(ATUSB_REG_READ): -+ debug("ATUSB_REG_READ\n"); -+ spi_begin(); -+ spi_send(AT86RF230_REG_READ | setup->wIndex); -+ *buf = spi_recv(); -+ spi_end(); -+ usb_send(&eps[0], buf, 1, NULL, NULL); -+ return 1; -+ -+ case ATUSB_TO_DEV(ATUSB_BUF_WRITE): -+ debug("ATUSB_BUF_WRITE\n"); -+ if (setup->wLength < 1) -+ return 0; -+ if (setup->wLength > MAX_PSDU) -+ return 0; -+ buf[0] = AT86RF230_BUF_WRITE; -+ buf[1] = setup->wLength; -+ size = setup->wLength+2; -+ usb_recv(&eps[0], buf+2, setup->wLength, do_buf_write, NULL); -+ return 1; -+ case ATUSB_FROM_DEV(ATUSB_BUF_READ): -+ debug("ATUSB_BUF_READ\n"); -+ if (setup->wLength < 2) /* PHR+LQI */ -+ return 0; -+ if (setup->wLength > MAX_PSDU+2) /* PHR+PSDU+LQI */ -+ return 0; -+ spi_begin(); -+ spi_send(AT86RF230_BUF_READ); -+ size = spi_recv(); -+ if (size >= setup->wLength) -+ size = setup->wLength-1; -+ for (i = 0; i != size+1; i++) -+ buf[i] = spi_recv(); -+ spi_end(); -+ usb_send(&eps[0], buf, size+1, NULL, NULL); -+ return 1; -+ -+ case ATUSB_TO_DEV(ATUSB_SRAM_WRITE): -+ debug("ATUSB_SRAM_WRITE\n"); -+ if (setup->wIndex > SRAM_SIZE) -+ return 0; -+ if (setup->wIndex+setup->wLength > SRAM_SIZE) -+ return 0; -+ buf[0] = AT86RF230_SRAM_WRITE; -+ buf[1] = setup->wIndex; -+ size = setup->wLength+2; -+ usb_recv(&eps[0], buf+2, setup->wLength, do_buf_write, NULL); -+ return 1; -+ case ATUSB_FROM_DEV(ATUSB_SRAM_READ): -+ debug("ATUSB_SRAM_READ\n"); -+ if (setup->wIndex > SRAM_SIZE) -+ return 0; -+ if (setup->wIndex+setup->wLength > SRAM_SIZE) -+ return 0; -+ spi_begin(); -+ spi_send(AT86RF230_SRAM_READ); -+ spi_send(setup->wIndex); -+ for (i = 0; i != setup->wLength; i++) -+ buf[i] = spi_recv(); -+ spi_end(); -+ usb_send(&eps[0], buf, setup->wLength, NULL, NULL); -+ return 1; -+ -+ case ATUSB_TO_DEV(ATUSB_SPI_WRITE): -+ size = setup->wLength+2; -+ if (size > sizeof(buf)) -+ return 0; -+ buf[0] = setup->wValue; -+ buf[1] = setup->wIndex; -+ if (setup->wLength) -+ usb_recv(&eps[0], buf+2, setup->wLength, -+ do_buf_write, NULL); -+ else -+ do_buf_write(NULL); -+ return 1; -+ case ATUSB_FROM_DEV(ATUSB_SPI_WRITE2_SYNC): -+ spi_begin(); -+ spi_send(setup->wValue); -+ spi_send(setup->wIndex); -+ spi_end(); -+ buf[0] = irq_serial; -+ if (setup->wLength) -+ usb_send(&eps[0], buf, 1, NULL, NULL); -+ return 1; -+ -+ case ATUSB_FROM_DEV(ATUSB_SPI_READ1): -+ case ATUSB_FROM_DEV(ATUSB_SPI_READ2): -+ spi_begin(); -+ spi_send(setup->wValue); -+ if (req == ATUSB_FROM_DEV(ATUSB_SPI_READ2)) -+ spi_send(setup->wIndex); -+ for (i = 0; i != setup->wLength; i++) -+ buf[i] = spi_recv(); -+ spi_end(); -+ usb_send(&eps[0], buf, setup->wLength, NULL, NULL); -+ return 1; -+ -+ case ATUSB_TO_DEV(ATUSB_RX_MODE): -+ return mac_rx(setup->wValue); -+ case ATUSB_TO_DEV(ATUSB_TX): -+ return mac_tx(setup->wValue, setup->wIndex, setup->wLength); -+ case ATUSB_TO_DEV(ATUSB_EUI64_WRITE): -+ debug("ATUSB_EUI64_WRITE\n"); -+ usb_recv(&eps[0], buf, setup->wLength, do_eeprom_write, NULL); -+ _delay_ms(100); -+ reset_cpu(); -+ return 1; -+ -+ case ATUSB_FROM_DEV(ATUSB_EUI64_READ): -+ debug("ATUSB_EUI64_READ\n"); -+ eeprom_read_block(buf, (const void*)0, 8); -+ usb_send(&eps[0], buf, 8, NULL, NULL); -+ return 1; -+ -+ default: -+ error("Unrecognized SETUP: 0x%02x 0x%02x ...\n", -+ setup->bmRequestType, setup->bRequest); -+ return 0; -+ } -+} -+ -+ -+static bool my_dfu_setup(const struct setup_request *setup) -+{ -+ switch (setup->bmRequestType | setup->bRequest << 8) { -+ case DFU_TO_DEV(DFU_DETACH): -+ /* @@@ should use wTimeout */ -+ dfu.state = appDETACH; -+ return 1; -+ default: -+ return dfu_setup_common(setup); -+ } -+} -+ -+ -+static void my_set_interface(int nth) -+{ -+ if (nth) { -+ user_setup = my_dfu_setup; -+ user_get_descriptor = dfu_my_descr; -+ dfu.state = appIDLE; -+ } else { -+ user_setup = my_setup; -+ user_get_descriptor = sernum_get_descr; -+ } -+} -+ -+ -+static void my_reset(void) -+{ -+ if (dfu.state == appDETACH) -+ reset_cpu(); -+} -+ -+ -+void ep0_init(void) -+{ -+ user_setup = my_setup; -+ user_set_interface = my_set_interface; -+ my_set_interface(0); -+ user_reset = my_reset; -+} -diff --git a/atusb/flash.c b/atusb/flash.c -new file mode 100644 -index 0000000..1f8e59d ---- /dev/null -+++ b/atusb/flash.c -@@ -0,0 +1,97 @@ -+/* -+ * fw/flash.c - Board-specific flash functions -+ * -+ * Written 2011, 2013-2015 by Werner Almesberger -+ * Copyright 2011, 2013-2015 Werner Almesberger -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+ -+#include -+#include -+ -+#include -+#include -+ -+#include "dfu.h" -+#include "board.h" -+ -+ -+static uint32_t payload; -+ -+ -+static void flash_start(void) -+{ -+ payload = 0; -+} -+ -+ -+static bool flash_can_write(uint16_t size) -+{ -+ return payload+size <= BOOT_ADDR; -+} -+ -+ -+static void flash_write(const uint8_t *buf, uint16_t size) -+{ -+ static uint8_t last; -+ const uint8_t *p; -+ -+ for (p = buf; p != buf+size; p++) { -+ if (!(payload & (SPM_PAGESIZE-1))) { -+ boot_page_erase(payload); -+ boot_spm_busy_wait(); -+ } -+ -+ if (payload & 1) -+ boot_page_fill(payload, last | (*p << 8)); -+ else -+ last = *p; -+ payload++; -+ -+ if (!(payload & (SPM_PAGESIZE-1))) { -+ boot_page_write(payload-SPM_PAGESIZE); -+ boot_spm_busy_wait(); -+ } -+ } -+} -+ -+ -+static void flash_end_write(void) -+{ -+ if (payload & (SPM_PAGESIZE-1)) { -+ boot_page_write(payload & ~(SPM_PAGESIZE-1)); -+ boot_spm_busy_wait(); -+ } -+ boot_rww_enable(); -+} -+ -+ -+static uint16_t flash_read(uint8_t *buf, uint16_t size) -+{ -+ uint16_t got = 0; -+ -+ while (size && payload != (uint32_t) FLASHEND+1) { -+ *buf++ = pgm_read_byte(payload); -+ payload++; -+ size--; -+ got++; -+ } -+ return got; -+} -+ -+ -+static const struct dfu_flash_ops flash_ops = { -+ .start = flash_start, -+ .can_write = flash_can_write, -+ .write = flash_write, -+ .end_write = flash_end_write, -+ .read = flash_read, -+}; -+ -+ -+const struct dfu_flash_ops *dfu_flash_ops = &flash_ops; -diff --git a/atusb/include/at86rf230.h b/atusb/include/at86rf230.h -new file mode 100644 -index 0000000..4c3ae22 ---- /dev/null -+++ b/atusb/include/at86rf230.h -@@ -0,0 +1,402 @@ -+/* -+ * include/at86rf230.h - AT86RF230/AT86RF231 protocol and register definitions -+ * -+ * Written 2008-2011 by Werner Almesberger -+ * Copyright 2008-2011 Werner Almesberger -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+ -+#ifndef AT86RF230_H -+#define AT86RF230_H -+ -+enum { -+ AT86RF230_REG_WRITE = 0xc0, /* 11... */ -+ AT86RF230_REG_READ = 0x80, /* 10... */ -+ AT86RF230_BUF_WRITE = 0x60, /* 011... */ -+ AT86RF230_BUF_READ = 0x20, /* 001... */ -+ AT86RF230_SRAM_WRITE = 0x40, /* 010... */ -+ AT86RF230_SRAM_READ = 0x00 /* 000... */ -+}; -+ -+#define MAX_PSDU 127 /* octets, see AT86RF230 manual section 8.1 */ -+#define SRAM_SIZE 128 -+ -+ -+/* --- Registers ----------------------------------------------------------- */ -+ -+enum { -+ REG_TRX_STATUS = 0x01, -+ REG_TRX_STATE = 0x02, -+ REG_TRX_CTRL_0 = 0x03, -+ -+ REG_TRX_CTRL_1 = 0x04, /* 231 only */ -+ -+ REG_PHY_TX_PWR = 0x05, -+ REG_PHY_RSSI = 0x06, -+ REG_PHY_ED_LEVEL = 0x07, -+ REG_PHY_CC_CCA = 0x08, -+ REG_CCA_THRES = 0x09, -+ -+ REG_RX_CTRL = 0x0a, /* 231 only */ -+ REG_SFD_VALUE = 0x0b, /* 231 only */ -+ REG_TRX_CTRL_2 = 0x0c, /* 231 only */ -+ REG_ANT_DIV = 0x0d, /* 231 only */ -+ -+ REG_IRQ_MASK = 0x0e, -+ REG_IRQ_STATUS = 0x0f, -+ REG_VREG_CTRL = 0x10, -+ REG_BATMON = 0x11, -+ REG_XOSC_CTRL = 0x12, -+ -+ REG_RX_SYN = 0x15, /* 231 only */ -+ REG_XAH_CTRL_1 = 0x17, /* 231 only */ -+ REG_FTN_CTRL = 0x18, /* 231 only */ -+ -+ REG_PLL_CF = 0x1a, -+ REL_PLL_DCU = 0x1b, -+ REG_PART_NUM = 0x1c, -+ REG_VERSION_NUM = 0x1d, -+ REG_MAN_ID_0 = 0x1e, -+ REG_MAN_ID_1 = 0x1f, -+ REG_SHORT_ADDR_0 = 0x20, -+ REG_SHORT_ADDR_1 = 0x21, -+ REG_PAN_ID_0 = 0x22, -+ REG_PAN_ID_1 = 0x23, -+ REG_IEEE_ADDR_0 = 0x24, -+ REG_IEEE_ADDR_1 = 0x25, -+ REG_IEEE_ADDR_2 = 0x26, -+ REG_IEEE_ADDR_3 = 0x27, -+ REG_IEEE_ADDR_4 = 0x28, -+ REG_IEEE_ADDR_5 = 0x29, -+ REG_IEEE_ADDR_6 = 0x2a, -+ REG_IEEE_ADDR_7 = 0x2b, -+ -+ REG_XAH_CTRL_0 = 0x2c, /* XAH_CTRL in 230 */ -+ REG_CSMA_SEED_0 = 0x2d, -+ REG_CSMA_SEED_1 = 0x2e, -+ REG_CSMA_BE = 0x2f, /* 231 only */ -+ -+ REG_CONT_TX_0 = 0x36, -+ REG_CONT_TX_1 = 0x3d, /* 230 only */ -+}; -+ -+/* --- TRX_STATUS --- ------------------------------------------------------ */ -+ -+#define CCA_DONE (1 << 7) -+#define CCA_STATUS (1 << 6) -+ -+#define TRX_STATUS_SHIFT 0 -+#define TRX_STATUS_MASK 0x1f -+ -+enum { -+ TRX_STATUS_P_ON = 0x00, /* reset default */ -+ TRX_STATUS_BUSY_RX = 0x01, -+ TRX_STATUS_BUSY_TX = 0x02, -+ TRX_STATUS_RX_ON = 0x06, -+ TRX_STATUS_TRX_OFF = 0x08, -+ TRX_STATUS_PLL_ON = 0x09, -+ TRX_STATUS_SLEEP = 0x0f, -+ TRX_STATUS_BUSY_RX_AACK = 0x11, -+ TRX_STATUS_BUSY_TX_ARET = 0x12, -+ TRX_STATUS_RX_AACK_ON = 0x16, -+ TRX_STATUS_TX_ARET_ON = 0x19, -+ TRX_STATUS_RX_ON_NOCLK = 0x1c, -+ TRX_STATUS_RX_AACK_ON_NOCLK = 0x1d, -+ TRX_STATUS_BUSY_RX_AACK_NOCLK = 0x1e, -+ TRX_STATUS_TRANSITION = 0x1f /* ..._IN_PROGRESS */ -+}; -+ -+/* --- TRX_STATE ----------------------------------------------------------- */ -+ -+#define TRAC_STATUS_SHIFT 5 -+#define TRAC_STATUS_MASK 7 -+ -+enum { -+ TRAC_STATUS_SUCCESS = 0, /* reset default */ -+ TRAC_STATUS_SUCCESS_DATA_PENDING = 1, -+ TRAC_STATUS_SUCCESS_WAIT_FOR_ACK = 2, /* 231 only */ -+ TRAC_STATUS_CHANNEL_ACCESS_FAILURE = 3, -+ TRAC_STATUS_NO_ACK = 5, -+ TRAC_STATUS_INVALID = 7 -+}; -+ -+#define TRX_CMD_SHIFT 0 -+#define TRX_CMD_MASK 0x1f -+ -+enum { -+ TRX_CMD_NOP = 0x00, /* reset default */ -+ TRX_CMD_TX_START = 0x02, -+ TRX_CMD_FORCE_TRX_OFF = 0x03, -+ TRX_CMD_FORCE_PLL_ON = 0x04, /* 231 only */ -+ TRX_CMD_RX_ON = 0x06, -+ TRX_CMD_TRX_OFF = 0x08, -+ TRX_CMD_PLL_ON = 0x09, -+ TRX_CMD_RX_AACK_ON = 0x16, -+ TRX_CMD_TX_ARET_ON = 0x19, -+}; -+ -+/* --- TRX_CTRL_0 ---------------------------------------------------------- */ -+ -+#define PAD_IO_SHIFT 6 -+#define PAD_IO_MASK 3 -+ -+enum { -+ PAD_IO_2mA, /* reset default */ -+ PAD_IO_4mA, -+ PAD_IO_6mA, -+ PAD_IO_8mA -+}; -+ -+#define PAD_IO_CLKM_SHIFT 4 -+#define PAD_IO_CLKM_MASK 3 -+ -+enum { -+ PAD_IO_CLKM_2mA, -+ PAD_IO_CLKM_4mA, /* reset default */ -+ PAD_IO_CLKM_5mA, -+ PAD_IO_CLKM_8mA, -+}; -+ -+#define CLKM_SHA_SEL (1 << 3) -+ -+#define CLKM_CTRL_SHIFT 0 -+#define CLKM_CTRL_MASK 7 -+ -+enum { -+ CLKM_CTRL_OFF = 0, -+ CLKM_CTRL_1MHz = 1, /* reset default */ -+ CLKM_CTRL_2MHz = 2, -+ CLKM_CTRL_4MHz = 3, -+ CLKM_CTRL_8MHz = 4, -+ CLKM_CTRL_16MHz = 5 -+}; -+ -+/* --- TRX_CTRL_1 (231 only) ----------------------------------------------- */ -+ -+#define PA_EXT_EN (1 << 7) -+#define IRQ_2_EXT_EN (1 << 6) -+#define TX_AUTO_CRC_ON (1 << 5) /* 231 location */ -+#define RX_BL_CTRL (1 << 4) -+ -+#define SPI_CMD_MODE_SHIFT 2 -+#define SPI_CMD_MODE_MASK 3 -+ -+enum { -+ SPI_CMD_MODE_EMPTY = 0, /* reset default */ -+ SPI_CMD_MODE_TRX_STATUS = 1, -+ SPI_CMD_MODE_PHY_RSSI = 2, -+ SPI_CMD_MODE_IRQ_STATUS = 3, -+}; -+ -+#define IRQ_MASK_MODE (1 << 1) -+#define IRQ_POLARITY (1 << 0) -+ -+/* --- PHY_TX_PWR ---------------------------------------------------------- */ -+ -+#define TX_AUTO_CRC_ON_230 (1 << 7) /* 230 location */ -+ -+#define PA_BUF_LT_SHIFT 6 -+#define PA_BUF_LT_MASK 3 -+ -+#define PA_LT_SHIFT 4 -+#define PA_LT_MASK 3 -+ -+#define TX_PWR_SHIFT 0 -+#define TX_PWR_MASK 0x0f -+ -+/* --- PHY_RSSI ------------------------------------------------------------ */ -+ -+#define RX_CRC_VALID (1 << 7) -+ -+#define RND_VALUE_SHIFT 5 /* 231 only */ -+#define RND_VALUE_MASK 3 -+ -+#define RSSI_SHIFT 0 -+#define RSSI_MASK 0x1f -+ -+/* --- PHY_CC_CCA ---------------------------------------------------------- */ -+ -+#define CCA_REQUEST (1 << 7) -+ -+#define CCA_MODE_SHIFT 5 -+#define CCA_MODE_MASK 3 -+ -+enum { -+ CCA_MODE_CARRIER_OR_ENERGY = 0, /* 231 only */ -+ CCA_MODE_ENERGY = 1, /* reset default */ -+ CCA_MODE_CARRIER = 2, -+ CCA_MODE_CARRIER_AND_ENERGY = 3 -+}; -+ -+#define CHANNEL_SHIFT 0 -+#define CHANNEL_MASK 0x1f -+ -+/* --- CCA_THRES ----------------------------------------------------------- */ -+ -+#define CCA_ED_THRES_SHIFT 0 -+#define CCA_ED_THRES_MASK 0x0f -+ -+/* --- RX_CTRL (231 only) -------------------------------------------------- */ -+ -+#define PDT_THRES_SHIFT 0 -+#define PDT_THRES_MASK 0x0f -+ -+enum { -+ PDT_THRES_DEFAULT = 0x07, /* reset default */ -+ PDT_THRES_DIVERSITY = 0x03, -+}; -+ -+/* --- TRX_CTRL_2 (231 only) ----------------------------------------------- */ -+ -+#define RX_SAFE_MODE (1 << 7) -+ -+#define OQPSK_DATA_RATE_SHIFT 0 -+#define OQPSK_DATA_RATE_MASK 3 -+ -+enum { -+ OQPSK_DATA_RATE_250 = 0, /* reset default */ -+ OQPSK_DATA_RATE_500 = 1, -+ OQPSK_DATA_RATE_1000 = 2, -+ OQPSK_DATA_RATE_2000 = 3 -+}; -+ -+/* --- ANT_DIV (231 only) -------------------------------------------------- */ -+ -+#define ANT_SEL (1 << 7) -+#define ANT_DIV_EN (1 << 3) -+#define ANT_EXT_SW_EN (1 << 2) -+ -+#define ANT_CTRL_SHIFT 0 -+#define ANT_CTRL_MASK 3 -+ -+enum { -+ ANT_CTRL_ANT_0 = 1, -+ ANT_CTRL_ANT_1 = 2, -+ ANT_CTRL_NODIV = 3, /* reset default */ -+}; -+ -+/* --- IRQ_MASK/IRQ_STATUS ------------------------------------------------- */ -+ -+enum { -+ IRQ_PLL_LOCK = 1 << 0, -+ IRQ_PLL_UNLOCK = 1 << 1, -+ IRQ_RX_START = 1 << 2, -+ IRQ_TRX_END = 1 << 3, -+ IRQ_CCA_ED_DONE = 1 << 4, /* 231 only */ -+ IRQ_AMI = 1 << 5, /* 231 only */ -+ IRQ_TRX_UR = 1 << 6, -+ IRQ_BAT_LOW = 1 << 7 -+}; -+ -+/* --- VREG_CTRL ----------------------------------------------------------- */ -+ -+#define AVREG_EXT (1 << 7) -+#define AVDD_OK (1 << 6) -+#define DVREG_EXT (1 << 3) -+#define DVDD_OK (1 << 2) -+ -+/* --- BATMON -------------------------------------------------------------- */ -+ -+#define BATMON_OK (1 << 5) -+#define BATMON_HR (1 << 4) -+ -+#define BATMON_VTH_SHIFT 0 -+#define BATMON_VTH_MASK 0x0f -+ -+/* --- XOSC_CTRL ----------------------------------------------------------- */ -+ -+#define XTAL_MODE_SHIFT 4 -+#define XTAL_MODE_MASK 0x0f -+ -+enum { -+ XTAL_MODE_OFF = 0x0, /* 230 only */ -+ XTAL_MODE_EXT = 0x4, -+ XTAL_MODE_INT = 0xf /* reset default */ -+}; -+ -+#define XTAL_TRIM_SHIFT 4 -+#define XTAL_TRIM_MASK 0x0f -+ -+/* --- RX_SYN (231 only) --------------------------------------------------- */ -+ -+#define RX_PDT_DIS (1 << 7) -+ -+#define RX_PDT_LEVEL_SHIFT 0 -+#define RX_PDT_LEVEL_MASK 0xf -+ -+/* --- XAH_CTRL_1 (231 only) ----------------------------------------------- */ -+ -+#define AACK_FLTR_RES_FT (1 << 5) -+#define AACK_UPLD_RES_FT (1 << 4) -+#define AACK_ACK_TIME (1 << 2) -+#define AACK_PROM_MODE (1 << 1) -+ -+/* --- FTN_CTRL (231 only) ------------------------------------------------- */ -+ -+#define FTN_START (1 << 7) -+ -+/* --- PLL_CF -------------------------------------------------------------- */ -+ -+#define PLL_CF_START (1 << 7) -+ -+/* --- PLL_DCU ------------------------------------------------------------- */ -+ -+#define PLL_DCU_START (1 << 7) -+ -+/* --- XAH_CTRL_0 (XAH_CTRL in 230) ---------------------------------------- */ -+ -+#define MAX_FRAME_RETRIES_SHIFT 4 -+#define MAX_FRAME_RETRIES_MASK 0x0f -+ -+#define MAX_CSMA_RETRIES_SHIFT 1 -+#define MAX_CSMA_RETRIES_MASK 0x07 -+ -+#define SLOTTED_OPERATION (1 << 0) /* 231 only */ -+ -+/* --- CSMA_SEED_1 --------------------------------------------------------- */ -+ -+#define MIN_BE_SHIFT_230 6 /* 230 location */ -+#define MIN_BE_MASK_230 3 -+ -+#define AACK_FVN_MODE_SHIFT 6 /* 231 only */ -+#define AACK_FVN_MODE_MASK 3 -+ -+enum { -+ AACK_FVN_MODE_0 = 0, -+ AACK_FVN_MODE_01 = 1, /* reset default */ -+ AACK_FVN_MODE_012 = 2, -+ AACK_FVN_MODE_ANY = 3 -+}; -+ -+#define AACK_SET_PD (1 << 5) -+#define AACK_DIS_ACK (1 << 4) /* 231 only */ -+#define I_AM_COORD (1 << 3) -+ -+#define CSMA_SEED_1_SHIFT 0 -+#define CSMA_SEED_1_MASK 7 -+ -+/* --- CSMA_BE ------------------------------------------------------------- */ -+ -+#define MAX_BE_SHIFT 4 -+#define MAX_BE_MASK 0x0f -+ -+#define MIN_BE_SHIFT 0 /* 231 location */ -+#define MIN_BE_MASK 0x0f -+ -+/* --- REG_CONT_TX_0 ------------------------------------------------------- */ -+ -+#define CONT_TX_MAGIC 0x0f -+ -+/* --- REG_CONT_TX_1 (230 only) -------------------------------------------- */ -+ -+#define CONT_TX_MOD 0x00 /* modulated */ -+#define CONT_TX_M2M 0x10 /* f_CH-2 MHz */ -+#define CONT_TX_M500K 0x80 /* f_CH-0.5 MHz */ -+#define CONT_TX_P500K 0xc0 /* f_CH+0.5 MHz */ -+ -+#endif /* !AT86RF230_H */ -diff --git a/atusb/include/atusb/atusb.h b/atusb/include/atusb/atusb.h -new file mode 100644 -index 0000000..555d14b ---- /dev/null -+++ b/atusb/include/atusb/atusb.h -@@ -0,0 +1,97 @@ -+/* -+ * atusb.h - Definitions shared between kernel and ATUSB firmware -+ * -+ * Written 2013 by Werner Almesberger -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation, version 2, or -+ * (at your option) any later version. -+ * -+ * This file should be identical for kernel and firmware. -+ * Kernel: drivers/net/ieee802154/atusb.h -+ * Firmware: ben-wpan/atusb/fw/include/atusb/atusb.h -+ */ -+ -+#ifndef _ATUSB_H -+#define _ATUSB_H -+ -+#define ATUSB_VENDOR_ID 0x20b7 /* Qi Hardware*/ -+#define ATUSB_PRODUCT_ID 0x1540 /* 802.15.4, device 0 */ -+ /* -- - - */ -+ -+#define ATUSB_BUILD_SIZE 256 /* maximum build version/date message length */ -+ -+/* Commands to our device. Make sure this is synced with the firmware */ -+enum atusb_requests { -+ ATUSB_ID = 0x00, /* system status/control grp */ -+ ATUSB_BUILD, -+ ATUSB_RESET, -+ ATUSB_RF_RESET = 0x10, /* debug/test group */ -+ ATUSB_POLL_INT, -+ ATUSB_TEST, /* atusb-sil only */ -+ ATUSB_TIMER, -+ ATUSB_GPIO, -+ ATUSB_SLP_TR, -+ ATUSB_GPIO_CLEANUP, -+ ATUSB_REG_WRITE = 0x20, /* transceiver group */ -+ ATUSB_REG_READ, -+ ATUSB_BUF_WRITE, -+ ATUSB_BUF_READ, -+ ATUSB_SRAM_WRITE, -+ ATUSB_SRAM_READ, -+ ATUSB_SPI_WRITE = 0x30, /* SPI group */ -+ ATUSB_SPI_READ1, -+ ATUSB_SPI_READ2, -+ ATUSB_SPI_WRITE2_SYNC, -+ ATUSB_RX_MODE = 0x40, /* HardMAC group */ -+ ATUSB_TX, -+ ATUSB_EUI64_WRITE = 0x50, /* Parameter in EEPROM grp */ -+ ATUSB_EUI64_READ, -+}; -+ -+enum { -+ ATUSB_HW_TYPE_100813, /* 2010-08-13 */ -+ ATUSB_HW_TYPE_101216, /* 2010-12-16 */ -+ ATUSB_HW_TYPE_110131, /* 2011-01-31, ATmega32U2-based */ -+ ATUSB_HW_TYPE_RZUSB, /* Atmel Raven USB dongle with at86rf230 */ -+ ATUSB_HW_TYPE_HULUSB, /* Busware HUL USB dongle with at86rf212 */ -+}; -+ -+/* -+ * Direction bRequest wValue wIndex wLength -+ * -+ * ->host ATUSB_ID - - 3 -+ * ->host ATUSB_BUILD - - #bytes -+ * host-> ATUSB_RESET - - 0 -+ * -+ * host-> ATUSB_RF_RESET - - 0 -+ * ->host ATUSB_POLL_INT - - 1 -+ * host-> ATUSB_TEST - - 0 -+ * ->host ATUSB_TIMER - - #bytes (6) -+ * ->host ATUSB_GPIO dir+data mask+p# 3 -+ * host-> ATUSB_SLP_TR - - 0 -+ * host-> ATUSB_GPIO_CLEANUP - - 0 -+ * -+ * host-> ATUSB_REG_WRITE value addr 0 -+ * ->host ATUSB_REG_READ - addr 1 -+ * host-> ATUSB_BUF_WRITE - - #bytes -+ * ->host ATUSB_BUF_READ - - #bytes -+ * host-> ATUSB_SRAM_WRITE - addr #bytes -+ * ->host ATUSB_SRAM_READ - addr #bytes -+ * -+ * host-> ATUSB_SPI_WRITE byte0 byte1 #bytes -+ * ->host ATUSB_SPI_READ1 byte0 - #bytes -+ * ->host ATUSB_SPI_READ2 byte0 byte1 #bytes -+ * ->host ATUSB_SPI_WRITE2_SYNC byte0 byte1 0/1 -+ * -+ * host-> ATUSB_RX_MODE on - 0 -+ * host-> ATUSB_TX flags ack_seq #bytes -+ * host-> ATUSB_EUI64_WRITE - - #bytes (8) -+ * ->host ATUSB_EUI64_READ - - #bytes (8) -+ */ -+ -+#define ATUSB_REQ_FROM_DEV (USB_TYPE_VENDOR | USB_DIR_IN) -+#define ATUSB_REQ_TO_DEV (USB_TYPE_VENDOR | USB_DIR_OUT) -+ -+#endif /* !_ATUSB_H */ -diff --git a/atusb/include/atusb/ep0.h b/atusb/include/atusb/ep0.h -new file mode 100644 -index 0000000..7777345 ---- /dev/null -+++ b/atusb/include/atusb/ep0.h -@@ -0,0 +1,64 @@ -+/* -+ * include/atusb/ep0.h - EP0 extension protocol -+ * -+ * Written 2008-2011, 2013 by Werner Almesberger -+ * Copyright 2008-2011, 2013 Werner Almesberger -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+ -+#ifndef EP0_H -+#define EP0_H -+ -+#include -+ -+ -+/* -+ * EP0 protocol: -+ * -+ * 0.0 initial release -+ * 0.1 addition of ATUSB_TEST -+ * 0.2 First public release -+ * 0.3 ATUSB_EUI64_READ/WRITE for permanent EUI64 handling -+ * Support to run the firmware on Atmel Raven USB dongles -+ * Remove FCS frame check from firmware and leave it to the driver -+ * Use extended operation mode for TX for automatic ACK handling -+ */ -+ -+#define EP0ATUSB_MAJOR 0 /* EP0 protocol, major revision */ -+#define EP0ATUSB_MINOR 3 /* EP0 protocol, minor revision */ -+ -+ -+/* -+ * bmRequestType: -+ * -+ * D7 D6..5 D4...0 -+ * | | | -+ * direction (0 = host->dev) -+ * type (2 = vendor) -+ * recipient (0 = device) -+ */ -+ -+#ifndef USB_TYPE_VENDOR -+#define USB_TYPE_VENDOR 0x40 -+#endif -+ -+#ifndef USB_DIR_IN -+#define USB_DIR_IN 0x80 -+#endif -+ -+#ifndef USB_DIR_OUT -+#define USB_DIR_OUT 0x00 -+#endif -+ -+#define ATUSB_FROM_DEV(req) (ATUSB_REQ_FROM_DEV | (req) << 8) -+#define ATUSB_TO_DEV(req) (ATUSB_REQ_TO_DEV | (req) << 8) -+ -+ -+void ep0_init(void); -+ -+#endif /* !EP0_H */ -diff --git a/atusb/mac.c b/atusb/mac.c -new file mode 100644 -index 0000000..835002c ---- /dev/null -+++ b/atusb/mac.c -@@ -0,0 +1,250 @@ -+/* -+ * fw/mac.c - HardMAC functions -+ * -+ * Written 2011, 2013 by Werner Almesberger -+ * Copyright 2011, 2013 Werner Almesberger -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+#include -+#include -+#include -+ -+#include "usb.h" -+ -+#include "at86rf230.h" -+#include "spi.h" -+#include "board.h" -+#include "mac.h" -+ -+#define RX_BUFS 3 -+ -+ -+bool (*mac_irq)(void) = NULL; -+ -+ -+static uint8_t rx_buf[RX_BUFS][MAX_PSDU+2]; /* PHDR+payload+LQ */ -+static uint8_t tx_buf[MAX_PSDU]; -+static uint8_t tx_size = 0; -+static bool txing = 0; -+static bool queued_tx_ack = 0; -+static uint8_t next_seq, this_seq, queued_seq; -+ -+ -+/* ----- Receive buffer management ----------------------------------------- */ -+ -+ -+static uint8_t rx_in = 0, rx_out = 0; -+ -+ -+static inline void next_buf(uint8_t *index) -+{ -+ *index = (*index+1) % RX_BUFS; -+} -+ -+ -+/* ----- Interrupt handling ------------------------------------------------ */ -+ -+ -+static void rx_done(void *user); -+static void tx_ack_done(void *user); -+ -+ -+static void usb_next(void) -+{ -+ const uint8_t *buf; -+ -+ if (rx_in != rx_out) { -+ buf = rx_buf[rx_out]; -+ led(1); -+ usb_send(&eps[1], buf, buf[0]+2, rx_done, NULL); -+ } -+ -+ if (queued_tx_ack) { -+ usb_send(&eps[1], &queued_seq, 1, tx_ack_done, NULL); -+ queued_tx_ack = 0; -+ } -+} -+ -+ -+static void tx_ack_done(void *user) -+{ -+ usb_next(); -+} -+ -+static void rx_done(void *user) -+{ -+ led(0); -+ next_buf(&rx_out); -+ usb_next(); -+#ifdef AT86RF230 -+ /* slap at86rf230 - reduce fragmentation issue */ -+ change_state(TRX_STATUS_RX_AACK_ON); -+#endif -+} -+ -+ -+static void receive_frame(void) -+{ -+ uint8_t size; -+ uint8_t *buf; -+ -+ spi_begin(); -+ spi_io(AT86RF230_BUF_READ); -+ -+ size = spi_recv(); -+ if (!size || (size & 0x80)) { -+ spi_end(); -+ return; -+ } -+ -+ buf = rx_buf[rx_in]; -+ spi_recv_block(buf+1, size+1); -+ spi_end(); -+ -+ buf[0] = size; -+ next_buf(&rx_in); -+ -+ if (eps[1].state == EP_IDLE) -+ usb_next(); -+} -+ -+ -+static bool handle_irq(void) -+{ -+ uint8_t irq; -+ -+ irq = reg_read(REG_IRQ_STATUS); -+ if (!(irq & IRQ_TRX_END)) -+ return 1; -+ -+ if (txing) { -+ if (eps[1].state == EP_IDLE) { -+ usb_send(&eps[1], &this_seq, 1, tx_ack_done, NULL); -+ } else { -+ queued_tx_ack = 1; -+ queued_seq = this_seq; -+ } -+ txing = 0; -+ return 1; -+ } -+ -+ /* likely */ -+ if (eps[1].state == EP_IDLE || rx_in != rx_out) -+ receive_frame(); -+ -+ return 1; -+} -+ -+ -+/* ----- TX/RX ------------------------------------------------------------- */ -+ -+ -+bool mac_rx(int on) -+{ -+ if (on) { -+ mac_irq = handle_irq; -+ reg_read(REG_IRQ_STATUS); -+ change_state(TRX_CMD_RX_AACK_ON); -+ } else { -+ mac_irq = NULL; -+ change_state(TRX_CMD_FORCE_TRX_OFF); -+ txing = 0; -+ } -+ return 1; -+} -+ -+ -+static void do_tx(void *user) -+{ -+ uint16_t timeout = 0xffff; -+ uint8_t status; -+ uint8_t i; -+ -+ /* -+ * If we time out here, the host driver will time out waiting for the -+ * TRX_END acknowledgement. -+ */ -+ do { -+ if (!--timeout) -+ return; -+ status = reg_read(REG_TRX_STATUS) & TRX_STATUS_MASK; -+ } -+ while (status != TRX_STATUS_RX_ON && status != TRX_STATUS_RX_AACK_ON); -+ -+#ifdef AT86RF231 -+ /* -+ * We use TRX_CMD_FORCE_PLL_ON instead of TRX_CMD_PLL_ON because a new -+ * reception may have begun while we were still working on the previous -+ * one. -+ */ -+ reg_write(REG_TRX_STATE, TRX_CMD_FORCE_PLL_ON); -+#endif -+#ifdef AT86RF230 -+ /* -+ * at86rf230 doesn't support force change, nevetherless this works -+ * somehow -+ */ -+ reg_write(REG_TRX_STATE, TRX_CMD_PLL_ON); -+#endif -+#ifdef AT86RF212 -+ /* -+ * We use TRX_CMD_FORCE_PLL_ON instead of TRX_CMD_PLL_ON because a new -+ * reception may have begun while we were still working on the previous -+ * one. -+ */ -+ reg_write(REG_TRX_STATE, TRX_CMD_FORCE_PLL_ON); -+#endif -+ -+ handle_irq(); -+ -+ spi_begin(); -+ spi_send(AT86RF230_BUF_WRITE); -+ spi_send(tx_size+2); /* CRC */ -+ for (i = 0; i != tx_size; i++) -+ spi_send(tx_buf[i]); -+ spi_end(); -+ -+ change_state(TRX_STATUS_TX_ARET_ON); -+ -+ slp_tr(); -+ -+ txing = 1; -+ this_seq = next_seq; -+ -+ /* -+ * Wait until we reach BUSY_TX_ARET, so that we command the transition to -+ * RX_AACK_ON which will be executed upon TX completion. -+ */ -+ change_state(TRX_CMD_PLL_ON); -+ change_state(TRX_CMD_RX_AACK_ON); -+} -+ -+ -+bool mac_tx(uint16_t flags, uint8_t seq, uint16_t len) -+{ -+ if (len > MAX_PSDU) -+ return 0; -+ tx_size = len; -+ next_seq = seq; -+ usb_recv(&eps[0], tx_buf, len, do_tx, NULL); -+ return 1; -+} -+ -+ -+void mac_reset(void) -+{ -+ mac_irq = NULL; -+ txing = 0; -+ queued_tx_ack = 0; -+ rx_in = rx_out = 0; -+ next_seq = this_seq = queued_seq = 0; -+ -+ /* enable CRC and PHY_RSSI (with RX_CRC_VALID) in SPI status return */ -+ reg_write(REG_TRX_CTRL_1, -+ TX_AUTO_CRC_ON | SPI_CMD_MODE_PHY_RSSI << SPI_CMD_MODE_SHIFT); -+} -diff --git a/atusb/mac.h b/atusb/mac.h -new file mode 100644 -index 0000000..f3c92fb ---- /dev/null -+++ b/atusb/mac.h -@@ -0,0 +1,26 @@ -+/* -+ * fw/mac.h - HardMAC functions -+ * -+ * Written 2011, 2013 by Werner Almesberger -+ * Copyright 2011, 2013 Werner Almesberger -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+#ifndef MAC_H -+#define MAC_H -+ -+#include -+#include -+ -+ -+extern bool (*mac_irq)(void); -+ -+bool mac_rx(int on); -+bool mac_tx(uint16_t flags, uint8_t seq, uint16_t len); -+void mac_reset(void); -+ -+#endif /* !MAC_H */ -diff --git a/atusb/sernum.c b/atusb/sernum.c -new file mode 100644 -index 0000000..41e434c ---- /dev/null -+++ b/atusb/sernum.c -@@ -0,0 +1,47 @@ -+/* -+ * fw/sernum.c - ATUSB serial number -+ * -+ * Written 2008-2011, 2013 by Werner Almesberger -+ * Copyright 2008-2011, 2013 Werner Almesberger -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+ -+#include -+#include -+ -+#include "usb.h" -+ -+#include "board.h" -+#include "sernum.h" -+ -+ -+static const uint8_t string_descriptor_0[] = { -+ 4, /* blength */ -+ USB_DT_STRING, /* bDescriptorType */ -+ LE(USB_LANGID_ENGLISH_US) /* wLANGID[0] */ -+}; -+ -+ -+bool sernum_get_descr(uint8_t type, uint8_t index, const uint8_t **reply, -+ uint8_t *size) -+{ -+ if (type != USB_DT_STRING) -+ return 0; -+ switch (index) { -+ case 0: -+ *reply = string_descriptor_0; -+ *size = sizeof(string_descriptor_0); -+ return 1; -+ case 1: -+ *reply = board_sernum; -+ *size = sizeof(board_sernum); -+ return 1; -+ default: -+ return 0; -+ } -+} -diff --git a/atusb/sernum.h b/atusb/sernum.h -new file mode 100644 -index 0000000..31a8e27 ---- /dev/null -+++ b/atusb/sernum.h -@@ -0,0 +1,37 @@ -+/* -+ * fw/sernum.h - ATUSB serial number -+ * -+ * Written 2011, 2013 by Werner Almesberger -+ * Copyright 2011, 2013 Werner Almesberger -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+#ifndef SERNUM_H -+#define SERNUM_H -+ -+#include -+#include -+ -+#include "board.h" -+ -+ -+#ifdef HAS_BOARD_SERNUM -+ -+bool sernum_get_descr(uint8_t type, uint8_t index, const uint8_t **reply, -+ uint8_t *size); -+ -+#else /* HAS_BOARD_SERNUM */ -+ -+static inline bool sernum_get_descr(uint8_t type, uint8_t index, -+ const uint8_t **reply, uint8_t *size) -+{ -+ return 0; -+} -+ -+#endif /* !HAS_BOARD_SERNUM */ -+ -+#endif /* !SERNUM_H */ -diff --git a/atusb/spi.c b/atusb/spi.c -new file mode 100644 -index 0000000..3fa5715 ---- /dev/null -+++ b/atusb/spi.c -@@ -0,0 +1,51 @@ -+/* -+ * fw/spi.c - ATmega8 family SPI I/O -+ * -+ * Written 2011, 2013 by Werner Almesberger -+ * Copyright 2011, 2013 Werner Almesberger -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+ -+#include -+#include -+ -+#include -+ -+#include "board.h" -+#include "spi.h" -+ -+ -+uint8_t spi_io(uint8_t v) -+{ -+// while (!(UCSR1A & 1 << UDRE1)); -+ SPI_DATA = v; -+ SPI_WAIT_DONE(); -+ return SPI_DATA; -+} -+ -+ -+void spi_end(void) -+{ -+// while (!(UCSR1A & 1 << TXC1)); -+ SET(nSS); -+} -+ -+ -+void spi_recv_block(uint8_t *buf, uint8_t n) -+{ -+ if (!n) -+ return; -+ SPI_DATA = 0; -+ while (--n) { -+ SPI_WAIT_DONE(); -+ *buf++ = SPI_DATA; -+ SPI_DATA = 0; -+ } -+ SPI_WAIT_DONE(); -+ *buf++ = SPI_DATA; -+} -diff --git a/atusb/spi.h b/atusb/spi.h -new file mode 100644 -index 0000000..6e04f4e ---- /dev/null -+++ b/atusb/spi.h -@@ -0,0 +1,30 @@ -+/* -+ * fw/spi.h - ATmega8 family SPI I/O -+ * -+ * Written 2011, 2013 by Werner Almesberger -+ * Copyright 2011, 2013 Werner Almesberger -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+#ifndef SPI_H -+#define SPI_H -+ -+#include -+ -+ -+void spi_begin(void); -+uint8_t spi_io(uint8_t v); -+void spi_end(void); -+void spi_off(void); -+void spi_init(void); -+ -+#define spi_send(v) (void) spi_io(v) -+#define spi_recv(v) spi_io(0) -+ -+void spi_recv_block(uint8_t *buf, uint8_t n); -+ -+#endif /* !SPI_H */ -diff --git a/atusb/uart.c b/atusb/uart.c -new file mode 100644 -index 0000000..44bec27 ---- /dev/null -+++ b/atusb/uart.c -@@ -0,0 +1,64 @@ -+/* -+ * fw/uart.h - Functions needed for debugging over uart -+ * -+ * Code adapted from http://www.roboternetz.de/wissen/index.php/UART_mit_avr-gcc -+ * and http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial -+ * -+ * Published under the Creative Commons Share-Alike licence -+ * https://creativecommons.org/licenses/by-sa/2.0/de/ -+ * -+ * S. Salewski 2007 -+ * -+ * Adapted by -+ * Josef Filzmaier 2017 -+ */ -+ -+#include -+#include "uart.h" -+ -+#define USART_BAUD 38400UL -+#define F_CPU 8000000UL -+ -+#define Wait_USART_Ready() while (!(UCSR1A & (1< -+ -+void uart_init(void); -+int uart_write_char(char c, FILE* stream); -+void uart_new_line(void); -+ -+#endif /* UART_H_ */ -diff --git a/atusb/usb/atu2.c b/atusb/usb/atu2.c -new file mode 100644 -index 0000000..98158bf ---- /dev/null -+++ b/atusb/usb/atu2.c -@@ -0,0 +1,247 @@ -+/* -+ * fw/usb/atu2.c - Chip-specific driver for Atmel ATxxxU2 USB chips -+ * -+ * Written 2008-2011, 2013-2014 by Werner Almesberger -+ * Copyright 2008-2011, 2013-2014 Werner Almesberger -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+/* -+ * Known issues: -+ * - no suspend/resume -+ * - we don't call back after failed transmissions, -+ * - we don't reset the EP buffer after failed receptions -+ * - enumeration often encounters an error -71 (from which it recovers) -+ */ -+ -+#include -+#include -+ -+#define F_CPU 8000000UL -+#include -+ -+#include -+#include -+#include "usb.h" -+#include "board.h" -+ -+ -+#ifndef NULL -+#define NULL 0 -+#endif -+ -+#if 1 -+#define BUG_ON(cond) do { if (cond) panic(); } while (0) -+#else -+#define BUG_ON(cond) -+#endif -+ -+ -+struct ep_descr eps[NUM_EPS]; -+ -+ -+static uint16_t usb_read_word(void) -+{ -+ uint8_t low; -+ -+ low = UEDATX; -+ return low | UEDATX << 8; -+} -+ -+ -+static void enable_addr(void *user) -+{ -+ while (!(UEINTX & (1 << TXINI))); -+ UDADDR |= 1 << ADDEN; -+} -+ -+ -+void set_addr(uint8_t addr) -+{ -+ UDADDR = addr; -+ usb_send(&eps[0], NULL, 0, enable_addr, NULL); -+} -+ -+ -+void usb_ep_change(struct ep_descr *ep) -+{ -+ if (ep->state == EP_TX) { -+ UENUM = ep-eps; -+ UEIENX |= 1 << TXINE; -+ } -+} -+ -+ -+static bool ep_setup(void) -+{ -+ struct setup_request setup; -+ -+ BUG_ON(UEBCLX < 8); -+ -+ setup.bmRequestType = UEDATX; -+ setup.bRequest = UEDATX; -+ setup.wValue = usb_read_word(); -+ setup.wIndex = usb_read_word(); -+ setup.wLength = usb_read_word(); -+ -+ if (!handle_setup(&setup)) -+ return 0; -+ if (!(setup.bmRequestType & 0x80) && eps[0].state == EP_IDLE) -+ usb_send(&eps[0], NULL, 0, NULL, NULL); -+ return 1; -+} -+ -+ -+static bool ep_rx(struct ep_descr *ep) -+{ -+ uint8_t size; -+ -+ size = UEBCLX; -+ if (size > ep->end-ep->buf) -+ return 0; -+ while (size--) -+ *ep->buf++ = UEDATX; -+ if (ep->buf == ep->end) { -+ ep->state = EP_IDLE; -+ if (ep->callback) -+ ep->callback(ep->user); -+// if (ep == &eps[0]) -+ usb_send(ep, NULL, 0, NULL, NULL); -+ } -+ return 1; -+} -+ -+ -+static void ep_tx(struct ep_descr *ep) -+{ -+ uint8_t size = ep->end-ep->buf; -+ uint8_t left; -+ -+ if (size > ep->size) -+ size = ep->size; -+ for (left = size; left; left--) -+ UEDATX = *ep->buf++; -+ if (size == ep->size) -+ return; -+ ep->state = EP_IDLE; -+} -+ -+ -+static void handle_ep(int n) -+{ -+ struct ep_descr *ep = eps+n; -+ uint8_t mask; -+ -+ UENUM = n; -+ if (UEINTX & (1 << RXSTPI)) { -+ /* @@@ EP_RX. EP_TX: cancel */ -+ ep->state = EP_IDLE; -+ if (!ep_setup()) -+ goto stall; -+ UEINTX = ~(1 << RXSTPI); -+ } -+ if (UEINTX & (1 << RXOUTI)) { -+ /* @@ EP_TX: cancel */ -+ if (ep->state != EP_RX) -+ goto stall; -+ if (!ep_rx(ep)) -+ goto stall; -+ /* @@@ gcc 4.5.2 wants this cast */ -+ UEINTX = (uint8_t) ~(1 << RXOUTI | 1 << FIFOCON); -+ } -+ if (UEINTX & (1 << STALLEDI)) { -+ ep->state = EP_IDLE; -+ UEINTX = ~(1 << STALLEDI); -+ } -+ if (UEINTX & (1 << TXINI)) { -+ /* @@ EP_RX: cancel (?) */ -+ if (ep->state == EP_TX) { -+ ep_tx(ep); -+ mask = 1 << TXINI; -+ if (n) -+ mask |= 1 << FIFOCON; -+ UEINTX = ~mask; -+ if (ep->state == EP_IDLE && ep->callback) -+ ep->callback(ep->user); -+ } else { -+ UEIENX &= ~(1 << TXINE); -+ } -+ } -+ return; -+ -+stall: -+ UEINTX = ~(1 << RXSTPI | 1 << RXOUTI | 1 << STALLEDI); -+ ep->state = EP_IDLE; -+ UECONX |= 1 << STALLRQ; -+} -+ -+ -+void ep_init(void) -+{ -+ UENUM = 0; -+ UECONX = (1 << RSTDT) | (1 << EPEN); /* enable */ -+ UECFG0X = 0; /* control, direction is ignored */ -+ UECFG1X = 3 << EPSIZE0; /* 64 bytes */ -+ UECFG1X |= 1 << ALLOC; -+ -+ while (!(UESTA0X & (1 << CFGOK))); -+ -+ UEIENX = -+ (1 << RXSTPE) | (1 << RXOUTE) | (1 << STALLEDE) | (1 << TXINE); -+ -+ eps[0].state = EP_IDLE; -+ eps[0].size = 64; -+ -+#ifndef BOOT_LOADER -+ -+ UENUM = 1; -+ UECONX = (1 << RSTDT) | (1 << EPEN); /* enable */ -+ UECFG0X = (1 << EPTYPE1) | (1 << EPDIR); /* bulk IN */ -+ UECFG1X = 3 << EPSIZE0; /* 64 bytes */ -+ UECFG1X |= 1 << ALLOC; -+ -+ while (!(UESTA0X & (1 << CFGOK))); -+ -+ UEIENX = (1 << STALLEDE) | (1 << TXINE); -+ -+ eps[1].state = EP_IDLE; -+ eps[1].size = 64; -+ -+#endif -+} -+ -+ -+ISR(USB_GEN_vect) -+{ -+ uint8_t flags; -+ -+ flags = UDINT; -+ if (flags & (1 << EORSTI)) { -+ if (user_reset) -+ user_reset(); -+ ep_init(); -+ UDINT = ~(1 << EORSTI); -+ } -+} -+ -+ -+ISR(USB_COM_vect) -+{ -+ uint8_t flags, i; -+ -+ flags = UEINT; -+ for (i = 0; i != NUM_EPS; i++) -+ if (flags & (1 << i)) -+ handle_ep(i); -+} -+ -+ -+void usb_reset(void) -+{ -+ UDCON |= 1 << DETACH; /* detach the pull-up */ -+ _delay_ms(1); -+} -diff --git a/atusb/usb/dfu.c b/atusb/usb/dfu.c -new file mode 100644 -index 0000000..c84a28d ---- /dev/null -+++ b/atusb/usb/dfu.c -@@ -0,0 +1,260 @@ -+/* -+ * boot/dfu.c - DFU protocol engine -+ * -+ * Written 2008-2011, 2013-2015 by Werner Almesberger -+ * Copyright 2008-2011, 2013-2015 Werner Almesberger -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+/* -+ * http://www.usb.org/developers/devclass_docs/DFU_1.1.pdf -+ */ -+ -+/* -+ * A few, erm, shortcuts: -+ * -+ * - we don't bother with the app* states since DFU is all this firmware does -+ * - after DFU_DNLOAD, we just block until things are written, so we never -+ * enter dfuDNLOAD_SYNC or dfuDNBUSY -+ * - no dfuMANIFEST_SYNC, dfuMANIFEST, or dfuMANIFEST_WAIT_RESET -+ * - to keep our buffers small, we only accept EP0-sized blocks -+ */ -+ -+ -+#include -+#include -+ -+#include "usb.h" -+#include "dfu.h" -+ -+#include "board.h" -+ -+ -+#ifndef NULL -+#define NULL 0 -+#endif -+ -+#define debug(...) -+#define error(...) -+ -+ -+#ifndef DFU_ALT_SETTINGS -+#define DFU_ALT_SETTINGS 1 -+#endif -+ -+#ifndef DFU_ALT_NAME_0_IDX -+#define DFU_ALT_NAME_0_IDX 0 -+#endif -+ -+#ifndef DFU_ALT_NAME_1_IDX -+#define DFU_ALT_NAME_1_IDX 0 -+#endif -+ -+#ifndef DFU_ALT_NAME_2_IDX -+#define DFU_ALT_NAME_2_IDX 0 -+#endif -+ -+ -+const uint8_t device_descriptor[] = { -+ 18, /* bLength */ -+ USB_DT_DEVICE, /* bDescriptorType */ -+ LE(0x100), /* bcdUSB */ -+ USB_CLASS_APP_SPEC, /* bDeviceClass */ -+ 0x00, /* bDeviceSubClass (per interface) */ -+ 0x00, /* bDeviceProtocol (per interface) */ -+ EP0_SIZE, /* bMaxPacketSize */ -+ LE(DFU_USB_VENDOR), /* idVendor */ -+ LE(DFU_USB_PRODUCT), /* idProduct */ -+ LE(0x0001), /* bcdDevice */ -+ 0, /* iManufacturer */ -+ 0, /* iProduct */ -+#ifdef HAS_BOARD_SERNUM -+ 1, /* iSerialNumber */ -+#else -+ 0, /* iSerialNumber */ -+#endif -+ 1 /* bNumConfigurations */ -+}; -+ -+ -+const uint8_t config_descriptor[] = { -+ 9, /* bLength */ -+ USB_DT_CONFIG, /* bDescriptorType */ -+ LE(9+9*DFU_ALT_SETTINGS), /* wTotalLength */ -+ 1, /* bNumInterfaces */ -+ 1, /* bConfigurationValue (> 0 !) */ -+ 0, /* iConfiguration */ -+// USB_ATTR_SELF_POWERED | USB_ATTR_BUS_POWERED, -+ USB_ATTR_BUS_POWERED, /* bmAttributes */ -+ ((BOARD_MAX_mA)+1)/2, /* bMaxPower */ -+ -+ /* Interface #0 */ -+ -+ DFU_ITF_DESCR(0, 0, dfu_proto_dfu, DFU_ALT_NAME_0_IDX) -+#if DFU_ALT_SETTINGS > 1 -+ DFU_ITF_DESCR(0, 1, dfu_proto_dfu, DFU_ALT_NAME_1_IDX) -+#endif -+#if DFU_ALT_SETTINGS > 2 -+ DFU_ITF_DESCR(0, 2, dfu_proto_dfu, DFU_ALT_NAME_2_IDX) -+#endif -+}; -+ -+ -+static uint16_t next_block = 0; -+static bool did_download; -+ -+ -+static uint8_t buf[EP0_SIZE]; -+ -+ -+static void block_write(void *user) -+{ -+ uint16_t *size = user; -+ -+ dfu_flash_ops->write(buf, *size); -+} -+ -+ -+static bool block_receive(uint16_t length) -+{ -+ static uint16_t size; -+ -+ if (!dfu_flash_ops->can_write(length)) { -+ dfu.state = dfuERROR; -+ dfu.status = errADDRESS; -+ return 0; -+ } -+ if (length > EP0_SIZE) { -+ dfu.state = dfuERROR; -+ dfu.status = errUNKNOWN; -+ return 0; -+ } -+ size = length; -+ usb_recv(&eps[0], buf, size, block_write, &size); -+ return 1; -+} -+ -+ -+static bool block_transmit(uint16_t length) -+{ -+ uint16_t got; -+ -+ if (length > EP0_SIZE) { -+ dfu.state = dfuERROR; -+ dfu.status = errUNKNOWN; -+ return 1; -+ } -+ got = dfu_flash_ops->read(buf, length); -+ if (got < length) { -+ length = got; -+ dfu.state = dfuIDLE; -+ } -+ usb_send(&eps[0], buf, length, NULL, NULL); -+ return 1; -+} -+ -+ -+static bool my_setup(const struct setup_request *setup) -+{ -+ bool ok; -+ -+ switch (setup->bmRequestType | setup->bRequest << 8) { -+ case DFU_TO_DEV(DFU_DETACH): -+ debug("DFU_DETACH\n"); -+ /* -+ * The DFU spec says thay this is sent in protocol 1 only. -+ * However, dfu-util also sends it to get out of DFU mode, -+ * so we just don't make a fuss and ignore it. -+ */ -+ return 1; -+ case DFU_TO_DEV(DFU_DNLOAD): -+ debug("DFU_DNLOAD\n"); -+ if (dfu.state == dfuIDLE) { -+ next_block = setup->wValue; -+ dfu_flash_ops->start(); -+ } -+ else if (dfu.state != dfuDNLOAD_IDLE) { -+ error("bad state\n"); -+ return 0; -+ } -+ if (dfu.state != dfuIDLE && setup->wValue == next_block-1) { -+ debug("retransmisson\n"); -+ return 1; -+ } -+ if (setup->wValue != next_block) { -+ debug("bad block (%d vs. %d)\n", -+ setup->wValue, next_block); -+ dfu.state = dfuERROR; -+ dfu.status = errUNKNOWN; -+ return 1; -+ } -+ if (!setup->wLength) { -+ debug("DONE\n"); -+ dfu_flash_ops->end_write(); -+ dfu.state = dfuIDLE; -+ did_download = 1; -+ return 1; -+ } -+ ok = block_receive(setup->wLength); -+ next_block++; -+ dfu.state = dfuDNLOAD_IDLE; -+ return ok; -+ case DFU_FROM_DEV(DFU_UPLOAD): -+ debug("DFU_UPLOAD\n"); -+ if (dfu.state == dfuIDLE) { -+ next_block = setup->wValue; -+ dfu_flash_ops->start(); -+ } -+ else if (dfu.state != dfuUPLOAD_IDLE) -+ return 0; -+ if (dfu.state != dfuIDLE && setup->wValue == next_block-1) { -+ debug("retransmisson\n"); -+ /* @@@ try harder */ -+ dfu.state = dfuERROR; -+ dfu.status = errUNKNOWN; -+ return 1; -+ } -+ if (setup->wValue != next_block) { -+ debug("bad block (%d vs. %d)\n", -+ setup->wValue, next_block); -+ dfu.state = dfuERROR; -+ dfu.status = errUNKNOWN; -+ return 1; -+ } -+ ok = block_transmit(setup->wLength); -+ next_block++; -+ dfu.state = dfuUPLOAD_IDLE; -+ return ok; -+ case DFU_TO_DEV(DFU_ABORT): -+ debug("DFU_ABORT\n"); -+ dfu.state = dfuIDLE; -+ dfu.status = OK; -+ return 1; -+ default: -+ return dfu_setup_common(setup); -+ } -+} -+ -+ -+static void my_reset(void) -+{ -+#if 0 -+ /* @@@ not nice -- think about where this should go */ -+ extern void run_payload(void); -+ -+ if (did_download) -+ run_payload(); -+#endif -+} -+ -+ -+void dfu_init(void) -+{ -+ user_setup = my_setup; -+ user_get_descriptor = dfu_my_descr; -+ user_reset = my_reset; -+} -diff --git a/atusb/usb/dfu.h b/atusb/usb/dfu.h -new file mode 100644 -index 0000000..bc35bbc ---- /dev/null -+++ b/atusb/usb/dfu.h -@@ -0,0 +1,119 @@ -+/* -+ * boot/dfu.h - DFU protocol constants and data structures -+ * -+ * Written 2008, 2011, 2013-2015 by Werner Almesberger -+ * Copyright 2008, 2011, 2013-2015 Werner Almesberger -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+ -+#ifndef DFU_H -+#define DFU_H -+ -+#include -+#include -+ -+#include "usb.h" -+ -+ -+enum dfu_request { -+ DFU_DETACH, -+ DFU_DNLOAD, -+ DFU_UPLOAD, -+ DFU_GETSTATUS, -+ DFU_CLRSTATUS, -+ DFU_GETSTATE, -+ DFU_ABORT, -+}; -+ -+ -+enum dfu_status { -+ OK, -+ errTARGET, -+ errFILE, -+ errWRITE, -+ errERASE, -+ errCHECK_ERASED, -+ errPROG, -+ errVERIFY, -+ errADDRESS, -+ errNOTDONE, -+ errFIRMWARE, -+ errVENDOR, -+ errUSBR, -+ errPOR, -+ errUNKNOWN, -+ errSTALLEDPKT, -+}; -+ -+ -+enum dfu_state { -+ appIDLE, -+ appDETACH, -+ dfuIDLE, -+ dfuDNLOAD_SYNC, -+ dfuDNBUSY, -+ dfuDNLOAD_IDLE, -+ dfuMANIFEST_SYNC, -+ dfuMANIFEST, -+ dfuMANIFEST_WAIT_RESET, -+ dfuUPLOAD_IDLE, -+ dfuERROR -+}; -+ -+enum dfu_itf_proto { -+ dfu_proto_runtime = 1, /* Runtime protocol */ -+ dfu_proto_dfu = 2, /* DFU mode protocol */ -+}; -+ -+ -+#define DFU_DT_FUNCTIONAL 0x21 /* DFU FUNCTIONAL descriptor type */ -+ -+ -+#define DFU_TO_DEV(req) (0x21 | (req) << 8) -+#define DFU_FROM_DEV(req) (0xa1 | (req) << 8) -+ -+ -+struct dfu { -+ uint8_t status; /* bStatus */ -+ uint8_t toL, toM, toH; /* bwPollTimeout */ -+ uint8_t state; /* bState */ -+ uint8_t iString; -+}; -+ -+ -+#define DFU_ITF_DESCR(itf, alt, proto, idx) \ -+ 9, /* bLength */ \ -+ USB_DT_INTERFACE, /* bDescriptorType */ \ -+ (itf), /* bInterfaceNumber */ \ -+ (alt), /* bAlternateSetting */ \ -+ 0, /* bNumEndpoints */ \ -+ 0xfe, /* bInterfaceClass (application specific) */ \ -+ 0x01, /* bInterfaceSubClass (device fw upgrade) */ \ -+ (proto), /* bInterfaceProtocol (dfu_proto_*) */ \ -+ (idx), /* iInterface */ -+ -+ -+struct dfu_flash_ops { -+ void (*start)(void); -+ bool (*can_write)(uint16_t size); -+ void (*write)(const uint8_t *buf, uint16_t size); -+ void (*end_write)(void); -+ uint16_t (*read)(uint8_t *buf, uint16_t size); -+}; -+ -+extern struct dfu dfu; -+extern const struct dfu_flash_ops *dfu_flash_ops; -+ -+ -+bool dfu_setup_common(const struct setup_request *setup); -+bool dfu_my_descr(uint8_t type, uint8_t index, const uint8_t **reply, -+ uint8_t *size); -+ -+void dfu_init(void); -+ -+#endif /* !DFU_H */ -diff --git a/atusb/usb/dfu_common.c b/atusb/usb/dfu_common.c -new file mode 100644 -index 0000000..9b6feef ---- /dev/null -+++ b/atusb/usb/dfu_common.c -@@ -0,0 +1,101 @@ -+/* -+ * boot/dfu_common.c - DFU protocol engine parts common to App/DFU -+ * -+ * Written 2008-2011, 2013-2014 by Werner Almesberger -+ * Copyright 2008-2011, 2013-2014 Werner Almesberger -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+/* -+ * http://www.usb.org/developers/devclass_docs/DFU_1.1.pdf -+ */ -+ -+/* -+ * A few, erm, shortcuts: -+ * -+ * - we don't bother with the app* states since DFU is all this firmware does -+ * - after DFU_DNLOAD, we just block until things are written, so we never -+ * enter dfuDNLOAD_SYNC or dfuDNBUSY -+ * - no dfuMANIFEST_SYNC, dfuMANIFEST, or dfuMANIFEST_WAIT_RESET -+ * - to keep our buffers small, we only accept EP0-sized blocks -+ */ -+ -+ -+#include -+#include -+ -+#include "usb.h" -+#include "dfu.h" -+ -+#include "board.h" -+#include "../sernum.h" -+ -+ -+#ifndef NULL -+#define NULL 0 -+#endif -+ -+#define debug(...) -+#define error(...) -+ -+ -+static const uint8_t functional_descriptor[] = { -+ 9, /* bLength */ -+ DFU_DT_FUNCTIONAL, /* bDescriptorType */ -+ 0xf, /* bmAttributes (claim omnipotence :-) */ -+ LE(0xffff), /* wDetachTimeOut (we're very patient) */ -+ LE(EP0_SIZE), /* wTransferSize */ -+ LE(0x101), /* bcdDFUVersion */ -+}; -+ -+ -+/* -+ * The worst-case activity would be flashing a one page and erasing another -+ * one, would should take less than 10 ms. A 100 ms timeout ought to be plenty. -+ */ -+ -+struct dfu dfu = { -+ OK, /* bStatus */ -+ LE(100), 0, /* bwPollTimeout, 100 ms */ -+ dfuIDLE, /* bState */ -+ 0, /* iString */ -+}; -+ -+ -+bool dfu_setup_common(const struct setup_request *setup) -+{ -+ switch (setup->bmRequestType | setup->bRequest << 8) { -+ case DFU_FROM_DEV(DFU_GETSTATUS): -+ debug("DFU_GETSTATUS\n"); -+ usb_send(&eps[0], (uint8_t *) &dfu, sizeof(dfu), NULL, NULL); -+ return 1; -+ case DFU_TO_DEV(DFU_CLRSTATUS): -+ debug("DFU_CLRSTATUS\n"); -+ dfu.state = dfuIDLE; -+ dfu.status = OK; -+ return 1; -+ case DFU_FROM_DEV(DFU_GETSTATE): -+ debug("DFU_GETSTATE\n"); -+ usb_send(&eps[0], &dfu.state, 1, NULL, NULL); -+ return 1; -+ default: -+ error("DFU rt %x, rq%x ?\n", -+ setup->bmRequestType, setup->bRequest); -+ return 0; -+ } -+} -+ -+ -+bool dfu_my_descr(uint8_t type, uint8_t index, const uint8_t **reply, -+ uint8_t *size) -+{ -+ if (type != DFU_DT_FUNCTIONAL) -+ return sernum_get_descr(type, index, reply, size); -+ *reply = functional_descriptor; -+ *size = sizeof(functional_descriptor); -+ return 1; -+} -diff --git a/atusb/usb/usb.c b/atusb/usb/usb.c -new file mode 100644 -index 0000000..543d8c2 ---- /dev/null -+++ b/atusb/usb/usb.c -@@ -0,0 +1,181 @@ -+/* -+ * fw/usb/usb.c - USB hardware setup and standard device requests -+ * -+ * Written 2008-2011, 2013, 2015 by Werner Almesberger -+ * Copyright 2008-2011, 2013, 2015 Werner Almesberger -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+/* -+ * Known issues: -+ * - no suspend/resume -+ * - should support EP clearing and stalling -+ */ -+ -+#include -+#include -+ -+#include "usb.h" -+#include "board.h" -+ -+ -+#ifndef NULL -+#define NULL 0 -+#endif -+ -+#if 1 -+extern void panic(void); -+#define BUG_ON(cond) do { if (cond) panic(); } while (0) -+#else -+#define BUG_ON(cond) -+#endif -+ -+bool (*user_setup)(const struct setup_request *setup); -+void (*user_set_interface)(int nth); -+bool (*user_get_descriptor)(uint8_t type, uint8_t index, -+ const uint8_t **reply, uint8_t *size); -+void (*user_reset)(void); -+ -+ -+void usb_io(struct ep_descr *ep, enum ep_state state, uint8_t *buf, -+ uint8_t size, void (*callback)(void *user), void *user) -+{ -+ BUG_ON(ep->state); -+ ep->state = state; -+ ep->buf = buf; -+ ep->end = buf+size; -+ ep->callback = callback; -+ ep->user = user; -+ usb_ep_change(ep); -+} -+ -+ -+static bool get_descriptor(uint8_t type, uint8_t index, uint16_t length) -+{ -+ const uint8_t *reply; -+ uint8_t size; -+ -+ switch (type) { -+ case USB_DT_DEVICE: -+ reply = device_descriptor; -+ size = reply[0]; -+ break; -+ case USB_DT_CONFIG: -+ if (index) -+ return 0; -+ reply = config_descriptor; -+ size = reply[2]; -+ break; -+ default: -+ if (!user_get_descriptor) -+ return 0; -+ if (!user_get_descriptor(type, index, &reply, &size)) -+ return 0; -+ } -+ if (length < size) -+ size = length; -+ usb_send(&eps[0], reply, size, NULL, NULL); -+ return 1; -+} -+ -+ -+bool handle_setup(const struct setup_request *setup) -+{ -+ switch (setup->bmRequestType | setup->bRequest << 8) { -+ -+ /* -+ * Device request -+ * -+ * See http://www.beyondlogic.org/usbnutshell/usb6.htm -+ */ -+ -+ case FROM_DEVICE(GET_STATUS): -+ if (setup->wLength != 2) -+ return 0; -+ usb_send(&eps[0], "\000", 2, NULL, NULL); -+ break; -+ case TO_DEVICE(CLEAR_FEATURE): -+ break; -+ case TO_DEVICE(SET_FEATURE): -+ return 0; -+ case TO_DEVICE(SET_ADDRESS): -+ set_addr(setup->wValue); -+ break; -+ case FROM_DEVICE(GET_DESCRIPTOR): -+ case FROM_INTERFACE(GET_DESCRIPTOR): -+ if (!get_descriptor(setup->wValue >> 8, setup->wValue, -+ setup->wLength)) -+ return 0; -+ break; -+ case TO_DEVICE(SET_DESCRIPTOR): -+ return 0; -+ case FROM_DEVICE(GET_CONFIGURATION): -+ usb_send(&eps[0], "", 1, NULL, NULL); -+ break; -+ case TO_DEVICE(SET_CONFIGURATION): -+ if (setup->wValue != config_descriptor[5]) -+ return 0; -+ break; -+ -+ /* -+ * Interface request -+ */ -+ -+ case FROM_INTERFACE(GET_STATUS): -+ return 0; -+ case TO_INTERFACE(CLEAR_FEATURE): -+ return 0; -+ case TO_INTERFACE(SET_FEATURE): -+ return 0; -+ case FROM_INTERFACE(GET_INTERFACE): -+ return 0; -+ case TO_INTERFACE(SET_INTERFACE): -+ { -+ const uint8_t *interface_descriptor = -+ config_descriptor+9; -+ const uint8_t *p; -+ int i; -+ -+ i = 0; -+ for (p = interface_descriptor; -+ p != config_descriptor+config_descriptor[2]; -+ p += p[0]) { -+ if (p[1] != USB_DT_INTERFACE) -+ continue; -+ if (p[2] == setup->wIndex && -+ p[3] == setup->wValue) { -+ if (user_set_interface) -+ user_set_interface(i); -+ return 1; -+ } -+ i++; -+ } -+ return 0; -+ } -+ break; -+ -+ /* -+ * Endpoint request -+ */ -+ -+ case FROM_ENDPOINT(GET_STATUS): -+ return 0; -+ case TO_ENDPOINT(CLEAR_FEATURE): -+ return 0; -+ case TO_ENDPOINT(SET_FEATURE): -+ return 0; -+ case FROM_ENDPOINT(SYNCH_FRAME): -+ return 0; -+ -+ default: -+ if (user_setup) -+ return user_setup(setup); -+ return 0; -+ } -+ -+ return 1; -+} -diff --git a/atusb/usb/usb.h b/atusb/usb/usb.h -new file mode 100644 -index 0000000..cb40f9e ---- /dev/null -+++ b/atusb/usb/usb.h -@@ -0,0 +1,189 @@ -+/* -+ * fw/usb//usb.h - USB hardware setup and standard device requests -+ * -+ * Written 2008, 2009, 2011, 2013, 2015 by Werner Almesberger -+ * Copyright 2008, 2009, 2011, 2013, 2015 Werner Almesberger -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+ -+#ifndef USB_H -+#define USB_H -+ -+ -+#include -+#include -+ -+ -+/* -+ * Packet identifier types -+ */ -+ -+#define PID_OUT 0x1 -+#define PID_IN 0x9 -+#define PID_SOF 0x5 -+#define PID_SETUP 0xd -+#define PID_DATA0 0x3 -+#define PID_DATA1 0xb -+#define PID_ACK 0x2 -+#define PID_NAK 0xa -+#define PID_STALL 0xe -+ -+/* -+ * Descriptor types -+ * -+ * Reuse libusb naming scheme (/usr/include/usb.h) -+ */ -+ -+#define USB_DT_DEVICE 1 -+#define USB_DT_CONFIG 2 -+#define USB_DT_STRING 3 -+#define USB_DT_INTERFACE 4 -+#define USB_DT_ENDPOINT 5 -+ -+/* -+ * Device classes -+ * -+ * Reuse libusb naming scheme (/usr/include/usb.h) -+ */ -+ -+#define USB_CLASS_PER_INTERFACE 0 -+#define USB_CLASS_COMM 2 -+#define USB_CLASS_HID 3 -+#define USB_CLASS_MASS_STORAGE 8 -+#define USB_CLASS_HUB 9 -+#define USB_CLASS_DATA 10 -+#define USB_CLASS_APP_SPEC 0xfe -+#define USB_CLASS_VENDOR_SPEC 0xff -+ -+/* -+ * Configuration attributes -+ */ -+ -+#define USB_ATTR_BUS_POWERED 0x80 -+#define USB_ATTR_SELF_POWERED 0x40 -+#define USB_ATTR_REMOTE_WAKEUP 0x20 -+ -+/* -+ * Endpoint type -+ */ -+ -+#define USB_ENDPOINT_TYPE_CONTROL 0 -+#define USB_ENDPOINT_TYPE_ISOCHRONOUS 1 -+#define USB_ENDPOINT_TYPE_BULK 2 -+#define USB_ENDPOINT_TYPE_INTERRUPT 3 -+ -+/* -+ * Setup request types -+ */ -+ -+#define TO_DEVICE(req) (0x00 | (req) << 8) -+#define FROM_DEVICE(req) (0x80 | (req) << 8) -+#define TO_INTERFACE(req) (0x01 | (req) << 8) -+#define FROM_INTERFACE(req) (0x81 | (req) << 8) -+#define TO_ENDPOINT(req) (0x02 | (req) << 8) -+#define FROM_ENDPOINT(req) (0x82 | (req) << 8) -+ -+/* -+ * Setup requests -+ */ -+ -+#define GET_STATUS 0x00 -+#define CLEAR_FEATURE 0x01 -+#define SET_FEATURE 0x03 -+#define SET_ADDRESS 0x05 -+#define GET_DESCRIPTOR 0x06 -+#define SET_DESCRIPTOR 0x07 -+#define GET_CONFIGURATION 0x08 -+#define SET_CONFIGURATION 0x09 -+#define GET_INTERFACE 0x0a -+#define SET_INTERFACE 0x0b -+#define SYNCH_FRAME 0x0c -+ -+/* -+ * USB Language ID codes -+ * -+ * http://www.usb.org/developers/docs/USB_LANGIDs.pdf -+ */ -+ -+#define USB_LANGID_ENGLISH_US 0x409 -+ -+ -+/* -+ * Odd. sdcc seems to think "x" assumes the size of the destination, i.e., -+ * uint8_t. Hence the cast. -+ */ -+ -+#define LE(x) ((uint16_t) (x) & 0xff), ((uint16_t) (x) >> 8) -+ -+#define LO(x) (((uint8_t *) &(x))[0]) -+#define HI(x) (((uint8_t *) &(x))[1]) -+ -+ -+#ifdef LOW_SPEED -+#define EP0_SIZE 8 -+#else -+#define EP0_SIZE 64 -+#endif -+ -+#define EP1_SIZE 64 /* simplify */ -+ -+ -+enum ep_state { -+ EP_IDLE, -+ EP_RX, -+ EP_TX, -+ EP_STALL, -+}; -+ -+struct ep_descr { -+ enum ep_state state; -+ uint8_t *buf; -+ uint8_t *end; -+ uint8_t size; -+ void (*callback)(void *user); -+ void *user; -+}; -+ -+struct setup_request { -+ uint8_t bmRequestType; -+ uint8_t bRequest; -+ uint16_t wValue; -+ uint16_t wIndex; -+ uint16_t wLength; -+}; -+ -+ -+extern const uint8_t device_descriptor[]; -+extern const uint8_t config_descriptor[]; -+extern struct ep_descr eps[]; -+ -+extern bool (*user_setup)(const struct setup_request *setup); -+extern void (*user_set_interface)(int nth); -+extern bool (*user_get_descriptor)(uint8_t type, uint8_t index, -+ const uint8_t **reply, uint8_t *size); -+extern void (*user_reset)(void); -+ -+ -+#define usb_left(ep) ((ep)->end-(ep)->buf) -+#define usb_send(ep, buf, size, callback, user) \ -+ usb_io(ep, EP_TX, (void *) buf, size, callback, user) -+#define usb_recv(ep, buf, size, callback, user) \ -+ usb_io(ep, EP_RX, buf, size, callback, user) -+ -+void usb_io(struct ep_descr *ep, enum ep_state state, uint8_t *buf, -+ uint8_t size, void (*callback)(void *user), void *user); -+ -+bool handle_setup(const struct setup_request *setup); -+void set_addr(uint8_t addr); -+void usb_ep_change(struct ep_descr *ep); -+void usb_reset(void); -+void usb_init(void); -+ -+void ep_init(void); -+ -+#endif /* !USB_H */ -diff --git a/atusb/version.h b/atusb/version.h -new file mode 100644 -index 0000000..8fd6a2c ---- /dev/null -+++ b/atusb/version.h -@@ -0,0 +1,23 @@ -+/* -+ * fw/version.h - Automatically generated version string -+ * -+ * Written 2008, 2011 by Werner Almesberger -+ * Copyright 2008, 2011 Werner Almesberger -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ */ -+ -+ -+#ifndef VERSION_H -+#define VERSION_H -+ -+#include -+ -+ -+extern const char *build_date; -+extern const uint16_t build_number; -+ -+#endif /* !VERSION_H */ --- -2.26.0 - diff --git a/libre/linux-libre-firmware/0003-Update-INSTALL-document.patch b/libre/linux-libre-firmware/0003-Update-INSTALL-document.patch deleted file mode 100644 index 038b518..0000000 --- a/libre/linux-libre-firmware/0003-Update-INSTALL-document.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 02054c86c9fce8978cc7372b758339191cc9f6d6 Mon Sep 17 00:00:00 2001 -From: Jason Self -Date: Thu, 4 Jul 2019 16:34:28 -0700 -Subject: [PATCH 3/8] Update INSTALL document - -To include the correct package name for GCC-AVR and improved -descriptions. ---- - INSTALL | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/INSTALL b/INSTALL -index 7fb1116..9ea6dad 100644 ---- a/INSTALL -+++ b/INSTALL -@@ -16,14 +16,14 @@ In order to build everything you will need the following on the host - system: - - * A C/C++ compiler, like GCC -- * AVR-GCC -- * Standard C library for AVR-GCC - * Cmake - * GNU Bison/YACC - * GNU Flex - * GNU Gperf - * GNU Make - * GNU Wget -+ * GNU C cross-compiler for AVR -+ * Standard C library for Atmel AVR - * GNU C cross-compiler for ARM: - - arm-linux-gnueabi-gcc - - arm-linux-gnueabi-ld -@@ -34,7 +34,7 @@ system: - - On GNU/Linux distros that use apt you can install these with: - -- apt install avr-gcc avr-libc binutils-arm-linux-gnueabi \ -+ apt install gcc-avr avr-libc binutils-arm-linux-gnueabi \ - binutils-arm-none-eabi bison cmake flex g++ gcc \ - gcc-arm-linux-gnueabi gcc-arm-none-eabi gperf make wget - --- -2.26.0 - diff --git a/libre/linux-libre-firmware/0004-atusb-Build-updates.patch b/libre/linux-libre-firmware/0004-atusb-Build-updates.patch deleted file mode 100644 index 6411835..0000000 --- a/libre/linux-libre-firmware/0004-atusb-Build-updates.patch +++ /dev/null @@ -1,73 +0,0 @@ -From d6bb7bf71810db1b02dec985e8383594c193f55f Mon Sep 17 00:00:00 2001 -From: Jason Self -Date: Thu, 4 Jul 2019 16:57:58 -0700 -Subject: [PATCH 4/8] atusb: Build updates - -Update the root level Makefile to both invoke "make atusb.dfu" when -building. - -Update the INSTALL document to mention the dependency on dfu-util. - -Update the root level Makefile to install atusb.dfu if it's compiled. -Even though the kernel itself doesn't load the firmware into the -device this will ensure that pre-compiled firmware is included in the -release tarballs. ---- - INSTALL | 5 +++-- - Makefile | 3 ++- - 2 files changed, 5 insertions(+), 3 deletions(-) - -diff --git a/INSTALL b/INSTALL -index 9ea6dad..70c4381 100644 ---- a/INSTALL -+++ b/INSTALL -@@ -17,6 +17,7 @@ system: - - * A C/C++ compiler, like GCC - * Cmake -+ * dfu-util - Device Firmware Upgrade Utilities - * GNU Bison/YACC - * GNU Flex - * GNU Gperf -@@ -35,7 +36,7 @@ system: - On GNU/Linux distros that use apt you can install these with: - - apt install gcc-avr avr-libc binutils-arm-linux-gnueabi \ -- binutils-arm-none-eabi bison cmake flex g++ gcc \ -+ binutils-arm-none-eabi bison cmake dfu-util flex g++ gcc \ - gcc-arm-linux-gnueabi gcc-arm-none-eabi gperf make wget - - CARL9170 Firmware Configuration -@@ -48,7 +49,7 @@ atusb: Firmware for the ATUSB IEEE 802.15.4 USB Adapter - - To flash the firmware you need dfu-util on the host. Issue - -- make dfu -+ dfu-util -d 20b7:1540 -D atusb.dfu - - right after plugging the device into the USB port while the red led is - still on. -diff --git a/Makefile b/Makefile -index 8474b30..51f708d 100644 ---- a/Makefile -+++ b/Makefile -@@ -37,7 +37,7 @@ ath9k_htc: ath9k_htc_toolchain - cd ath9k_htc && $(MAKE) -C target_firmware - - atusb: -- cd atusb && $(MAKE) -+ cd atusb && $(MAKE) atusb.dfu - - av7110: - cd av7110 && $(MAKE) -@@ -103,6 +103,7 @@ install: - ln -s ath9k_htc/htc_9271-1.4.0.fw $(prefix)/htc_9271.fw; fi; - if [ -a ath9k_htc/target_firmware/htc_7010.fw ]; then $(install_program) -D ath9k_htc/target_firmware/htc_7010.fw $(prefix)/ath9k_htc/htc_7010-1.4.0.fw && \ - ln -s ath9k_htc/htc_7010-1.4.0.fw $(prefix)/htc_7010.fw; fi; -+ if [ -a atusb/atusb.dfu ]; then $(install_program) -D atusb/atusb.dfu $(prefix)/atusb/atusb.dfu; fi; - if [ -a av7110/bootcode.bin ]; then $(install_program) -D av7110/bootcode.bin $(prefix)/av7110/bootcode.bin; fi; - if [ -a cis/3CCFEM556.cis ]; then $(install_program) -D cis/3CCFEM556.cis $(prefix)/cis/3CCFEM556.cis; fi; - if [ -a cis/3CXEM556.cis ]; then $(install_program) -D cis/3CXEM556.cis $(prefix)/cis/3CXEM556.cis; fi; --- -2.26.0 - diff --git a/libre/linux-libre-firmware/0006-Makefile-Change-spaces-for-atusb-to-tab.patch b/libre/linux-libre-firmware/0006-Makefile-Change-spaces-for-atusb-to-tab.patch deleted file mode 100644 index 8dafb6b..0000000 --- a/libre/linux-libre-firmware/0006-Makefile-Change-spaces-for-atusb-to-tab.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 06147f83be16e7ab5e08c280c61e015b60bd0acc Mon Sep 17 00:00:00 2001 -From: Jason Self -Date: Thu, 4 Jul 2019 17:14:30 -0700 -Subject: [PATCH 6/8] Makefile: Change spaces for atusb to tab - ---- - Makefile | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/Makefile b/Makefile -index 51f708d..b5c5d05 100644 ---- a/Makefile -+++ b/Makefile -@@ -103,7 +103,7 @@ install: - ln -s ath9k_htc/htc_9271-1.4.0.fw $(prefix)/htc_9271.fw; fi; - if [ -a ath9k_htc/target_firmware/htc_7010.fw ]; then $(install_program) -D ath9k_htc/target_firmware/htc_7010.fw $(prefix)/ath9k_htc/htc_7010-1.4.0.fw && \ - ln -s ath9k_htc/htc_7010-1.4.0.fw $(prefix)/htc_7010.fw; fi; -- if [ -a atusb/atusb.dfu ]; then $(install_program) -D atusb/atusb.dfu $(prefix)/atusb/atusb.dfu; fi; -+ if [ -a atusb/atusb.dfu ]; then $(install_program) -D atusb/atusb.dfu $(prefix)/atusb/atusb.dfu; fi; - if [ -a av7110/bootcode.bin ]; then $(install_program) -D av7110/bootcode.bin $(prefix)/av7110/bootcode.bin; fi; - if [ -a cis/3CCFEM556.cis ]; then $(install_program) -D cis/3CCFEM556.cis $(prefix)/cis/3CCFEM556.cis; fi; - if [ -a cis/3CXEM556.cis ]; then $(install_program) -D cis/3CXEM556.cis $(prefix)/cis/3CXEM556.cis; fi; --- -2.26.0 - diff --git a/libre/linux-libre-firmware/0007-Makefile-Add-atusb-to-all.patch b/libre/linux-libre-firmware/0007-Makefile-Add-atusb-to-all.patch deleted file mode 100644 index 1da3c00..0000000 --- a/libre/linux-libre-firmware/0007-Makefile-Add-atusb-to-all.patch +++ /dev/null @@ -1,25 +0,0 @@ -From b43de635d524d519e47bcba78d081a0f811584b1 Mon Sep 17 00:00:00 2001 -From: Jason Self -Date: Thu, 4 Jul 2019 18:34:05 -0700 -Subject: [PATCH 7/8] Makefile: Add atusb to 'all' - ---- - Makefile | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/Makefile b/Makefile -index b5c5d05..b5bfb47 100644 ---- a/Makefile -+++ b/Makefile -@@ -19,7 +19,7 @@ install_program=install - - .PHONY: all test clean install a56 as31 aica ath9k_htc_toolchain ath9k_htc atusb av7110 b43-tools carl9170fw-toolchain carl9170fw cis-tools cis dsp56k ihex2fw isci keyspan_pda openfwwf usbdux - --all: aica ath9k_htc av7110 carl9170fw cis dsp56k isci keyspan_pda openfwwf usbdux -+all: aica ath9k_htc atusb av7110 carl9170fw cis dsp56k isci keyspan_pda openfwwf usbdux - - a56: - cd a56 && $(MAKE) --- -2.26.0 - diff --git a/libre/linux-libre-firmware/0008-Makefile-Set-shell-to-bin-bash.patch b/libre/linux-libre-firmware/0008-Makefile-Set-shell-to-bin-bash.patch deleted file mode 100644 index 6029cd5..0000000 --- a/libre/linux-libre-firmware/0008-Makefile-Set-shell-to-bin-bash.patch +++ /dev/null @@ -1,25 +0,0 @@ -From a4d24e3a224a19404bc3ac98389ff376198c85ef Mon Sep 17 00:00:00 2001 -From: Jason Self -Date: Thu, 4 Jul 2019 18:37:45 -0700 -Subject: [PATCH 8/8] Makefile: Set shell to /bin/bash - ---- - Makefile | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/Makefile b/Makefile -index b5bfb47..5e38d94 100644 ---- a/Makefile -+++ b/Makefile -@@ -13,7 +13,7 @@ - # You should have received a copy of the GNU General Public License - # along with this program. If not, see . - --shell=/bin/sh -+shell=/bin/bash - prefix=/lib/firmware - install_program=install - --- -2.26.0 - diff --git a/libre/linux-libre-firmware/PKGBUILD b/libre/linux-libre-firmware/PKGBUILD index 68e9145..1c99507 100644 --- a/libre/linux-libre-firmware/PKGBUILD +++ b/libre/linux-libre-firmware/PKGBUILD @@ -4,18 +4,18 @@ # Contributor: Luke Shumaker pkgname=linux-libre-firmware -pkgver=1.3.1 -pkgrel=2 +pkgver=1.4 +pkgrel=1 epoch=1 pkgdesc='Firmware files for Linux-libre' arch=(any) url='https://jxself.org/firmware' license=(GPL3) -makedepends=(arm-linux-gnueabi-gcc # av7110 - arm-none-eabi-gcc # aica - avr-gcc avr-libc dfu-util # atusb - sh-elf-gcc sh-elf-newlib cmake # carl9170fw - xtensa-elf-gcc # ath9k_htc +makedepends=(arm-linux-gnueabi-gcc # av7110 + arm-none-eabi-gcc # aica + avr-gcc avr-libc dfu-util # atusb + sh-elf-gcc sh-elf-newlib cmake # carl9170fw + xtensa-elf-gcc # ath9k_htc ) optdepends=('dfu-util: to flash the atusb firmware') provides=(linux-firmware) @@ -36,29 +36,13 @@ conflicts=(linux-firmware ath9k-htc-firmware) replaces=(${conflicts[@]}) options=(!buildflags !makeflags) -source=( - "$url/$pkgname-$pkgver.tar.lz"{,.asc} - 0001-Update-carl9170-to-latest-upstream.patch - 0002-Add-firmware-for-the-ATUSB-IEEE-802.15.4-USB-Adapter.patch - 0003-Update-INSTALL-document.patch - 0004-atusb-Build-updates.patch - 0006-Makefile-Change-spaces-for-atusb-to-tab.patch - 0007-Makefile-Add-atusb-to-all.patch - 0008-Makefile-Set-shell-to-bin-bash.patch -) -sha512sums=('d827ec7024b4900dcdf6af8cdd4e72b02596d0ade5c2262460cd573785300498e6aa655b9a59cd22e38a6a787826a564ae33acfac52e68df1d082445e66f18df' - 'SKIP' - '07263a406cb15c9f91f41c8fb6d4307875665b8106adf526353d64306611458e11ce311842caa9efa623091c897ec9f87cfe54584c9c47590195867958cf4086' - 'a4e8752cfee8dfd0b17ff798d2b5ea7a773ebcf688f7614d1c1a92fe7f092c626a289069a472bc873a77c9cf52f1e37953b0ba47c37a9dfb2a763a695ca77625' - '1665ce62de148383fe4f30aa5714ef6bb1dfd4eed110415995069830b36a4b1aafb05e4cd6cf428dc0817e2affb91740e41b3fab8d2385683d6c18790bbf5afd' - '0168ba0f3a8f3938a96b7f72d081283ca04b7ba90c5474d8ccf0716d6964137980f49623c5489271158a48827319a20ee4f19bd94f5bb956ee97d5ba637070c1' - 'fa006627935beb7ae78fad5b63423a54e4eae384761ff618fff173250fb5d0c7eef9d5a707733d037edc95259ef59c9053c4245b80a004928b6809ea1cb43cf8' - '8014d9eccb4c5193d1b4b056e163b5631c207adc78522e413650eb053c90e7b9e333c9e5cb6f73b63985e27020f4c69e7b791176702c55f711f6db95387e6bff' - '59560f16978b2fd7d8c828d7609ee4f71cbdc902b70cfb87feca686958dd4df05c61c5e1bfa5e0c2a060f23185a0b9e5d07d487e172764767cdc4b26a6240b79') +source=("$url/$pkgname-$pkgver.tar.lz"{,.asc}) +sha512sums=('3b4c8afb63c55f05df0b2686459c6bb2c0cb56db8384d5527506ff4a14b8de80e1a3037a9b57cccccd6953d869c6a71a6500c4c7b735253ea0b57c79854d9457' + 'SKIP') validpgpkeys=('F611A908FFA165C699584ED49D0DB31B545A3198') # Jason Self prepare(){ - cd $pkgname-$pkgver/src + cd "$pkgname-$pkgver/src" local src for src in "${source[@]}"; do @@ -69,25 +53,27 @@ prepare(){ patch -Np1 < "$srcdir/$src" done - # Use our cross compilers and build carl9170fw with the default config + # Use our cross compilers sed -e 's|$PWD/../toolchain/inst/bin/||g' \ - -e 's|${CMAKE_SOURCE_DIR}/toolchain/inst/bin/||g' \ + -i ath9k_htc/target_firmware/configure + sed -e 's|${CMAKE_SOURCE_DIR}/toolchain/inst/bin/||g' \ -e '/CMAKE_FIND_ROOT_PATH/d' \ - -e 's/: ath9k_htc_toolchain$/:/' \ + -i carl9170fw/extra/sh-elf-linux.cmake + + # Remove toolchains and build carl9170fw with the default config + sed -e 's/: ath9k_htc_toolchain$/:/' \ -e 's/: carl9170fw-toolchain$/:/' \ -e '/cd carl9170fw && .\/autogen.sh$/ s/$/ --alldefconfig/' \ - -i Makefile \ - ath9k_htc/target_firmware/configure \ - carl9170fw/extra/sh-elf-linux.cmake + -i Makefile } build(){ - make -C $pkgname-$pkgver/src + make -C "$pkgname-$pkgver/src" } package(){ - cd $pkgname-$pkgver/src + cd "$pkgname-$pkgver/src" - make prefix=$pkgdir/usr/lib/firmware install - install -Dm644 WHENCE $pkgdir/usr/share/licenses/$pkgname/WHENCE + make prefix="$pkgdir/usr/lib/firmware install" + install -Dm644 WHENCE "$pkgdir/usr/share/licenses/$pkgname/WHENCE" } From ee2601c074ecde286b965de7b07947b9e02e0fb8 Mon Sep 17 00:00:00 2001 From: Parabola automatic package builder Date: Oct 14 2021 23:32:53 +0000 Subject: [PATCH 16/23] Update libre/your-freedom --- diff --git a/libre/your-freedom/PKGBUILD b/libre/your-freedom/PKGBUILD index 98779ff..f833775 100644 --- a/libre/your-freedom/PKGBUILD +++ b/libre/your-freedom/PKGBUILD @@ -4,8 +4,8 @@ pkgname=your-freedom pkgdesc="This package conflicts with every nonfree package known to date to ensure your system is free." license=('GPL3') url="https://git.parabola.nu/blacklist.git" -pkgver=20210928 -_gitver=7d2e711096135e4f5c160fc739e23fd1ec7a3c07 +pkgver=20211014 +_gitver=00c03ece88c2cb7d7d45fae45d01950378cfef91 pkgrel=1 arch=('any') @@ -13,7 +13,7 @@ install=${pkgname}.install makedepends=(librelib) source=(blacklist-${_gitver}.txt::https://git.parabola.nu/blacklist.git/plain/blacklist.txt?id=${_gitver}) -sha512sums=('746be9d938a565a99dc3a2a273b580e0c7c2026a14f727bb09a996eacfbb40ce25ca62db58caa462f5546c60dd7be6b5f87cd65e2ab3fd843d4662a77f3ce827') +sha512sums=('b697ec86dbf8dbe8abfba4124be696eab60267961b7adf513a8033ed8f9978ecd52d4c719dd2a0af72274f9e683951cee45901ac372dc07a6b0f46a6d635a3c9') package() { From 9ffd901c919987a590cfea19a5c2bb6be81ddaaa Mon Sep 17 00:00:00 2001 From: David P Date: Oct 18 2021 12:43:46 +0000 Subject: [PATCH 17/23] linux-libre-lts: don't build htmldocs (armv7h) Signed-off-by: David P --- diff --git a/libre/linux-libre-lts/PKGBUILD b/libre/linux-libre-lts/PKGBUILD index 55a4c7d..653a7ac 100644 --- a/libre/linux-libre-lts/PKGBUILD +++ b/libre/linux-libre-lts/PKGBUILD @@ -9,6 +9,8 @@ # Based on linux-lts package +# NOTE: Don't build htmldocs due to an error in sphinx (armv7h only) + _replacesarchkernel=('linux%') # '%' gets replaced with kernel suffix _replacesoldkernels=() # '%' gets replaced with kernel suffix _replacesoldmodules=() # '%' gets replaced with kernel suffix @@ -152,7 +154,9 @@ prepare() { build() { cd $_srcname make all - make htmldocs + if ! [ "$CARCH" = armv7h ]; then + make htmldocs + fi } _package() { @@ -316,7 +320,8 @@ _package-docs() { ln -sr "$builddir/Documentation" "$pkgdir/usr/share/doc/$pkgbase" } -pkgname=("$pkgbase" "$pkgbase-headers" "$pkgbase-docs") +pkgname=("$pkgbase" "$pkgbase-headers") +[[ $CARCH = armv7h ]] || pkgname+=("$pkgbase-docs") for _p in "${pkgname[@]}"; do eval "package_$_p() { $(declare -f "_package${_p#$pkgbase}") From 19dca05f8d753ad809799eb995cefbd691de6688 Mon Sep 17 00:00:00 2001 From: Parabola automatic package builder Date: Oct 18 2021 21:44:34 +0000 Subject: [PATCH 18/23] Update libre/your-freedom --- diff --git a/libre/your-freedom/PKGBUILD b/libre/your-freedom/PKGBUILD index f833775..89aefa8 100644 --- a/libre/your-freedom/PKGBUILD +++ b/libre/your-freedom/PKGBUILD @@ -4,8 +4,8 @@ pkgname=your-freedom pkgdesc="This package conflicts with every nonfree package known to date to ensure your system is free." license=('GPL3') url="https://git.parabola.nu/blacklist.git" -pkgver=20211014 -_gitver=00c03ece88c2cb7d7d45fae45d01950378cfef91 +pkgver=20211018 +_gitver=c5b0ce0101756d82b19daab6df3c2b653793cdf6 pkgrel=1 arch=('any') @@ -13,7 +13,7 @@ install=${pkgname}.install makedepends=(librelib) source=(blacklist-${_gitver}.txt::https://git.parabola.nu/blacklist.git/plain/blacklist.txt?id=${_gitver}) -sha512sums=('b697ec86dbf8dbe8abfba4124be696eab60267961b7adf513a8033ed8f9978ecd52d4c719dd2a0af72274f9e683951cee45901ac372dc07a6b0f46a6d635a3c9') +sha512sums=('97b90ef448c9c41b93e939b5be42d170c8836473ebefb0f24adf3a1eb13c5a832486cbe063f191f3b536b384a2c16c5d2e952931d71e27b1240aa1b20f571703') package() { From a405b5371c9e46f92f794a95b778a56356df9123 Mon Sep 17 00:00:00 2001 From: Parabola automatic package builder Date: Oct 18 2021 22:00:21 +0000 Subject: [PATCH 19/23] Update libre/your-freedom --- diff --git a/libre/your-freedom/PKGBUILD b/libre/your-freedom/PKGBUILD index 89aefa8..1067a48 100644 --- a/libre/your-freedom/PKGBUILD +++ b/libre/your-freedom/PKGBUILD @@ -4,8 +4,8 @@ pkgname=your-freedom pkgdesc="This package conflicts with every nonfree package known to date to ensure your system is free." license=('GPL3') url="https://git.parabola.nu/blacklist.git" -pkgver=20211018 -_gitver=c5b0ce0101756d82b19daab6df3c2b653793cdf6 +pkgver=20211018.1 +_gitver=e3eeb82dc48d248e18ff240e778d77b765b336ce pkgrel=1 arch=('any') @@ -13,7 +13,7 @@ install=${pkgname}.install makedepends=(librelib) source=(blacklist-${_gitver}.txt::https://git.parabola.nu/blacklist.git/plain/blacklist.txt?id=${_gitver}) -sha512sums=('97b90ef448c9c41b93e939b5be42d170c8836473ebefb0f24adf3a1eb13c5a832486cbe063f191f3b536b384a2c16c5d2e952931d71e27b1240aa1b20f571703') +sha512sums=('e93f5f1476068a261ff84b2a07d222fd09587ac97adae0236e309d3a72a26b47421e99aabfebef8029c1c24449634e274996a548e0db6eb16e67f08795a56084') package() { From fcd3033e675f4ef197a0cfe2dddbb6be9d12e76a Mon Sep 17 00:00:00 2001 From: Omar Vega Ramos Date: Oct 27 2021 07:15:06 +0000 Subject: [PATCH 20/23] systemd-249.5-2.parabola1: updating version --- diff --git a/libre/systemd/PKGBUILD b/libre/systemd/PKGBUILD index 2ea8fb9..85072d6 100644 --- a/libre/systemd/PKGBUILD +++ b/libre/systemd/PKGBUILD @@ -11,10 +11,10 @@ pkgname+=('systemd-common' 'systemd-udev') # We split Arch's systemd-libs into systemd-$X, for the following $X: _systemd_libs=('libsystemd' 'libudev' 'nss-systemd' 'nss-myhostname' 'nss-mymachines' 'nss-resolve') pkgname+=("${_systemd_libs[@]/#/systemd-}") -_tag='91ea8d825553fc1ecfc19448be24a4da56b13d00' # git rev-parse v${_tag_name} -_tag_name=249.4 +_tag='f1d37a5c491d85255e9996960dc2889a15022b78' # git rev-parse v${_tag_name} +_tag_name=249.5 pkgver="${_tag_name/-/}" -pkgrel=1 +pkgrel=2 pkgrel+=.parabola1 arch=('x86_64') arch+=('i686' 'armv7h' 'ppc64le') @@ -91,6 +91,11 @@ sha512sums=('SKIP' '28a5b3fc9e2c5cec9267bb96725c73ee77788514f140c0cf8df765af64bc8130dd02f4863d9128ac45d54256b2ab4f2b06d1a3f65660ce1dfba5727618cd1839') _backports=( + # coredumpctl: stop truncating information about coredump + '473627e1c9fcdf8f819ced2bb79cb7e9ff598b0c' + + # Revert "core: Check unit start rate limiting earlier" + '4fa9d8f14523982482386d398d2b2669902f2098' ) _reverts=( From abb944bd774546492d607eb0bd34af92048dca18 Mon Sep 17 00:00:00 2001 From: bill-auger Date: Oct 29 2021 21:44:39 +0000 Subject: [PATCH 21/23] [p11-kit]: rebuild against latest libffi --- diff --git a/nonsystemd/p11-kit/PKGBUILD b/nonsystemd/p11-kit/PKGBUILD index 90a986f..cd1bbe9 100644 --- a/nonsystemd/p11-kit/PKGBUILD +++ b/nonsystemd/p11-kit/PKGBUILD @@ -5,7 +5,7 @@ pkgbase=p11-kit pkgname=(p11-kit libp11-kit) pkgver=0.24.0 -pkgrel=1 +pkgrel=2 pkgrel+=.nonsystemd1 pkgdesc="Loads and enumerates PKCS#11 modules" url="https://p11-glue.freedesktop.org" From 9ab3befd9790b7448d6cf289c7a093a1eccf9385 Mon Sep 17 00:00:00 2001 From: Parabola automatic package builder Date: Oct 31 2021 22:51:45 +0000 Subject: [PATCH 22/23] Update libre/your-freedom --- diff --git a/libre/your-freedom/PKGBUILD b/libre/your-freedom/PKGBUILD index 1067a48..43eb22f 100644 --- a/libre/your-freedom/PKGBUILD +++ b/libre/your-freedom/PKGBUILD @@ -4,8 +4,8 @@ pkgname=your-freedom pkgdesc="This package conflicts with every nonfree package known to date to ensure your system is free." license=('GPL3') url="https://git.parabola.nu/blacklist.git" -pkgver=20211018.1 -_gitver=e3eeb82dc48d248e18ff240e778d77b765b336ce +pkgver=20211031 +_gitver=3cc30bc2bfdaa2cdb47d3ab78d6ffd855307d50c pkgrel=1 arch=('any') @@ -13,7 +13,7 @@ install=${pkgname}.install makedepends=(librelib) source=(blacklist-${_gitver}.txt::https://git.parabola.nu/blacklist.git/plain/blacklist.txt?id=${_gitver}) -sha512sums=('e93f5f1476068a261ff84b2a07d222fd09587ac97adae0236e309d3a72a26b47421e99aabfebef8029c1c24449634e274996a548e0db6eb16e67f08795a56084') +sha512sums=('4a43619f7b19dfc2a12f0b769c097518f93d1a88159716148c0a2477df69ff6369fd8426a5ccadae8c4e9a152306f2724763a13183aca6a10f2c21292be1d1c9') package() { From cf681a6b4e7ca7241caedf1b1de886ab2cb3cc26 Mon Sep 17 00:00:00 2001 From: grizzlyuser Date: Nov 03 2021 11:19:09 +0000 Subject: [PATCH 23/23] libre/iceweasel: update to 94.0 from upstreams --- diff --git a/libre/iceweasel/0001-Use-remoting-name-for-GDK-application-names.patch b/libre/iceweasel/0001-Use-remoting-name-for-GDK-application-names.patch index c1feb3f..86dddab 100644 --- a/libre/iceweasel/0001-Use-remoting-name-for-GDK-application-names.patch +++ b/libre/iceweasel/0001-Use-remoting-name-for-GDK-application-names.patch @@ -9,10 +9,10 @@ Subject: [PATCH] Use remoting name for GDK application names 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp -index bb14d84338334..f5c0222987fb0 100644 +index 332f340179d3..840ad794f606 100644 --- a/toolkit/xre/nsAppRunner.cpp +++ b/toolkit/xre/nsAppRunner.cpp -@@ -4299,11 +4299,7 @@ int XREMain::XRE_mainStartup(bool* aExitFlag) { +@@ -4285,11 +4285,7 @@ int XREMain::XRE_mainStartup(bool* aExitFlag) { // consistently. // Set program name to the one defined in application.ini. @@ -26,7 +26,7 @@ index bb14d84338334..f5c0222987fb0 100644 // Initialize GTK here for splash. diff --git a/widget/gtk/nsAppShell.cpp b/widget/gtk/nsAppShell.cpp -index 60de473de07ab..004c066575c17 100644 +index 60de473de07a..004c066575c1 100644 --- a/widget/gtk/nsAppShell.cpp +++ b/widget/gtk/nsAppShell.cpp @@ -24,6 +24,8 @@ diff --git a/libre/iceweasel/9001-FSDG-always-sync-remote-settings-with-local-dump.patch b/libre/iceweasel/9001-FSDG-always-sync-remote-settings-with-local-dump.patch index 9fcaef7..d4e4ef5 100644 --- a/libre/iceweasel/9001-FSDG-always-sync-remote-settings-with-local-dump.patch +++ b/libre/iceweasel/9001-FSDG-always-sync-remote-settings-with-local-dump.patch @@ -370,9 +370,9 @@ index 3cc9436f61..3742da5667 100644 "blocklists", "main", + "monitor", - "pinning", "security-state", ] + -- 2.31.1 @@ -538,7 +538,7 @@ index 80dd563e11..1025ab33a2 100644 - signature: { x5u, signature }, + json_dump_metadata: { hash, size }, } = metadata; -- const certChain = await (await fetch(x5u)).text(); +- const certChain = await (await Utils.fetch(x5u)).text(); // Merge remote records with local ones and serialize as canonical JSON. const serialized = await RemoteSettingsWorker.canonicalStringify( records, @@ -639,7 +639,7 @@ index 1025ab33a2..1cebf2bc29 100644 IDBHelpers: "resource://services-settings/IDBHelpers.jsm", KintoHttpClient: "resource://services-common/kinto-http-client.js", @@ -30,6 +31,7 @@ XPCOMUtils.defineLazyModuleGetters(this, { - XPCOMUtils.defineLazyGlobalGetters(this, ["fetch"]); + }); const TELEMETRY_COMPONENT = "remotesettings"; +const DEFERRED_SYNC_DELAY_MILLISECONDS = 1000; diff --git a/libre/iceweasel/PKGBUILD b/libre/iceweasel/PKGBUILD index 96b248a..9b612fe 100644 --- a/libre/iceweasel/PKGBUILD +++ b/libre/iceweasel/PKGBUILD @@ -47,7 +47,7 @@ pkgname=iceweasel epoch=1 -pkgver=93.0 +pkgver=94.0 pkgrel=1 pkgrel+=.parabola1 _brandingver=93.0-1 @@ -82,13 +82,13 @@ source+=(https://repo.parabola.nu/other/iceweasel/${pkgname}_${_brandingver}.bra source_armv7h=(build-arm-libopus.patch) source_i686=('avoid-libxul-OOM-python-check.patch' 'rust-static-disable-network-test-on-static-libraries.patch') -sha256sums=('a78f080f5849bc284b84299f3540934a12e961a7ea368b592ae6576ea1f97102' +sha256sums=('b7bb8c5fcc74a74e9d2b55d1e9415b891305fe86520fb854cec25024d7e5de67' 'SKIP' - 'bb9769a8fe720abea2bba5b895c70c4fba0d44bb553399d83350268edf85cdeb' + '51cca2cab0fa9798f96b81ed24c238b2a7c98524f589ec500224bac9797b66fb' '9cdc2602661717712092d28bb494e5b48e518cb930898aca85eaf21f91f7ef58') sha256sums+=('2b2dcb5f15dba7f4ce8bc19de260dbc75219a93b107931bb0f6aff705c579fe5' 'SKIP' - '362d38ac2d99da2eec85bb5723239e7044e302503956488d0df31132409b993d' + 'a4e3c3869085cb282cb5a0fcb64e816c0415f25d4792a62c4f1d599d3111b23c' 'afeaeb6e9a6af901b57e25d85014e5c792efe4ff9dabb58663377f487b9d2887' '39e3a5e1ad137e21f842a44d7e3bd24050292d2b41fe59b4e7c7dfed52a195dd' '9386f1c50506cd20ab6d212335d5e4417faeb2aea371dd46f2d107d171e80b83' @@ -201,7 +201,7 @@ ac_add_options --disable-elf-hack # https://bugzilla.redhat.com/show_bug.cgi?id=1641623 ac_add_options --disable-av1 ac_add_options --enable-optimize="-g0 -O2" -mk_add_options MOZ_MAKE_FLAGS='-j2' +mk_add_options MOZ_MAKE_FLAGS='-j1' END # mozbuild.configure.options.InvalidOptionError: --disable-eme is not available in this configuration