Merge Official Source
This commit is contained in:
commit
67beb7e967
@ -6,11 +6,11 @@ ifdef CONFIG_TESTING_KERNEL
|
||||
KERNEL_PATCHVER:=$(KERNEL_TESTING_PATCHVER)
|
||||
endif
|
||||
|
||||
LINUX_VERSION-4.14 = .167
|
||||
LINUX_VERSION-4.19 = .98
|
||||
LINUX_VERSION-4.14 = .169
|
||||
LINUX_VERSION-4.19 = .101
|
||||
|
||||
LINUX_KERNEL_HASH-4.14.167 = 2bb78fc7a902faf4f5dad47fdbc2f4bf3df3cf9b41f408e7260f36656659fe43
|
||||
LINUX_KERNEL_HASH-4.19.98 = 91feb13bc22d60d69596ab1d01dfecbec13ef70f00c89a483e0733af94dd2937
|
||||
LINUX_KERNEL_HASH-4.14.169 = d88ea97993c56b1fa0b0a05061bcde476c6be4fc3bb2de8bd97a8f8ff7278249
|
||||
LINUX_KERNEL_HASH-4.19.101 = be26156abdb38ac0576a34a235ef456bb8ca67fbbe56fc6649b8d069159f8bc4
|
||||
|
||||
remove_uri_prefix=$(subst git://,,$(subst http://,,$(subst https://,,$(1))))
|
||||
sanitize_uri=$(call qstrip,$(subst @,_,$(subst :,_,$(subst .,_,$(subst -,_,$(subst /,_,$(1)))))))
|
||||
|
||||
@ -47,7 +47,8 @@ buffalo,wzr-hp-ag300h)
|
||||
glinet,gl-ar150)
|
||||
ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x8000" "0x10000"
|
||||
;;
|
||||
netgear,wndr3700)
|
||||
netgear,wndr3700|\
|
||||
netgear,wndr3700-v2)
|
||||
ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x20000" "0x10000"
|
||||
;;
|
||||
netgear,wndr3700-v4|\
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (C) 2019 OpenWrt.org
|
||||
# Copyright (C) 2019-2020 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
@ -10,12 +10,12 @@ include $(TOPDIR)/rules.mk
|
||||
UNPACK_CMD=unzip -q -p $(DL_DIR)/$(PKG_SOURCE) $(PKG_SOURCE_UNZIP) | gzip -dc | $(HOST_TAR) -C $(1) $(TAR_OPTIONS)
|
||||
|
||||
PKG_NAME:=cypress-firmware
|
||||
PKG_VERSION:=v4.14.77-2019_1031
|
||||
PKG_VERSION:=v4.14.77-2020_0115
|
||||
|
||||
PKG_SOURCE_UNZIP:=cypress-firmware-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE:=cypress-fmac-$(PKG_VERSION).zip
|
||||
PKG_SOURCE_URL:=https://community.cypress.com/servlet/JiveServlet/download/17441-2-50210/
|
||||
PKG_HASH:=bc2eec0d144a88e3105a06cac8039a7f13becde67dfe2a86793ba66f6a2510e0
|
||||
PKG_SOURCE_URL:=https://community.cypress.com/servlet/JiveServlet/download/19000-1-51721/
|
||||
PKG_HASH:=a5510f82aacf585b5d29732b6d6777d4a4b26a667154d91cfcfc0d6d5dc4fef5
|
||||
|
||||
PKG_MAINTAINER:=Álvaro Fernández Rojas <noltari@gmail.com>
|
||||
|
||||
@ -31,6 +31,24 @@ define Build/Compile
|
||||
true
|
||||
endef
|
||||
|
||||
# Cypress 43012 SDIO Firmware
|
||||
define Package/cypress-firmware-43012-sdio
|
||||
$(Package/cypress-firmware-default)
|
||||
TITLE:=CYW43012 FullMac SDIO firmware
|
||||
endef
|
||||
|
||||
define Package/cypress-firmware-43012-sdio/install
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/brcm
|
||||
$(INSTALL_DATA) \
|
||||
$(PKG_BUILD_DIR)/firmware/brcmfmac43012-sdio.bin \
|
||||
$(1)/lib/firmware/brcm/brcmfmac43012-sdio.bin
|
||||
$(INSTALL_DATA) \
|
||||
$(PKG_BUILD_DIR)/firmware/brcmfmac43012-sdio.clm_blob \
|
||||
$(1)/lib/firmware/brcm/brcmfmac43012-sdio.clm_blob
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,cypress-firmware-43012-sdio))
|
||||
|
||||
# Cypress 43340 SDIO Firmware
|
||||
define Package/cypress-firmware-43340-sdio
|
||||
$(Package/cypress-firmware-default)
|
||||
@ -166,6 +184,24 @@ endef
|
||||
|
||||
$(eval $(call BuildPackage,cypress-firmware-4356-sdio))
|
||||
|
||||
# Cypress 43570 PCIe Firmware
|
||||
define Package/cypress-firmware-43570-pcie
|
||||
$(Package/cypress-firmware-default)
|
||||
TITLE:=CYW43570 FullMac PCIe firmware
|
||||
endef
|
||||
|
||||
define Package/cypress-firmware-43570-pcie/install
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/brcm
|
||||
$(INSTALL_DATA) \
|
||||
$(PKG_BUILD_DIR)/firmware/brcmfmac43570-pcie.bin \
|
||||
$(1)/lib/firmware/brcm/brcmfmac43570-pcie.bin
|
||||
$(INSTALL_DATA) \
|
||||
$(PKG_BUILD_DIR)/firmware/brcmfmac43570-pcie.clm_blob \
|
||||
$(1)/lib/firmware/brcm/brcmfmac43570-pcie.clm_blob
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,cypress-firmware-43570-pcie))
|
||||
|
||||
# Cypress 4359 PCIe Firmware
|
||||
define Package/cypress-firmware-4359-pcie
|
||||
$(Package/cypress-firmware-default)
|
||||
@ -237,3 +273,21 @@ define Package/cypress-firmware-4373-usb/install
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,cypress-firmware-4373-usb))
|
||||
|
||||
# Cypress 89459 PCIe Firmware
|
||||
define Package/cypress-firmware-89459-pcie
|
||||
$(Package/cypress-firmware-default)
|
||||
TITLE:=CYW89459 FullMac PCIe firmware
|
||||
endef
|
||||
|
||||
define Package/cypress-firmware-89459-pcie/install
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/brcm
|
||||
$(INSTALL_DATA) \
|
||||
$(PKG_BUILD_DIR)/firmware/brcmfmac89459-pcie.bin \
|
||||
$(1)/lib/firmware/brcm/brcmfmac89459-pcie.bin
|
||||
$(INSTALL_DATA) \
|
||||
$(PKG_BUILD_DIR)/firmware/brcmfmac89459-pcie.clm_blob \
|
||||
$(1)/lib/firmware/brcm/brcmfmac89459-pcie.clm_blob
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,cypress-firmware-89459-pcie))
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (C) 2012-2019 OpenWrt.org
|
||||
# Copyright (C) 2012-2020 OpenWrt.org
|
||||
# Copyright (C) 2017 LEDE project
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
@ -9,8 +9,8 @@ include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
PKG_NAME:=brcm2708-gpu-fw
|
||||
PKG_VERSION:=2019-12-11
|
||||
PKG_RELEASE:=0c01dbefba45a08c47f8538d5a071a0fba6b7e83
|
||||
PKG_VERSION:=2020-01-30
|
||||
PKG_RELEASE:=63bdbe0ea609a69f5c0a2212d608ef3d9915a7ad
|
||||
|
||||
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME)/rpi-firmware-$(PKG_RELEASE)
|
||||
|
||||
@ -41,7 +41,7 @@ define Download/fixup_dat
|
||||
FILE:=$(RPI_FIRMWARE_FILE)-fixup.dat
|
||||
URL:=$(RPI_FIRMWARE_URL)
|
||||
URL_FILE:=fixup.dat
|
||||
HASH:=85a54bf460aa3ff0d04ee54bc606bf3af39a2c5194e519ab278cf74ecf75f7a8
|
||||
HASH:=7ca06846314d7a0d0335cadd6081ea50578f450ed0ec98d284220cea1021199f
|
||||
endef
|
||||
$(eval $(call Download,fixup_dat))
|
||||
|
||||
@ -49,7 +49,7 @@ define Download/fixup_cd_dat
|
||||
FILE:=$(RPI_FIRMWARE_FILE)-fixup_cd.dat
|
||||
URL:=$(RPI_FIRMWARE_URL)
|
||||
URL_FILE:=fixup_cd.dat
|
||||
HASH:=4d9ffff3719fff6b14f142cbb4b3f62df175e59be4ad382b0f39830dab18d760
|
||||
HASH:=fb8e8b196f9fd7bd16b00b8ed8a4d3231fb24c2910a4a10929b5f4f693ad69ef
|
||||
endef
|
||||
$(eval $(call Download,fixup_cd_dat))
|
||||
|
||||
@ -57,7 +57,7 @@ define Download/fixup_x_dat
|
||||
FILE:=$(RPI_FIRMWARE_FILE)-fixup_x.dat
|
||||
URL:=$(RPI_FIRMWARE_URL)
|
||||
URL_FILE:=fixup_x.dat
|
||||
HASH:=81aae9581c120fbbf5020fa6b84b355ed342ead7185db0916cbce7a7849307eb
|
||||
HASH:=65e0c34b5d17009d7a79f5d0ae81ced8b3649cc77258f29edb7e9b15d197634c
|
||||
endef
|
||||
$(eval $(call Download,fixup_x_dat))
|
||||
|
||||
@ -65,7 +65,7 @@ define Download/fixup4_dat
|
||||
FILE:=$(RPI_FIRMWARE_FILE)-fixup4.dat
|
||||
URL:=$(RPI_FIRMWARE_URL)
|
||||
URL_FILE:=fixup4.dat
|
||||
HASH:=611ea1ec1384931c785687e78a50369aae3a0a29e37bed354862cf5fe6d23ade
|
||||
HASH:=d040dff3e48d645e474ef9c108651e9d4d6708f75aa50799148a1917724e5d27
|
||||
endef
|
||||
$(eval $(call Download,fixup4_dat))
|
||||
|
||||
@ -73,7 +73,7 @@ define Download/fixup4cd_dat
|
||||
FILE:=$(RPI_FIRMWARE_FILE)-fixup4cd.dat
|
||||
URL:=$(RPI_FIRMWARE_URL)
|
||||
URL_FILE:=fixup4cd.dat
|
||||
HASH:=f82da018c2d9fe1ec54fcfe76514dbc3b9f27f53712bb5f5b90f0d38124370eb
|
||||
HASH:=2a3366d0f7ea5c2d39da41f9a2c68aa84a14641dbf122dccc275e0d548296c0d
|
||||
endef
|
||||
$(eval $(call Download,fixup4cd_dat))
|
||||
|
||||
@ -81,7 +81,7 @@ define Download/fixup4x_dat
|
||||
FILE:=$(RPI_FIRMWARE_FILE)-fixup4x.dat
|
||||
URL:=$(RPI_FIRMWARE_URL)
|
||||
URL_FILE:=fixup4x.dat
|
||||
HASH:=36c1cdb7b5ff8c39c1c0cd962ea1095f79c5c290fc11813869cbb662240386d7
|
||||
HASH:=6c6e9fec9e769d1bff3cf6775b12a5f640fbd810c3a1427318509a929b854a5b
|
||||
endef
|
||||
$(eval $(call Download,fixup4x_dat))
|
||||
|
||||
@ -89,7 +89,7 @@ define Download/start_elf
|
||||
FILE:=$(RPI_FIRMWARE_FILE)-start.elf
|
||||
URL:=$(RPI_FIRMWARE_URL)
|
||||
URL_FILE:=start.elf
|
||||
HASH:=442919907e4b7d8f007b79df1aa1e12f98e09ab393da65b48cd2b2af04301b7d
|
||||
HASH:=2cde27f015b244b35b2261fe468924298b4c3d0ea12b69f99cd0bd9d1fcadf9c
|
||||
endef
|
||||
$(eval $(call Download,start_elf))
|
||||
|
||||
@ -97,7 +97,7 @@ define Download/start_cd_elf
|
||||
FILE:=$(RPI_FIRMWARE_FILE)-start_cd.elf
|
||||
URL:=$(RPI_FIRMWARE_URL)
|
||||
URL_FILE:=start_cd.elf
|
||||
HASH:=0942b6ab8eec7e6116a3fc366cb0d4a94b5869c429292da600f92a37e361ec8d
|
||||
HASH:=5151679b5128c3cedbeb2992d8c6f8f13ce919282f6a98e87af0fe13b2686142
|
||||
endef
|
||||
$(eval $(call Download,start_cd_elf))
|
||||
|
||||
@ -105,7 +105,7 @@ define Download/start_x_elf
|
||||
FILE:=$(RPI_FIRMWARE_FILE)-start_x.elf
|
||||
URL:=$(RPI_FIRMWARE_URL)
|
||||
URL_FILE:=start_x.elf
|
||||
HASH:=e83dc1fbb5a9cb29e1db5f9ca0f9bd847f5b57a1e421cc79e39640a865456fe6
|
||||
HASH:=e4ee556a657adf5f5b1c006bfd7f7278e3cd76807adc3eb23f192f37759b674e
|
||||
endef
|
||||
$(eval $(call Download,start_x_elf))
|
||||
|
||||
@ -113,7 +113,7 @@ define Download/start4_elf
|
||||
FILE:=$(RPI_FIRMWARE_FILE)-start4.elf
|
||||
URL:=$(RPI_FIRMWARE_URL)
|
||||
URL_FILE:=start4.elf
|
||||
HASH:=550b55577075f4056a71b0faa2b1150290b2e8d61e5bc330a54452f28cc1b2d8
|
||||
HASH:=fc9a3b7a07bc901f677cc15420ac1c66d5b55bd1c697b07ee54ee5bbf92a7cc5
|
||||
endef
|
||||
$(eval $(call Download,start4_elf))
|
||||
|
||||
@ -121,7 +121,7 @@ define Download/start4cd_elf
|
||||
FILE:=$(RPI_FIRMWARE_FILE)-start4cd.elf
|
||||
URL:=$(RPI_FIRMWARE_URL)
|
||||
URL_FILE:=start4cd.elf
|
||||
HASH:=1c8206a854fba486b7996aa3735aaca8aaeee7bf20fdbf190acdea4516794f1c
|
||||
HASH:=b75ef404d1e222e84b64e7410e9c9633a643db196421c144ace51454a2a0f504
|
||||
endef
|
||||
$(eval $(call Download,start4cd_elf))
|
||||
|
||||
@ -129,7 +129,7 @@ define Download/start4x_elf
|
||||
FILE:=$(RPI_FIRMWARE_FILE)-start4x.elf
|
||||
URL:=$(RPI_FIRMWARE_URL)
|
||||
URL_FILE:=start4x.elf
|
||||
HASH:=3ca2e259861fd31b77a536ccb33637e5305ec44b9e0c62e898e7e1d97e776f22
|
||||
HASH:=db639727412e80d1a7b0dfd9f8cb0b71318f8663ece7e6b20a3804526c6a330d
|
||||
endef
|
||||
$(eval $(call Download,start4x_elf))
|
||||
|
||||
|
||||
@ -257,6 +257,21 @@ endef
|
||||
$(eval $(call KernelPackage,hwmon-ltc4151))
|
||||
|
||||
|
||||
define KernelPackage/hwmon-mcp3021
|
||||
TITLE:=MCP3021/3221 monitoring support
|
||||
KCONFIG:=CONFIG_SENSORS_MCP3021
|
||||
FILES:=$(LINUX_DIR)/drivers/hwmon/mcp3021.ko
|
||||
AUTOLOAD:=$(call AutoProbe,mcp3021)
|
||||
$(call AddDepends/hwmon,+kmod-i2c-core)
|
||||
endef
|
||||
|
||||
define KernelPackage/hwmon-mcp3021/description
|
||||
Kernel module for Linear Technology MCP3021/3221 current and voltage monitor chip
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,hwmon-mcp3021))
|
||||
|
||||
|
||||
define KernelPackage/hwmon-nct6775
|
||||
TITLE:=NCT6106D/6775F/6776F/6779D/6791D/6792D/6793D and compatibles monitoring support
|
||||
KCONFIG:=CONFIG_SENSORS_NCT6775
|
||||
|
||||
@ -0,0 +1,26 @@
|
||||
From 4282dc057d750c6a7dd92953564b15c26b54c22c Mon Sep 17 00:00:00 2001
|
||||
From: Navid Emamdoost <navid.emamdoost@gmail.com>
|
||||
Date: Sat, 14 Dec 2019 19:51:14 -0600
|
||||
Subject: [PATCH] brcmfmac: Fix memory leak in brcmf_usbdev_qinit
|
||||
|
||||
In the implementation of brcmf_usbdev_qinit() the allocated memory for
|
||||
reqs is leaking if usb_alloc_urb() fails. Release reqs in the error
|
||||
handling path.
|
||||
|
||||
Fixes: 71bb244ba2fd ("brcm80211: fmac: add USB support for bcm43235/6/8 chipsets")
|
||||
Signed-off-by: Navid Emamdoost <navid.emamdoost@gmail.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
@@ -430,6 +430,7 @@ fail:
|
||||
usb_free_urb(req->urb);
|
||||
list_del(q->next);
|
||||
}
|
||||
+ kfree(reqs);
|
||||
return NULL;
|
||||
|
||||
}
|
||||
@ -0,0 +1,66 @@
|
||||
From a32de68edab7b73ded850bcf76cdf6858e92a7e5 Mon Sep 17 00:00:00 2001
|
||||
From: Dmitry Osipenko <digetx@gmail.com>
|
||||
Date: Sun, 15 Dec 2019 21:42:24 +0300
|
||||
Subject: [PATCH] brcmfmac: Keep OOB wake-interrupt disabled when it shouldn't
|
||||
be enabled
|
||||
|
||||
NVIDIA Tegra SoCs do not like when OOB wake is enabled and WiFi interface
|
||||
is in DOWN state during suspend. This results in a CPU hang on programming
|
||||
OOB wake-up state of the GPIO controller during of system's suspend.
|
||||
|
||||
The solution is trivial: don't enable wake for the OOB interrupt when it
|
||||
should be disabled.
|
||||
|
||||
This fixes hang on Tegra20 (Acer A500) and Tegra30 (Nexus 7) devices which
|
||||
are using BCM4329 and BCM4330 WiFi chips respectively.
|
||||
|
||||
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 10 +++++-----
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/sdio.h | 1 -
|
||||
2 files changed, 5 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
|
||||
@@ -120,7 +120,7 @@ int brcmf_sdiod_intr_register(struct brc
|
||||
brcmf_err("enable_irq_wake failed %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
- sdiodev->irq_wake = true;
|
||||
+ disable_irq_wake(pdata->oob_irq_nr);
|
||||
|
||||
sdio_claim_host(sdiodev->func1);
|
||||
|
||||
@@ -179,10 +179,6 @@ void brcmf_sdiod_intr_unregister(struct
|
||||
sdio_release_host(sdiodev->func1);
|
||||
|
||||
sdiodev->oob_irq_requested = false;
|
||||
- if (sdiodev->irq_wake) {
|
||||
- disable_irq_wake(pdata->oob_irq_nr);
|
||||
- sdiodev->irq_wake = false;
|
||||
- }
|
||||
free_irq(pdata->oob_irq_nr, &sdiodev->func1->dev);
|
||||
sdiodev->irq_en = false;
|
||||
sdiodev->oob_irq_requested = false;
|
||||
@@ -1173,6 +1169,10 @@ static int brcmf_ops_sdio_resume(struct
|
||||
if (ret)
|
||||
brcmf_err("Failed to probe device on resume\n");
|
||||
} else {
|
||||
+ if (sdiodev->wowl_enabled &&
|
||||
+ sdiodev->settings->bus.sdio.oob_irq_supported)
|
||||
+ disable_irq_wake(sdiodev->settings->bus.sdio.oob_irq_nr);
|
||||
+
|
||||
brcmf_sdiod_freezer_off(sdiodev);
|
||||
}
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
|
||||
@@ -178,7 +178,6 @@ struct brcmf_sdio_dev {
|
||||
bool sd_irq_requested;
|
||||
bool irq_en; /* irq enable flags */
|
||||
spinlock_t irq_en_lock;
|
||||
- bool irq_wake; /* irq wake enable flags */
|
||||
bool sg_support;
|
||||
uint max_request_size;
|
||||
ushort max_segment_count;
|
||||
@ -0,0 +1,27 @@
|
||||
From b92c017deda819e45a0f054f6df6b53e645d7fe4 Mon Sep 17 00:00:00 2001
|
||||
From: zhengbin <zhengbin13@huawei.com>
|
||||
Date: Tue, 24 Dec 2019 22:16:06 +0800
|
||||
Subject: [PATCH] brcmfmac: use true,false for bool variable
|
||||
|
||||
Fixes coccicheck warning:
|
||||
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c:911:2-24: WARNING: Assignment of 0/1 to bool variable
|
||||
|
||||
Reported-by: Hulk Robot <hulkci@huawei.com>
|
||||
Signed-off-by: zhengbin <zhengbin13@huawei.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
|
||||
@@ -908,7 +908,7 @@ static u8 brcmf_fws_hdrpush(struct brcmf
|
||||
wlh += wlh[1] + 2;
|
||||
|
||||
if (entry->send_tim_signal) {
|
||||
- entry->send_tim_signal = 0;
|
||||
+ entry->send_tim_signal = false;
|
||||
wlh[0] = BRCMF_FWS_TYPE_PENDING_TRAFFIC_BMP;
|
||||
wlh[1] = BRCMF_FWS_TYPE_PENDING_TRAFFIC_BMP_LEN;
|
||||
wlh[2] = entry->mac_handle;
|
||||
@ -0,0 +1,57 @@
|
||||
From 8c8e60fb86a90a30721bbd797f58f96b3980dcc1 Mon Sep 17 00:00:00 2001
|
||||
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
|
||||
Date: Thu, 26 Dec 2019 10:20:33 +0100
|
||||
Subject: [PATCH] brcmfmac: sdio: Fix OOB interrupt initialization on brcm43362
|
||||
|
||||
Commit 262f2b53f679 ("brcmfmac: call brcmf_attach() just before calling
|
||||
brcmf_bus_started()") changed the initialization order of the brcmfmac
|
||||
SDIO driver. Unfortunately since brcmf_sdiod_intr_register() is now
|
||||
called before the sdiodev->bus_if initialization, it reads the wrong
|
||||
chip ID and fails to initialize the GPIO on brcm43362. Thus the chip
|
||||
cannot send interrupts and fails to probe:
|
||||
|
||||
[ 12.517023] brcmfmac: brcmf_sdio_bus_rxctl: resumed on timeout
|
||||
[ 12.531214] ieee80211 phy0: brcmf_bus_started: failed: -110
|
||||
[ 12.536976] ieee80211 phy0: brcmf_attach: dongle is not responding: err=-110
|
||||
[ 12.566467] brcmfmac: brcmf_sdio_firmware_callback: brcmf_attach failed
|
||||
|
||||
Initialize the bus interface earlier to ensure that
|
||||
brcmf_sdiod_intr_register() properly sets up the OOB interrupt.
|
||||
|
||||
BugLink: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=908438
|
||||
Fixes: 262f2b53f679 ("brcmfmac: call brcmf_attach() just before calling brcmf_bus_started()")
|
||||
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
|
||||
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 12 ++++++------
|
||||
1 file changed, 6 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -4243,6 +4243,12 @@ static void brcmf_sdio_firmware_callback
|
||||
}
|
||||
|
||||
if (err == 0) {
|
||||
+ /* Assign bus interface call back */
|
||||
+ sdiod->bus_if->dev = sdiod->dev;
|
||||
+ sdiod->bus_if->ops = &brcmf_sdio_bus_ops;
|
||||
+ sdiod->bus_if->chip = bus->ci->chip;
|
||||
+ sdiod->bus_if->chiprev = bus->ci->chiprev;
|
||||
+
|
||||
/* Allow full data communication using DPC from now on. */
|
||||
brcmf_sdiod_change_state(bus->sdiodev, BRCMF_SDIOD_DATA);
|
||||
|
||||
@@ -4259,12 +4265,6 @@ static void brcmf_sdio_firmware_callback
|
||||
|
||||
sdio_release_host(sdiod->func1);
|
||||
|
||||
- /* Assign bus interface call back */
|
||||
- sdiod->bus_if->dev = sdiod->dev;
|
||||
- sdiod->bus_if->ops = &brcmf_sdio_bus_ops;
|
||||
- sdiod->bus_if->chip = bus->ci->chip;
|
||||
- sdiod->bus_if->chiprev = bus->ci->chiprev;
|
||||
-
|
||||
err = brcmf_alloc(sdiod->dev, sdiod->settings);
|
||||
if (err) {
|
||||
brcmf_err("brcmf_alloc failed\n");
|
||||
@ -0,0 +1,103 @@
|
||||
From 24332f8068ff6df7f16aefee45d514de1de4de80 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Thu, 26 Dec 2019 14:30:49 +0100
|
||||
Subject: [PATCH] brcmfmac: simplify building interface combinations
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Move similar/duplicated code out of combination specific code blocks.
|
||||
This simplifies code a bit and allows adding more combinations later.
|
||||
A list of combinations remains unchanged.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/cfg80211.c | 43 ++++++-------------
|
||||
1 file changed, 14 insertions(+), 29 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -6479,12 +6479,13 @@ static int brcmf_setup_ifmodes(struct wi
|
||||
struct ieee80211_iface_limit *c0_limits = NULL;
|
||||
struct ieee80211_iface_limit *p2p_limits = NULL;
|
||||
struct ieee80211_iface_limit *mbss_limits = NULL;
|
||||
- bool mbss, p2p, rsdb;
|
||||
+ bool mbss, p2p, rsdb, mchan;
|
||||
int i, c, n_combos;
|
||||
|
||||
mbss = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS);
|
||||
p2p = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_P2P);
|
||||
rsdb = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_RSDB);
|
||||
+ mchan = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MCHAN);
|
||||
|
||||
n_combos = 1 + !!(p2p && !rsdb) + !!mbss;
|
||||
combo = kcalloc(n_combos, sizeof(*combo), GFP_KERNEL);
|
||||
@@ -6494,6 +6495,10 @@ static int brcmf_setup_ifmodes(struct wi
|
||||
wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
|
||||
BIT(NL80211_IFTYPE_ADHOC) |
|
||||
BIT(NL80211_IFTYPE_AP);
|
||||
+ if (p2p)
|
||||
+ wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
|
||||
+ BIT(NL80211_IFTYPE_P2P_GO) |
|
||||
+ BIT(NL80211_IFTYPE_P2P_DEVICE);
|
||||
|
||||
c = 0;
|
||||
i = 0;
|
||||
@@ -6505,48 +6510,28 @@ static int brcmf_setup_ifmodes(struct wi
|
||||
c0_limits = kcalloc(2, sizeof(*c0_limits), GFP_KERNEL);
|
||||
if (!c0_limits)
|
||||
goto err;
|
||||
- if (p2p && rsdb) {
|
||||
- combo[c].num_different_channels = 2;
|
||||
- wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
|
||||
- BIT(NL80211_IFTYPE_P2P_GO) |
|
||||
- BIT(NL80211_IFTYPE_P2P_DEVICE);
|
||||
- c0_limits[i].max = 2;
|
||||
- c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
|
||||
+
|
||||
+ combo[c].num_different_channels = 1 + (rsdb || (p2p && mchan));
|
||||
+ c0_limits[i].max = 1 + rsdb;
|
||||
+ c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
|
||||
+ if (p2p) {
|
||||
c0_limits[i].max = 1;
|
||||
c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_DEVICE);
|
||||
- c0_limits[i].max = 2;
|
||||
+ c0_limits[i].max = 1 + rsdb;
|
||||
c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
|
||||
BIT(NL80211_IFTYPE_P2P_GO);
|
||||
+ }
|
||||
+ if (p2p && rsdb) {
|
||||
c0_limits[i].max = 2;
|
||||
c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
|
||||
combo[c].max_interfaces = 5;
|
||||
} else if (p2p) {
|
||||
- if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MCHAN))
|
||||
- combo[c].num_different_channels = 2;
|
||||
- else
|
||||
- combo[c].num_different_channels = 1;
|
||||
- c0_limits[i].max = 1;
|
||||
- c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
|
||||
- wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
|
||||
- BIT(NL80211_IFTYPE_P2P_GO) |
|
||||
- BIT(NL80211_IFTYPE_P2P_DEVICE);
|
||||
- c0_limits[i].max = 1;
|
||||
- c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_DEVICE);
|
||||
- c0_limits[i].max = 1;
|
||||
- c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
|
||||
- BIT(NL80211_IFTYPE_P2P_GO);
|
||||
combo[c].max_interfaces = i;
|
||||
} else if (rsdb) {
|
||||
- combo[c].num_different_channels = 2;
|
||||
- c0_limits[i].max = 2;
|
||||
- c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
|
||||
c0_limits[i].max = 2;
|
||||
c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
|
||||
combo[c].max_interfaces = 3;
|
||||
} else {
|
||||
- combo[c].num_different_channels = 1;
|
||||
- c0_limits[i].max = 1;
|
||||
- c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
|
||||
c0_limits[i].max = 1;
|
||||
c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
|
||||
combo[c].max_interfaces = i;
|
||||
@ -0,0 +1,345 @@
|
||||
From 20f2c5fa3af060401c72e444999470a4cab641cf Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Thu, 26 Dec 2019 14:30:50 +0100
|
||||
Subject: [PATCH] brcmfmac: add initial support for monitor mode
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Report monitor interface availability using cfg80211 and support it in
|
||||
the add_virtual_intf() and del_virtual_intf() callbacks. This new
|
||||
feature is conditional and depends on firmware flagging monitor packets.
|
||||
Receiving monitor frames is already handled by the brcmf_netif_mon_rx().
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/cfg80211.c | 112 ++++++++++++++++--
|
||||
.../broadcom/brcm80211/brcmfmac/core.c | 68 ++++++++++-
|
||||
.../broadcom/brcm80211/brcmfmac/core.h | 2 +
|
||||
.../broadcom/brcm80211/brcmfmac/feature.c | 1 +
|
||||
.../broadcom/brcm80211/brcmfmac/feature.h | 2 +
|
||||
.../broadcom/brcm80211/brcmfmac/fwil.h | 2 +
|
||||
6 files changed, 174 insertions(+), 13 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -11,6 +11,7 @@
|
||||
#include <linux/vmalloc.h>
|
||||
#include <net/cfg80211.h>
|
||||
#include <net/netlink.h>
|
||||
+#include <uapi/linux/if_arp.h>
|
||||
|
||||
#include <brcmu_utils.h>
|
||||
#include <defs.h>
|
||||
@@ -619,6 +620,82 @@ static bool brcmf_is_ibssmode(struct brc
|
||||
return vif->wdev.iftype == NL80211_IFTYPE_ADHOC;
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * brcmf_mon_add_vif() - create monitor mode virtual interface
|
||||
+ *
|
||||
+ * @wiphy: wiphy device of new interface.
|
||||
+ * @name: name of the new interface.
|
||||
+ */
|
||||
+static struct wireless_dev *brcmf_mon_add_vif(struct wiphy *wiphy,
|
||||
+ const char *name)
|
||||
+{
|
||||
+ struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
|
||||
+ struct brcmf_cfg80211_vif *vif;
|
||||
+ struct net_device *ndev;
|
||||
+ struct brcmf_if *ifp;
|
||||
+ int err;
|
||||
+
|
||||
+ if (cfg->pub->mon_if) {
|
||||
+ err = -EEXIST;
|
||||
+ goto err_out;
|
||||
+ }
|
||||
+
|
||||
+ vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_MONITOR);
|
||||
+ if (IS_ERR(vif)) {
|
||||
+ err = PTR_ERR(vif);
|
||||
+ goto err_out;
|
||||
+ }
|
||||
+
|
||||
+ ndev = alloc_netdev(sizeof(*ifp), name, NET_NAME_UNKNOWN, ether_setup);
|
||||
+ if (!ndev) {
|
||||
+ err = -ENOMEM;
|
||||
+ goto err_free_vif;
|
||||
+ }
|
||||
+ ndev->type = ARPHRD_IEEE80211_RADIOTAP;
|
||||
+ ndev->ieee80211_ptr = &vif->wdev;
|
||||
+ ndev->needs_free_netdev = true;
|
||||
+ ndev->priv_destructor = brcmf_cfg80211_free_netdev;
|
||||
+ SET_NETDEV_DEV(ndev, wiphy_dev(cfg->wiphy));
|
||||
+
|
||||
+ ifp = netdev_priv(ndev);
|
||||
+ ifp->vif = vif;
|
||||
+ ifp->ndev = ndev;
|
||||
+ ifp->drvr = cfg->pub;
|
||||
+
|
||||
+ vif->ifp = ifp;
|
||||
+ vif->wdev.netdev = ndev;
|
||||
+
|
||||
+ err = brcmf_net_mon_attach(ifp);
|
||||
+ if (err) {
|
||||
+ brcmf_err("Failed to attach %s device\n", ndev->name);
|
||||
+ free_netdev(ndev);
|
||||
+ goto err_free_vif;
|
||||
+ }
|
||||
+
|
||||
+ cfg->pub->mon_if = ifp;
|
||||
+
|
||||
+ return &vif->wdev;
|
||||
+
|
||||
+err_free_vif:
|
||||
+ brcmf_free_vif(vif);
|
||||
+err_out:
|
||||
+ return ERR_PTR(err);
|
||||
+}
|
||||
+
|
||||
+static int brcmf_mon_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev)
|
||||
+{
|
||||
+ struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
|
||||
+ struct net_device *ndev = wdev->netdev;
|
||||
+
|
||||
+ ndev->netdev_ops->ndo_stop(ndev);
|
||||
+
|
||||
+ brcmf_net_detach(ndev, true);
|
||||
+
|
||||
+ cfg->pub->mon_if = NULL;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static struct wireless_dev *brcmf_cfg80211_add_iface(struct wiphy *wiphy,
|
||||
const char *name,
|
||||
unsigned char name_assign_type,
|
||||
@@ -641,9 +718,10 @@ static struct wireless_dev *brcmf_cfg802
|
||||
case NL80211_IFTYPE_STATION:
|
||||
case NL80211_IFTYPE_AP_VLAN:
|
||||
case NL80211_IFTYPE_WDS:
|
||||
- case NL80211_IFTYPE_MONITOR:
|
||||
case NL80211_IFTYPE_MESH_POINT:
|
||||
return ERR_PTR(-EOPNOTSUPP);
|
||||
+ case NL80211_IFTYPE_MONITOR:
|
||||
+ return brcmf_mon_add_vif(wiphy, name);
|
||||
case NL80211_IFTYPE_AP:
|
||||
wdev = brcmf_ap_add_vif(wiphy, name, params);
|
||||
break;
|
||||
@@ -826,9 +904,10 @@ int brcmf_cfg80211_del_iface(struct wiph
|
||||
case NL80211_IFTYPE_STATION:
|
||||
case NL80211_IFTYPE_AP_VLAN:
|
||||
case NL80211_IFTYPE_WDS:
|
||||
- case NL80211_IFTYPE_MONITOR:
|
||||
case NL80211_IFTYPE_MESH_POINT:
|
||||
return -EOPNOTSUPP;
|
||||
+ case NL80211_IFTYPE_MONITOR:
|
||||
+ return brcmf_mon_del_vif(wiphy, wdev);
|
||||
case NL80211_IFTYPE_AP:
|
||||
return brcmf_cfg80211_del_ap_iface(wiphy, wdev);
|
||||
case NL80211_IFTYPE_P2P_CLIENT:
|
||||
@@ -6479,9 +6558,10 @@ static int brcmf_setup_ifmodes(struct wi
|
||||
struct ieee80211_iface_limit *c0_limits = NULL;
|
||||
struct ieee80211_iface_limit *p2p_limits = NULL;
|
||||
struct ieee80211_iface_limit *mbss_limits = NULL;
|
||||
- bool mbss, p2p, rsdb, mchan;
|
||||
- int i, c, n_combos;
|
||||
+ bool mon_flag, mbss, p2p, rsdb, mchan;
|
||||
+ int i, c, n_combos, n_limits;
|
||||
|
||||
+ mon_flag = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MONITOR_FLAG);
|
||||
mbss = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS);
|
||||
p2p = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_P2P);
|
||||
rsdb = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_RSDB);
|
||||
@@ -6495,6 +6575,8 @@ static int brcmf_setup_ifmodes(struct wi
|
||||
wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
|
||||
BIT(NL80211_IFTYPE_ADHOC) |
|
||||
BIT(NL80211_IFTYPE_AP);
|
||||
+ if (mon_flag)
|
||||
+ wiphy->interface_modes |= BIT(NL80211_IFTYPE_MONITOR);
|
||||
if (p2p)
|
||||
wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
|
||||
BIT(NL80211_IFTYPE_P2P_GO) |
|
||||
@@ -6502,18 +6584,18 @@ static int brcmf_setup_ifmodes(struct wi
|
||||
|
||||
c = 0;
|
||||
i = 0;
|
||||
- if (p2p && rsdb)
|
||||
- c0_limits = kcalloc(4, sizeof(*c0_limits), GFP_KERNEL);
|
||||
- else if (p2p)
|
||||
- c0_limits = kcalloc(3, sizeof(*c0_limits), GFP_KERNEL);
|
||||
- else
|
||||
- c0_limits = kcalloc(2, sizeof(*c0_limits), GFP_KERNEL);
|
||||
+ n_limits = 1 + mon_flag + (p2p ? 2 : 0) + (rsdb || !p2p);
|
||||
+ c0_limits = kcalloc(n_limits, sizeof(*c0_limits), GFP_KERNEL);
|
||||
if (!c0_limits)
|
||||
goto err;
|
||||
|
||||
combo[c].num_different_channels = 1 + (rsdb || (p2p && mchan));
|
||||
c0_limits[i].max = 1 + rsdb;
|
||||
c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
|
||||
+ if (mon_flag) {
|
||||
+ c0_limits[i].max = 1;
|
||||
+ c0_limits[i++].types = BIT(NL80211_IFTYPE_MONITOR);
|
||||
+ }
|
||||
if (p2p) {
|
||||
c0_limits[i].max = 1;
|
||||
c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_DEVICE);
|
||||
@@ -6562,14 +6644,20 @@ static int brcmf_setup_ifmodes(struct wi
|
||||
if (mbss) {
|
||||
c++;
|
||||
i = 0;
|
||||
- mbss_limits = kcalloc(1, sizeof(*mbss_limits), GFP_KERNEL);
|
||||
+ n_limits = 1 + mon_flag;
|
||||
+ mbss_limits = kcalloc(n_limits, sizeof(*mbss_limits),
|
||||
+ GFP_KERNEL);
|
||||
if (!mbss_limits)
|
||||
goto err;
|
||||
mbss_limits[i].max = 4;
|
||||
mbss_limits[i++].types = BIT(NL80211_IFTYPE_AP);
|
||||
+ if (mon_flag) {
|
||||
+ mbss_limits[i].max = 1;
|
||||
+ mbss_limits[i++].types = BIT(NL80211_IFTYPE_MONITOR);
|
||||
+ }
|
||||
combo[c].beacon_int_infra_match = true;
|
||||
combo[c].num_different_channels = 1;
|
||||
- combo[c].max_interfaces = 4;
|
||||
+ combo[c].max_interfaces = 4 + mon_flag;
|
||||
combo[c].n_limits = i;
|
||||
combo[c].limits = mbss_limits;
|
||||
}
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -690,7 +690,7 @@ fail:
|
||||
return -EBADE;
|
||||
}
|
||||
|
||||
-static void brcmf_net_detach(struct net_device *ndev, bool rtnl_locked)
|
||||
+void brcmf_net_detach(struct net_device *ndev, bool rtnl_locked)
|
||||
{
|
||||
if (ndev->reg_state == NETREG_REGISTERED) {
|
||||
if (rtnl_locked)
|
||||
@@ -703,6 +703,72 @@ static void brcmf_net_detach(struct net_
|
||||
}
|
||||
}
|
||||
|
||||
+static int brcmf_net_mon_open(struct net_device *ndev)
|
||||
+{
|
||||
+ struct brcmf_if *ifp = netdev_priv(ndev);
|
||||
+ struct brcmf_pub *drvr = ifp->drvr;
|
||||
+ u32 monitor;
|
||||
+ int err;
|
||||
+
|
||||
+ brcmf_dbg(TRACE, "Enter\n");
|
||||
+
|
||||
+ err = brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_MONITOR, &monitor);
|
||||
+ if (err) {
|
||||
+ bphy_err(drvr, "BRCMF_C_GET_MONITOR error (%d)\n", err);
|
||||
+ return err;
|
||||
+ } else if (monitor) {
|
||||
+ bphy_err(drvr, "Monitor mode is already enabled\n");
|
||||
+ return -EEXIST;
|
||||
+ }
|
||||
+
|
||||
+ monitor = 3;
|
||||
+ err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_MONITOR, monitor);
|
||||
+ if (err)
|
||||
+ bphy_err(drvr, "BRCMF_C_SET_MONITOR error (%d)\n", err);
|
||||
+
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+static int brcmf_net_mon_stop(struct net_device *ndev)
|
||||
+{
|
||||
+ struct brcmf_if *ifp = netdev_priv(ndev);
|
||||
+ struct brcmf_pub *drvr = ifp->drvr;
|
||||
+ u32 monitor;
|
||||
+ int err;
|
||||
+
|
||||
+ brcmf_dbg(TRACE, "Enter\n");
|
||||
+
|
||||
+ monitor = 0;
|
||||
+ err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_MONITOR, monitor);
|
||||
+ if (err)
|
||||
+ bphy_err(drvr, "BRCMF_C_SET_MONITOR error (%d)\n", err);
|
||||
+
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+static const struct net_device_ops brcmf_netdev_ops_mon = {
|
||||
+ .ndo_open = brcmf_net_mon_open,
|
||||
+ .ndo_stop = brcmf_net_mon_stop,
|
||||
+};
|
||||
+
|
||||
+int brcmf_net_mon_attach(struct brcmf_if *ifp)
|
||||
+{
|
||||
+ struct brcmf_pub *drvr = ifp->drvr;
|
||||
+ struct net_device *ndev;
|
||||
+ int err;
|
||||
+
|
||||
+ brcmf_dbg(TRACE, "Enter\n");
|
||||
+
|
||||
+ ndev = ifp->ndev;
|
||||
+ ndev->netdev_ops = &brcmf_netdev_ops_mon;
|
||||
+
|
||||
+ err = register_netdevice(ndev);
|
||||
+ if (err)
|
||||
+ bphy_err(drvr, "Failed to register %s device\n", ndev->name);
|
||||
+
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on)
|
||||
{
|
||||
struct net_device *ndev;
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
|
||||
@@ -210,6 +210,8 @@ void brcmf_txflowblock_if(struct brcmf_i
|
||||
void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success);
|
||||
void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb);
|
||||
void brcmf_netif_mon_rx(struct brcmf_if *ifp, struct sk_buff *skb);
|
||||
+void brcmf_net_detach(struct net_device *ndev, bool rtnl_locked);
|
||||
+int brcmf_net_mon_attach(struct brcmf_if *ifp);
|
||||
void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on);
|
||||
int __init brcmf_core_init(void);
|
||||
void __exit brcmf_core_exit(void);
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
@@ -38,6 +38,7 @@ static const struct brcmf_feat_fwcap brc
|
||||
{ BRCMF_FEAT_MCHAN, "mchan" },
|
||||
{ BRCMF_FEAT_P2P, "p2p" },
|
||||
{ BRCMF_FEAT_MONITOR, "monitor" },
|
||||
+ { BRCMF_FEAT_MONITOR_FLAG, "rtap" },
|
||||
{ BRCMF_FEAT_MONITOR_FMT_RADIOTAP, "rtap" },
|
||||
{ BRCMF_FEAT_DOT11H, "802.11h" }
|
||||
};
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
|
||||
@@ -23,6 +23,7 @@
|
||||
* GSCAN: enhanced scan offload feature.
|
||||
* FWSUP: Firmware supplicant.
|
||||
* MONITOR: firmware can pass monitor packets to host.
|
||||
+ * MONITOR_FLAG: firmware flags monitor packets.
|
||||
* MONITOR_FMT_RADIOTAP: firmware provides monitor packets with radiotap header
|
||||
* MONITOR_FMT_HW_RX_HDR: firmware provides monitor packets with hw/ucode header
|
||||
* DOT11H: firmware supports 802.11h
|
||||
@@ -43,6 +44,7 @@
|
||||
BRCMF_FEAT_DEF(GSCAN) \
|
||||
BRCMF_FEAT_DEF(FWSUP) \
|
||||
BRCMF_FEAT_DEF(MONITOR) \
|
||||
+ BRCMF_FEAT_DEF(MONITOR_FLAG) \
|
||||
BRCMF_FEAT_DEF(MONITOR_FMT_RADIOTAP) \
|
||||
BRCMF_FEAT_DEF(MONITOR_FMT_HW_RX_HDR) \
|
||||
BRCMF_FEAT_DEF(DOT11H)
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h
|
||||
@@ -49,6 +49,8 @@
|
||||
#define BRCMF_C_GET_PM 85
|
||||
#define BRCMF_C_SET_PM 86
|
||||
#define BRCMF_C_GET_REVINFO 98
|
||||
+#define BRCMF_C_GET_MONITOR 107
|
||||
+#define BRCMF_C_SET_MONITOR 108
|
||||
#define BRCMF_C_GET_CURR_RATESET 114
|
||||
#define BRCMF_C_GET_AP 117
|
||||
#define BRCMF_C_SET_AP 118
|
||||
@ -0,0 +1,24 @@
|
||||
From 627b0d094240c38393b2f2d40626c33a8fff6103 Mon Sep 17 00:00:00 2001
|
||||
From: yuehaibing <yuehaibing@huawei.com>
|
||||
Date: Wed, 8 Jan 2020 21:57:48 +0800
|
||||
Subject: [PATCH] brcmfmac: Remove always false 'idx < 0' statement
|
||||
|
||||
idx is declared as u32, it will never less than 0.
|
||||
|
||||
Signed-off-by: yuehaibing <yuehaibing@huawei.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
|
||||
@@ -365,7 +365,7 @@ brcmf_msgbuf_get_pktid(struct device *de
|
||||
struct brcmf_msgbuf_pktid *pktid;
|
||||
struct sk_buff *skb;
|
||||
|
||||
- if (idx < 0 || idx >= pktids->array_size) {
|
||||
+ if (idx >= pktids->array_size) {
|
||||
brcmf_err("Invalid packet id %d (max %d)\n", idx,
|
||||
pktids->array_size);
|
||||
return NULL;
|
||||
@ -13,7 +13,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -1479,6 +1479,7 @@ int __init brcmf_core_init(void)
|
||||
@@ -1545,6 +1545,7 @@ int __init brcmf_core_init(void)
|
||||
{
|
||||
if (!schedule_work(&brcmf_driver_work))
|
||||
return -EBUSY;
|
||||
|
||||
@ -10,7 +10,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -628,8 +628,36 @@ static struct wireless_dev *brcmf_cfg802
|
||||
@@ -705,8 +705,36 @@ static struct wireless_dev *brcmf_cfg802
|
||||
struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
|
||||
struct brcmf_pub *drvr = cfg->pub;
|
||||
struct wireless_dev *wdev;
|
||||
|
||||
@ -14,7 +14,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -2795,6 +2795,10 @@ brcmf_cfg80211_set_power_mgmt(struct wip
|
||||
@@ -2874,6 +2874,10 @@ brcmf_cfg80211_set_power_mgmt(struct wip
|
||||
* preference in cfg struct to apply this to
|
||||
* FW later while initializing the dongle
|
||||
*/
|
||||
|
||||
154
package/kernel/mac80211/patches/brcm/998-survey.patch
Normal file
154
package/kernel/mac80211/patches/brcm/998-survey.patch
Normal file
@ -0,0 +1,154 @@
|
||||
Index: backports-5.4-rc8-1/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
===================================================================
|
||||
--- backports-5.4-rc8-1.orig/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ backports-5.4-rc8-1/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -2747,6 +2747,63 @@ done:
|
||||
}
|
||||
|
||||
static int
|
||||
+brcmf_cfg80211_dump_survey(struct wiphy *wiphy, struct net_device *ndev,
|
||||
+ int idx, struct survey_info *survey)
|
||||
+{
|
||||
+ struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
|
||||
+ struct brcmf_if *ifp = netdev_priv(ndev);
|
||||
+ struct brcmu_chan ch;
|
||||
+ enum nl80211_band band = 0;
|
||||
+ s32 err = 0;
|
||||
+ int noise;
|
||||
+ u32 freq;
|
||||
+ u32 chanspec;
|
||||
+
|
||||
+ memset(survey, 0, sizeof(struct survey_info));
|
||||
+ if (idx != 0) {
|
||||
+ if (idx >= cfg->pub->num_chan_stats || cfg->pub->chan_stats == NULL)
|
||||
+ return -ENOENT;
|
||||
+ if (cfg->pub->chan_stats[idx].freq == 0)
|
||||
+ return -ENOENT;
|
||||
+ survey->filled = SURVEY_INFO_NOISE_DBM;
|
||||
+ survey->channel = ieee80211_get_channel(wiphy, cfg->pub->chan_stats[idx].freq);
|
||||
+ survey->noise = cfg->pub->chan_stats[idx].noise;
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ err = brcmf_fil_iovar_int_get(ifp, "chanspec", &chanspec);
|
||||
+ if (err) {
|
||||
+ brcmf_err("chanspec failed (%d)\n", err);
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
+ ch.chspec = chanspec;
|
||||
+ cfg->d11inf.decchspec(&ch);
|
||||
+
|
||||
+ switch (ch.band) {
|
||||
+ case BRCMU_CHAN_BAND_2G:
|
||||
+ band = NL80211_BAND_2GHZ;
|
||||
+ break;
|
||||
+ case BRCMU_CHAN_BAND_5G:
|
||||
+ band = NL80211_BAND_5GHZ;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ freq = ieee80211_channel_to_frequency(ch.control_ch_num, band);
|
||||
+ survey->channel = ieee80211_get_channel(wiphy, freq);
|
||||
+
|
||||
+ err = brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_PHY_NOISE, &noise);
|
||||
+ if (err) {
|
||||
+ brcmf_err("Could not get noise (%d)\n", err);
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
+ survey->filled = SURVEY_INFO_NOISE_DBM | SURVEY_INFO_IN_USE;
|
||||
+ survey->noise = le32_to_cpu(noise);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
brcmf_cfg80211_dump_station(struct wiphy *wiphy, struct net_device *ndev,
|
||||
int idx, u8 *mac, struct station_info *sinfo)
|
||||
{
|
||||
@@ -2836,6 +2893,7 @@ static s32 brcmf_inform_single_bss(struc
|
||||
struct brcmu_chan ch;
|
||||
u16 channel;
|
||||
u32 freq;
|
||||
+ int i;
|
||||
u16 notify_capability;
|
||||
u16 notify_interval;
|
||||
u8 *notify_ie;
|
||||
@@ -2860,6 +2918,17 @@ static s32 brcmf_inform_single_bss(struc
|
||||
band = NL80211_BAND_5GHZ;
|
||||
|
||||
freq = ieee80211_channel_to_frequency(channel, band);
|
||||
+ for (i = 0;i < cfg->pub->num_chan_stats;i++) {
|
||||
+ if (freq == cfg->pub->chan_stats[i].freq)
|
||||
+ break;
|
||||
+ if (cfg->pub->chan_stats[i].freq == 0)
|
||||
+ break;
|
||||
+ }
|
||||
+ if (i < cfg->pub->num_chan_stats) {
|
||||
+ cfg->pub->chan_stats[i].freq = freq;
|
||||
+ cfg->pub->chan_stats[i].noise = bi->phy_noise;
|
||||
+ }
|
||||
+
|
||||
bss_data.chan = ieee80211_get_channel(wiphy, freq);
|
||||
bss_data.scan_width = NL80211_BSS_CHAN_WIDTH_20;
|
||||
bss_data.boottime_ns = ktime_to_ns(ktime_get_boottime());
|
||||
@@ -5277,6 +5346,7 @@ static struct cfg80211_ops brcmf_cfg8021
|
||||
.leave_ibss = brcmf_cfg80211_leave_ibss,
|
||||
.get_station = brcmf_cfg80211_get_station,
|
||||
.dump_station = brcmf_cfg80211_dump_station,
|
||||
+ .dump_survey = brcmf_cfg80211_dump_survey,
|
||||
.set_tx_power = brcmf_cfg80211_set_tx_power,
|
||||
.get_tx_power = brcmf_cfg80211_get_tx_power,
|
||||
.add_key = brcmf_cfg80211_add_key,
|
||||
Index: backports-5.4-rc8-1/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
===================================================================
|
||||
--- backports-5.4-rc8-1.orig/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ backports-5.4-rc8-1/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -1277,6 +1277,8 @@ int brcmf_attach(struct device *dev)
|
||||
|
||||
/* Link to bus module */
|
||||
drvr->hdrlen = 0;
|
||||
+ drvr->chan_stats = vzalloc(256 * sizeof(struct brcmf_chan_stats));
|
||||
+ drvr->num_chan_stats = 256;
|
||||
|
||||
/* Attach and link in the protocol */
|
||||
ret = brcmf_proto_attach(drvr);
|
||||
@@ -1359,6 +1361,12 @@ void brcmf_detach(struct device *dev)
|
||||
if (drvr == NULL)
|
||||
return;
|
||||
|
||||
+ drvr->num_chan_stats = 0;
|
||||
+ if (drvr->chan_stats) {
|
||||
+ vfree(drvr->chan_stats);
|
||||
+ drvr->chan_stats = NULL;
|
||||
+ }
|
||||
+
|
||||
#ifdef CONFIG_INET
|
||||
unregister_inetaddr_notifier(&drvr->inetaddr_notifier);
|
||||
#endif
|
||||
Index: backports-5.4-rc8-1/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
|
||||
===================================================================
|
||||
--- backports-5.4-rc8-1.orig/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
|
||||
+++ backports-5.4-rc8-1/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
|
||||
@@ -91,6 +91,11 @@ struct brcmf_rev_info {
|
||||
u32 nvramrev;
|
||||
};
|
||||
|
||||
+struct brcmf_chan_stats {
|
||||
+ u32 freq;
|
||||
+ int noise;
|
||||
+};
|
||||
+
|
||||
/* Common structure for module and instance linkage */
|
||||
struct brcmf_pub {
|
||||
/* Linkage ponters */
|
||||
@@ -100,6 +105,9 @@ struct brcmf_pub {
|
||||
struct cfg80211_ops *ops;
|
||||
struct brcmf_cfg80211_info *config;
|
||||
|
||||
+ int num_chan_stats;
|
||||
+ struct brcmf_chan_stats *chan_stats;
|
||||
+
|
||||
/* Internal brcmf items */
|
||||
uint hdrlen; /* Total BRCMF header length (proto + bus) */
|
||||
|
||||
@ -8,9 +8,9 @@ PKG_LICENSE_FILES:=
|
||||
|
||||
PKG_SOURCE_URL:=https://github.com/openwrt/mt76
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_DATE:=2020-01-03
|
||||
PKG_SOURCE_VERSION:=38f4c579898d799657b227831a7b4bab156f785d
|
||||
PKG_MIRROR_HASH:=375e065c66dcd424cc31426f4c9cfb2824d2e94091c8e1d2168e9a2ee1064c95
|
||||
PKG_SOURCE_DATE:=2020-02-02
|
||||
PKG_SOURCE_VERSION:=721673759d8229a42ab39a9a7cba15261f1dfcf9
|
||||
PKG_MIRROR_HASH:=67631bbe0ec9af6e4f255841457cde706dbbde21092c9485e7b0cc222e54e6d9
|
||||
|
||||
PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
|
||||
PKG_BUILD_PARALLEL:=1
|
||||
@ -192,6 +192,10 @@ ifdef CONFIG_PACKAGE_kmod-mt7603
|
||||
endif
|
||||
ifdef CONFIG_PACKAGE_kmod-mt7615e
|
||||
PKG_MAKE_FLAGS += CONFIG_MT7615E=m
|
||||
ifdef CONFIG_TARGET_mediatek_mt7622
|
||||
PKG_MAKE_FLAGS += CONFIG_MT7622_WMAC=y
|
||||
NOSTDINC_FLAGS += -DCONFIG_MT7622_WMAC
|
||||
endif
|
||||
endif
|
||||
|
||||
define Build/Compile
|
||||
@ -251,6 +255,9 @@ define KernelPackage/mt7615e/install
|
||||
$(PKG_BUILD_DIR)/firmware/mt7615_cr4.bin \
|
||||
$(PKG_BUILD_DIR)/firmware/mt7615_n9.bin \
|
||||
$(PKG_BUILD_DIR)/firmware/mt7615_rom_patch.bin \
|
||||
$(if $(CONFIG_TARGET_mediatek_mt7622), \
|
||||
$(PKG_BUILD_DIR)/firmware/mt7622_n9.bin \
|
||||
$(PKG_BUILD_DIR)/firmware/mt7622_rom_patch.bin) \
|
||||
$(1)/lib/firmware/mediatek
|
||||
endef
|
||||
|
||||
|
||||
@ -11,12 +11,12 @@ include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
PKG_NAME:=wireguard
|
||||
|
||||
PKG_VERSION:=0.0.20200128
|
||||
PKG_VERSION:=0.0.20200205
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE:=wireguard-linux-compat-$(PKG_VERSION).tar.xz
|
||||
PKG_SOURCE_URL:=https://git.zx2c4.com/wireguard-linux-compat/snapshot/
|
||||
PKG_HASH:=8610c6d8712cfd885f50b1a8c572518edf318c094d68491ea218bb50566a9a8a
|
||||
PKG_HASH:=9669e165fc7252cab7f908ba57f160f6d57539b7cc81180f260cb675d2fd362b
|
||||
|
||||
PKG_LICENSE:=GPL-2.0
|
||||
PKG_LICENSE_FILES:=COPYING
|
||||
|
||||
@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=iproute2
|
||||
PKG_VERSION:=5.4.0
|
||||
PKG_RELEASE:=1
|
||||
PKG_RELEASE:=2
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
|
||||
PKG_SOURCE_URL:=@KERNEL/linux/utils/net/iproute2
|
||||
|
||||
@ -1,214 +0,0 @@
|
||||
From 69b427fb5e1211c1110ce63be62b70504d04b0ff Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
|
||||
Date: Sat, 23 Mar 2019 10:21:03 +0000
|
||||
Subject: [PATCH] savedscp
|
||||
|
||||
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
|
||||
---
|
||||
extensions/libxt_CONNMARK.c | 68 ++++++++++++++++++++++++++-
|
||||
include/linux/netfilter/xt_connmark.h | 3 +-
|
||||
2 files changed, 69 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/extensions/libxt_CONNMARK.c
|
||||
+++ b/extensions/libxt_CONNMARK.c
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
+#include <strings.h>
|
||||
#include <xtables.h>
|
||||
#include <linux/netfilter/xt_CONNMARK.h>
|
||||
|
||||
@@ -49,6 +50,7 @@ enum {
|
||||
O_CTMASK,
|
||||
O_NFMASK,
|
||||
O_MASK,
|
||||
+ O_SAVEDSCP_MARK,
|
||||
F_SET_MARK = 1 << O_SET_MARK,
|
||||
F_SAVE_MARK = 1 << O_SAVE_MARK,
|
||||
F_RESTORE_MARK = 1 << O_RESTORE_MARK,
|
||||
@@ -61,8 +63,10 @@ enum {
|
||||
F_CTMASK = 1 << O_CTMASK,
|
||||
F_NFMASK = 1 << O_NFMASK,
|
||||
F_MASK = 1 << O_MASK,
|
||||
+ F_SAVEDSCP_MARK = 1 << O_SAVEDSCP_MARK,
|
||||
F_OP_ANY = F_SET_MARK | F_SAVE_MARK | F_RESTORE_MARK |
|
||||
- F_AND_MARK | F_OR_MARK | F_XOR_MARK | F_SET_XMARK,
|
||||
+ F_AND_MARK | F_OR_MARK | F_XOR_MARK | F_SET_XMARK |
|
||||
+ F_SAVEDSCP_MARK,
|
||||
};
|
||||
|
||||
static const char *const xt_connmark_shift_ops[] = {
|
||||
@@ -75,6 +79,7 @@ static void CONNMARK_help(void)
|
||||
printf(
|
||||
"CONNMARK target options:\n"
|
||||
" --set-mark value[/mask] Set conntrack mark value\n"
|
||||
+" --savedscp-mark dscpmask/statemask Save DSCP to conntrack mark value\n"
|
||||
" --save-mark [--mask mask] Save the packet nfmark in the connection\n"
|
||||
" --restore-mark [--mask mask] Restore saved nfmark value\n");
|
||||
}
|
||||
@@ -83,6 +88,8 @@ static void CONNMARK_help(void)
|
||||
static const struct xt_option_entry CONNMARK_opts[] = {
|
||||
{.name = "set-mark", .id = O_SET_MARK, .type = XTTYPE_MARKMASK32,
|
||||
.excl = F_OP_ANY},
|
||||
+ {.name = "savedscp-mark", .id = O_SAVEDSCP_MARK, .type = XTTYPE_MARKMASK32,
|
||||
+ .excl = F_OP_ANY},
|
||||
{.name = "save-mark", .id = O_SAVE_MARK, .type = XTTYPE_NONE,
|
||||
.excl = F_OP_ANY},
|
||||
{.name = "restore-mark", .id = O_RESTORE_MARK, .type = XTTYPE_NONE,
|
||||
@@ -98,6 +105,8 @@ static const struct xt_option_entry conn
|
||||
.excl = F_OP_ANY},
|
||||
{.name = "set-mark", .id = O_SET_MARK, .type = XTTYPE_MARKMASK32,
|
||||
.excl = F_OP_ANY},
|
||||
+ {.name = "savedscp-mark", .id = O_SAVEDSCP_MARK, .type = XTTYPE_MARKMASK32,
|
||||
+ .excl = F_OP_ANY},
|
||||
{.name = "and-mark", .id = O_AND_MARK, .type = XTTYPE_UINT32,
|
||||
.excl = F_OP_ANY},
|
||||
{.name = "or-mark", .id = O_OR_MARK, .type = XTTYPE_UINT32,
|
||||
@@ -124,6 +133,8 @@ static const struct xt_option_entry conn
|
||||
.excl = F_OP_ANY},
|
||||
{.name = "set-mark", .id = O_SET_MARK, .type = XTTYPE_MARKMASK32,
|
||||
.excl = F_OP_ANY},
|
||||
+ {.name = "savedscp-mark", .id = O_SAVEDSCP_MARK, .type = XTTYPE_MARKMASK32,
|
||||
+ .excl = F_OP_ANY},
|
||||
{.name = "and-mark", .id = O_AND_MARK, .type = XTTYPE_UINT32,
|
||||
.excl = F_OP_ANY},
|
||||
{.name = "or-mark", .id = O_OR_MARK, .type = XTTYPE_UINT32,
|
||||
@@ -158,6 +169,7 @@ static void connmark_tg_help(void)
|
||||
" --restore-mark [--ctmask mask] [--nfmask mask]\n"
|
||||
" Copy nfmark to ctmark using masks\n"
|
||||
" --set-mark value[/mask] Set conntrack mark value\n"
|
||||
+" --savedscp-mark value/mask Save DSCP to conntrack mark value\n"
|
||||
" --save-mark [--mask mask] Save the packet nfmark in the connection\n"
|
||||
" --restore-mark [--mask mask] Restore saved nfmark value\n"
|
||||
" --and-mark value Binary AND the ctmark with bits\n"
|
||||
@@ -210,6 +222,11 @@ static void CONNMARK_parse(struct xt_opt
|
||||
markinfo->mark = cb->val.mark;
|
||||
markinfo->mask = cb->val.mask;
|
||||
break;
|
||||
+ case O_SAVEDSCP_MARK:
|
||||
+ markinfo->mode = XT_CONNMARK_SAVEDSCP;
|
||||
+ markinfo->mark = cb->val.mark;
|
||||
+ markinfo->mask = cb->val.mask;
|
||||
+ break;
|
||||
case O_SAVE_MARK:
|
||||
markinfo->mode = XT_CONNMARK_SAVE;
|
||||
break;
|
||||
@@ -238,6 +255,19 @@ static void connmark_tg_parse(struct xt_
|
||||
info->ctmark = cb->val.mark;
|
||||
info->ctmask = cb->val.mark | cb->val.mask;
|
||||
break;
|
||||
+ case O_SAVEDSCP_MARK:
|
||||
+ info->mode = XT_CONNMARK_SAVEDSCP;
|
||||
+ info->ctmark = cb->val.mark;
|
||||
+ info->ctmask = cb->val.mask;
|
||||
+ info->nfmask = info->ctmark ? ffs(info->ctmark) - 1 : 0;
|
||||
+ /* need 6 contiguous bits */
|
||||
+ if ((0x3f & (info->ctmark >> info->nfmask)) != 0x3f)
|
||||
+ xtables_error(PARAMETER_PROBLEM,
|
||||
+ "CONNMARK savedscp: insufficient contiguous dscpmask bits");
|
||||
+ if (info->ctmark & info->ctmask)
|
||||
+ xtables_error(PARAMETER_PROBLEM,
|
||||
+ "CONNMARK savedscp: dscpmask/statemask bits overlap");
|
||||
+ break;
|
||||
case O_AND_MARK:
|
||||
info->mode = XT_CONNMARK_SET;
|
||||
info->ctmark = 0;
|
||||
@@ -283,6 +313,19 @@ static void connmark_tg_parse_v2(struct
|
||||
info->ctmark = cb->val.mark;
|
||||
info->ctmask = cb->val.mark | cb->val.mask;
|
||||
break;
|
||||
+ case O_SAVEDSCP_MARK:
|
||||
+ info->mode = XT_CONNMARK_SAVEDSCP;
|
||||
+ info->ctmark = cb->val.mark;
|
||||
+ info->ctmask = cb->val.mask;
|
||||
+ info->shift_bits = info->ctmark ? ffs(info->ctmark) - 1 : 0;
|
||||
+ /* need 6 contiguous bits */
|
||||
+ if ((0x3f & (info->ctmark >> info->shift_bits)) != 0x3f)
|
||||
+ xtables_error(PARAMETER_PROBLEM,
|
||||
+ "CONNMARK savedscp: insufficient contiguous dscpmask bits");
|
||||
+ if (info->ctmark & info->ctmask)
|
||||
+ xtables_error(PARAMETER_PROBLEM,
|
||||
+ "CONNMARK savedscp: dscpmask/statemask bits overlap");
|
||||
+ break;
|
||||
case O_AND_MARK:
|
||||
info->mode = XT_CONNMARK_SET;
|
||||
info->ctmark = 0;
|
||||
@@ -351,6 +394,11 @@ static void CONNMARK_print(const void *i
|
||||
print_mark(markinfo->mark);
|
||||
print_mask("/", markinfo->mask);
|
||||
break;
|
||||
+ case XT_CONNMARK_SAVEDSCP:
|
||||
+ printf(" CONNMARK savedscp ");
|
||||
+ print_mark(markinfo->mark);
|
||||
+ print_mask("/", markinfo->mask);
|
||||
+ break;
|
||||
case XT_CONNMARK_SAVE:
|
||||
printf(" CONNMARK save ");
|
||||
print_mask("mask ", markinfo->mask);
|
||||
@@ -386,6 +434,10 @@ connmark_tg_print(const void *ip, const
|
||||
printf(" CONNMARK xset 0x%x/0x%x",
|
||||
info->ctmark, info->ctmask);
|
||||
break;
|
||||
+ case XT_CONNMARK_SAVEDSCP:
|
||||
+ printf(" CONNMARK DSCP set 0x%x/0x%x",
|
||||
+ info->ctmark, info->ctmask);
|
||||
+ break;
|
||||
case XT_CONNMARK_SAVE:
|
||||
if (info->nfmask == UINT32_MAX && info->ctmask == UINT32_MAX)
|
||||
printf(" CONNMARK save");
|
||||
@@ -433,6 +485,10 @@ connmark_tg_print_v2(const void *ip, con
|
||||
printf(" CONNMARK xset 0x%x/0x%x",
|
||||
info->ctmark, info->ctmask);
|
||||
break;
|
||||
+ case XT_CONNMARK_SAVEDSCP:
|
||||
+ printf(" CONNMARK DSCP xset 0x%x/0x%x",
|
||||
+ info->ctmark, info->ctmask);
|
||||
+ break;
|
||||
case XT_CONNMARK_SAVE:
|
||||
if (info->nfmask == UINT32_MAX && info->ctmask == UINT32_MAX)
|
||||
printf(" CONNMARK save");
|
||||
@@ -474,6 +530,11 @@ static void CONNMARK_save(const void *ip
|
||||
print_mark(markinfo->mark);
|
||||
print_mask("/", markinfo->mask);
|
||||
break;
|
||||
+ case XT_CONNMARK_SAVEDSCP:
|
||||
+ printf(" --savedscp-mark ");
|
||||
+ print_mark(markinfo->mark);
|
||||
+ print_mask("/", markinfo->mask);
|
||||
+ break;
|
||||
case XT_CONNMARK_SAVE:
|
||||
printf(" --save-mark ");
|
||||
print_mask("--mask ", markinfo->mask);
|
||||
@@ -505,6 +566,9 @@ connmark_tg_save(const void *ip, const s
|
||||
case XT_CONNMARK_SET:
|
||||
printf(" --set-xmark 0x%x/0x%x", info->ctmark, info->ctmask);
|
||||
break;
|
||||
+ case XT_CONNMARK_SAVEDSCP:
|
||||
+ printf(" --savedscp-mark 0x%x/0x%x", info->ctmark, info->ctmask);
|
||||
+ break;
|
||||
case XT_CONNMARK_SAVE:
|
||||
printf(" --save-mark --nfmask 0x%x --ctmask 0x%x",
|
||||
info->nfmask, info->ctmask);
|
||||
@@ -529,6 +593,9 @@ connmark_tg_save_v2(const void *ip, cons
|
||||
case XT_CONNMARK_SET:
|
||||
printf(" --set-xmark 0x%x/0x%x", info->ctmark, info->ctmask);
|
||||
break;
|
||||
+ case XT_CONNMARK_SAVEDSCP:
|
||||
+ printf(" --savedscp-mark 0x%x/0x%x", info->ctmark, info->ctmask);
|
||||
+ break;
|
||||
case XT_CONNMARK_SAVE:
|
||||
printf(" --save-mark --nfmask 0x%x --ctmask 0x%x",
|
||||
info->nfmask, info->ctmask);
|
||||
--- a/include/linux/netfilter/xt_connmark.h
|
||||
+++ b/include/linux/netfilter/xt_connmark.h
|
||||
@@ -15,7 +15,8 @@
|
||||
enum {
|
||||
XT_CONNMARK_SET = 0,
|
||||
XT_CONNMARK_SAVE,
|
||||
- XT_CONNMARK_RESTORE
|
||||
+ XT_CONNMARK_RESTORE,
|
||||
+ XT_CONNMARK_SAVEDSCP
|
||||
};
|
||||
|
||||
struct xt_connmark_tginfo1 {
|
||||
@ -0,0 +1,459 @@
|
||||
From 74267bacce0c43e5038b0377cb7c08f1ad9d50a3 Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
|
||||
Date: Sat, 23 Mar 2019 10:21:03 +0000
|
||||
Subject: [PATCH] iptables: connmark - add set-dscpmark option for openwrt
|
||||
|
||||
Naive user space front end to xt_connmark 'setdscp' option.
|
||||
|
||||
iptables -A QOS_MARK_eth0 -t mangle -j CONNMARK --set-dscpmark 0xfc000000/0x01000000
|
||||
|
||||
This version has a hack to support a backport to 4.14
|
||||
|
||||
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
|
||||
---
|
||||
extensions/libxt_CONNMARK.c | 315 +++++++++++++++++++++++++-
|
||||
include/linux/netfilter/xt_connmark.h | 10 +
|
||||
2 files changed, 324 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/extensions/libxt_CONNMARK.c b/extensions/libxt_CONNMARK.c
|
||||
index 21e10913..c777b110 100644
|
||||
--- a/extensions/libxt_CONNMARK.c
|
||||
+++ b/extensions/libxt_CONNMARK.c
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
+#include <strings.h>
|
||||
#include <xtables.h>
|
||||
#include <linux/netfilter/xt_CONNMARK.h>
|
||||
|
||||
@@ -49,6 +50,7 @@ enum {
|
||||
O_CTMASK,
|
||||
O_NFMASK,
|
||||
O_MASK,
|
||||
+ O_DSCP_MARK,
|
||||
F_SET_MARK = 1 << O_SET_MARK,
|
||||
F_SAVE_MARK = 1 << O_SAVE_MARK,
|
||||
F_RESTORE_MARK = 1 << O_RESTORE_MARK,
|
||||
@@ -61,8 +63,10 @@ enum {
|
||||
F_CTMASK = 1 << O_CTMASK,
|
||||
F_NFMASK = 1 << O_NFMASK,
|
||||
F_MASK = 1 << O_MASK,
|
||||
+ F_DSCP_MARK = 1 << O_DSCP_MARK,
|
||||
F_OP_ANY = F_SET_MARK | F_SAVE_MARK | F_RESTORE_MARK |
|
||||
- F_AND_MARK | F_OR_MARK | F_XOR_MARK | F_SET_XMARK,
|
||||
+ F_AND_MARK | F_OR_MARK | F_XOR_MARK | F_SET_XMARK |
|
||||
+ F_DSCP_MARK,
|
||||
};
|
||||
|
||||
static const char *const xt_connmark_shift_ops[] = {
|
||||
@@ -114,6 +118,8 @@ static const struct xt_option_entry connmark_tg_opts[] = {
|
||||
.excl = F_MASK, .flags = XTOPT_PUT, XTOPT_POINTER(s, nfmask)},
|
||||
{.name = "mask", .id = O_MASK, .type = XTTYPE_UINT32,
|
||||
.excl = F_CTMASK | F_NFMASK},
|
||||
+ {.name = "set-dscpmark", .id = O_DSCP_MARK, .type = XTTYPE_MARKMASK32,
|
||||
+ .excl = F_OP_ANY},
|
||||
XTOPT_TABLEEND,
|
||||
};
|
||||
#undef s
|
||||
@@ -148,6 +154,38 @@ static const struct xt_option_entry connmark_tg_opts_v2[] = {
|
||||
};
|
||||
#undef s
|
||||
|
||||
+#define s struct xt_connmark_tginfo3
|
||||
+static const struct xt_option_entry connmark_tg_opts_v3[] = {
|
||||
+ {.name = "set-xmark", .id = O_SET_XMARK, .type = XTTYPE_MARKMASK32,
|
||||
+ .excl = F_OP_ANY},
|
||||
+ {.name = "set-mark", .id = O_SET_MARK, .type = XTTYPE_MARKMASK32,
|
||||
+ .excl = F_OP_ANY},
|
||||
+ {.name = "and-mark", .id = O_AND_MARK, .type = XTTYPE_UINT32,
|
||||
+ .excl = F_OP_ANY},
|
||||
+ {.name = "or-mark", .id = O_OR_MARK, .type = XTTYPE_UINT32,
|
||||
+ .excl = F_OP_ANY},
|
||||
+ {.name = "xor-mark", .id = O_XOR_MARK, .type = XTTYPE_UINT32,
|
||||
+ .excl = F_OP_ANY},
|
||||
+ {.name = "save-mark", .id = O_SAVE_MARK, .type = XTTYPE_NONE,
|
||||
+ .excl = F_OP_ANY},
|
||||
+ {.name = "restore-mark", .id = O_RESTORE_MARK, .type = XTTYPE_NONE,
|
||||
+ .excl = F_OP_ANY},
|
||||
+ {.name = "left-shift-mark", .id = O_LEFT_SHIFT_MARK, .type = XTTYPE_UINT8,
|
||||
+ .min = 0, .max = 32},
|
||||
+ {.name = "right-shift-mark", .id = O_RIGHT_SHIFT_MARK, .type = XTTYPE_UINT8,
|
||||
+ .min = 0, .max = 32},
|
||||
+ {.name = "ctmask", .id = O_CTMASK, .type = XTTYPE_UINT32,
|
||||
+ .excl = F_MASK, .flags = XTOPT_PUT, XTOPT_POINTER(s, ctmask)},
|
||||
+ {.name = "nfmask", .id = O_NFMASK, .type = XTTYPE_UINT32,
|
||||
+ .excl = F_MASK, .flags = XTOPT_PUT, XTOPT_POINTER(s, nfmask)},
|
||||
+ {.name = "mask", .id = O_MASK, .type = XTTYPE_UINT32,
|
||||
+ .excl = F_CTMASK | F_NFMASK},
|
||||
+ {.name = "set-dscpmark", .id = O_DSCP_MARK, .type = XTTYPE_MARKMASK32,
|
||||
+ .excl = F_OP_ANY},
|
||||
+ XTOPT_TABLEEND,
|
||||
+};
|
||||
+#undef s
|
||||
+
|
||||
static void connmark_tg_help(void)
|
||||
{
|
||||
printf(
|
||||
@@ -175,6 +213,15 @@ static void connmark_tg_help_v2(void)
|
||||
);
|
||||
}
|
||||
|
||||
+static void connmark_tg_help_v3(void)
|
||||
+{
|
||||
+ connmark_tg_help_v2();
|
||||
+ printf(
|
||||
+" --set-dscpmark value/mask Save DSCP to conntrack mark value\n"
|
||||
+);
|
||||
+}
|
||||
+
|
||||
+
|
||||
static void connmark_tg_init(struct xt_entry_target *target)
|
||||
{
|
||||
struct xt_connmark_tginfo1 *info = (void *)target->data;
|
||||
@@ -199,6 +246,16 @@ static void connmark_tg_init_v2(struct xt_entry_target *target)
|
||||
info->shift_bits = 0;
|
||||
}
|
||||
|
||||
+static void connmark_tg_init_v3(struct xt_entry_target *target)
|
||||
+{
|
||||
+ struct xt_connmark_tginfo3 *info;
|
||||
+
|
||||
+ connmark_tg_init_v2(target);
|
||||
+ info = (void *)target->data;
|
||||
+
|
||||
+ info->func = 0;
|
||||
+}
|
||||
+
|
||||
static void CONNMARK_parse(struct xt_option_call *cb)
|
||||
{
|
||||
struct xt_connmark_target_info *markinfo = cb->data;
|
||||
@@ -253,6 +310,23 @@ static void connmark_tg_parse(struct xt_option_call *cb)
|
||||
info->ctmark = cb->val.u32;
|
||||
info->ctmask = 0;
|
||||
break;
|
||||
+ case O_DSCP_MARK:
|
||||
+/* we sneaky sneaky this. nfmask isn't used by the set mark functionality
|
||||
+ * and by default is set to uint32max. We can use the top bit as a flag
|
||||
+ * that we're in DSCP_MARK submode of SET_MARK, if set then it's normal
|
||||
+ * if unset then we're in DSCP_MARK
|
||||
+ */
|
||||
+ info->mode = XT_CONNMARK_SET;
|
||||
+ info->ctmark = cb->val.mark;
|
||||
+ info->ctmask = cb->val.mask;
|
||||
+ info->nfmask = info->ctmark ? ffs(info->ctmark) - 1 : 0;
|
||||
+ /* need 6 contiguous bits */
|
||||
+ if ((~0 & (info->ctmark >> info->nfmask)) != 0x3f)
|
||||
+ xtables_error(PARAMETER_PROBLEM,
|
||||
+ "CONNMARK set-dscpmark: need 6 contiguous dscpmask bits");
|
||||
+ if (info->ctmark & info->ctmask)
|
||||
+ xtables_error(PARAMETER_PROBLEM,
|
||||
+ "CONNMARK set-dscpmark: dscpmask/statemask bits overlap");
|
||||
case O_SAVE_MARK:
|
||||
info->mode = XT_CONNMARK_SAVE;
|
||||
break;
|
||||
@@ -320,6 +394,78 @@ static void connmark_tg_parse_v2(struct xt_option_call *cb)
|
||||
}
|
||||
}
|
||||
|
||||
+static void connmark_tg_parse_v3(struct xt_option_call *cb)
|
||||
+{
|
||||
+ struct xt_connmark_tginfo3 *info = cb->data;
|
||||
+
|
||||
+ xtables_option_parse(cb);
|
||||
+ switch (cb->entry->id) {
|
||||
+ case O_SET_XMARK:
|
||||
+ info->mode = XT_CONNMARK_SET;
|
||||
+ info->func = XT_CONNMARK_VALUE;
|
||||
+ info->ctmark = cb->val.mark;
|
||||
+ info->ctmask = cb->val.mask;
|
||||
+ break;
|
||||
+ case O_SET_MARK:
|
||||
+ info->mode = XT_CONNMARK_SET;
|
||||
+ info->func = XT_CONNMARK_VALUE;
|
||||
+ info->ctmark = cb->val.mark;
|
||||
+ info->ctmask = cb->val.mark | cb->val.mask;
|
||||
+ break;
|
||||
+ case O_AND_MARK:
|
||||
+ info->mode = XT_CONNMARK_SET;
|
||||
+ info->func = XT_CONNMARK_VALUE;
|
||||
+ info->ctmark = 0;
|
||||
+ info->ctmask = ~cb->val.u32;
|
||||
+ break;
|
||||
+ case O_OR_MARK:
|
||||
+ info->mode = XT_CONNMARK_SET;
|
||||
+ info->func = XT_CONNMARK_VALUE;
|
||||
+ info->ctmark = cb->val.u32;
|
||||
+ info->ctmask = cb->val.u32;
|
||||
+ break;
|
||||
+ case O_XOR_MARK:
|
||||
+ info->mode = XT_CONNMARK_SET;
|
||||
+ info->func = XT_CONNMARK_VALUE;
|
||||
+ info->ctmark = cb->val.u32;
|
||||
+ info->ctmask = 0;
|
||||
+ break;
|
||||
+ case O_DSCP_MARK:
|
||||
+ info->mode = XT_CONNMARK_SET;
|
||||
+ info->func = XT_CONNMARK_DSCP;
|
||||
+ info->ctmark = cb->val.mark;
|
||||
+ info->ctmask = cb->val.mask;
|
||||
+ info->shift_bits = info->ctmark ? ffs(info->ctmark) - 1 : 0;
|
||||
+ /* need 6 contiguous bits */
|
||||
+ if ((~0 & (info->ctmark >> info->shift_bits)) != 0x3f)
|
||||
+ xtables_error(PARAMETER_PROBLEM,
|
||||
+ "CONNMARK set-dscpmark: need 6 contiguous dscpmask bits");
|
||||
+ if (info->ctmark & info->ctmask)
|
||||
+ xtables_error(PARAMETER_PROBLEM,
|
||||
+ "CONNMARK set-dscpmark: dscpmask/statemask bits overlap");
|
||||
+ break;
|
||||
+ case O_SAVE_MARK:
|
||||
+ info->mode = XT_CONNMARK_SAVE;
|
||||
+ break;
|
||||
+ case O_RESTORE_MARK:
|
||||
+ info->mode = XT_CONNMARK_RESTORE;
|
||||
+ break;
|
||||
+ case O_MASK:
|
||||
+ info->nfmask = info->ctmask = cb->val.u32;
|
||||
+ break;
|
||||
+ case O_LEFT_SHIFT_MARK:
|
||||
+ info->shift_dir = D_SHIFT_LEFT;
|
||||
+ info->shift_bits = cb->val.u8;
|
||||
+ break;
|
||||
+ case O_RIGHT_SHIFT_MARK:
|
||||
+ info->shift_dir = D_SHIFT_RIGHT;
|
||||
+ info->shift_bits = cb->val.u8;
|
||||
+ break;
|
||||
+ default:
|
||||
+ break;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void connmark_tg_check(struct xt_fcheck_call *cb)
|
||||
{
|
||||
if (!(cb->xflags & F_OP_ANY))
|
||||
@@ -463,6 +609,65 @@ connmark_tg_print_v2(const void *ip, const struct xt_entry_target *target,
|
||||
}
|
||||
}
|
||||
|
||||
+static void
|
||||
+connmark_tg_print_v3(const void *ip, const struct xt_entry_target *target,
|
||||
+ int numeric)
|
||||
+{
|
||||
+ const struct xt_connmark_tginfo3 *info = (const void *)target->data;
|
||||
+ const char *shift_op = xt_connmark_shift_ops[info->shift_dir];
|
||||
+
|
||||
+ switch (info->mode) {
|
||||
+ case XT_CONNMARK_SET:
|
||||
+ if (info->func & XT_CONNMARK_DSCP) {
|
||||
+ printf(" CONNMARK DSCP 0x%x/0x%x",
|
||||
+ info->ctmark, info->ctmask);
|
||||
+ }
|
||||
+ if (info->func & XT_CONNMARK_VALUE) {
|
||||
+ if (info->ctmark == 0)
|
||||
+ printf(" CONNMARK and 0x%x",
|
||||
+ (unsigned int)(uint32_t)~info->ctmask);
|
||||
+ else if (info->ctmark == info->ctmask)
|
||||
+ printf(" CONNMARK or 0x%x", info->ctmark);
|
||||
+ else if (info->ctmask == 0)
|
||||
+ printf(" CONNMARK xor 0x%x", info->ctmark);
|
||||
+ else if (info->ctmask == 0xFFFFFFFFU)
|
||||
+ printf(" CONNMARK set 0x%x", info->ctmark);
|
||||
+ else
|
||||
+ printf(" CONNMARK xset 0x%x/0x%x",
|
||||
+ info->ctmark, info->ctmask);
|
||||
+ }
|
||||
+ break;
|
||||
+ case XT_CONNMARK_SAVE:
|
||||
+ if (info->nfmask == UINT32_MAX && info->ctmask == UINT32_MAX)
|
||||
+ printf(" CONNMARK save");
|
||||
+ else if (info->nfmask == info->ctmask)
|
||||
+ printf(" CONNMARK save mask 0x%x", info->nfmask);
|
||||
+ else
|
||||
+ printf(" CONNMARK save nfmask 0x%x ctmask ~0x%x",
|
||||
+ info->nfmask, info->ctmask);
|
||||
+ break;
|
||||
+ case XT_CONNMARK_RESTORE:
|
||||
+ if (info->ctmask == UINT32_MAX && info->nfmask == UINT32_MAX)
|
||||
+ printf(" CONNMARK restore");
|
||||
+ else if (info->ctmask == info->nfmask)
|
||||
+ printf(" CONNMARK restore mask 0x%x", info->ctmask);
|
||||
+ else
|
||||
+ printf(" CONNMARK restore ctmask 0x%x nfmask ~0x%x",
|
||||
+ info->ctmask, info->nfmask);
|
||||
+ break;
|
||||
+
|
||||
+ default:
|
||||
+ printf(" ERROR: UNKNOWN CONNMARK MODE");
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ if (info->mode <= XT_CONNMARK_RESTORE &&
|
||||
+ !(info->mode == XT_CONNMARK_SET && info->func == XT_CONNMARK_DSCP) &&
|
||||
+ info->shift_bits != 0) {
|
||||
+ printf(" %s %u", shift_op, info->shift_bits);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void CONNMARK_save(const void *ip, const struct xt_entry_target *target)
|
||||
{
|
||||
const struct xt_connmark_target_info *markinfo =
|
||||
@@ -548,6 +753,38 @@ connmark_tg_save_v2(const void *ip, const struct xt_entry_target *target)
|
||||
}
|
||||
}
|
||||
|
||||
+static void
|
||||
+connmark_tg_save_v3(const void *ip, const struct xt_entry_target *target)
|
||||
+{
|
||||
+ const struct xt_connmark_tginfo3 *info = (const void *)target->data;
|
||||
+ const char *shift_op = xt_connmark_shift_ops[info->shift_dir];
|
||||
+
|
||||
+ switch (info->mode) {
|
||||
+ case XT_CONNMARK_SET:
|
||||
+ if (info->func & XT_CONNMARK_VALUE)
|
||||
+ printf(" --set-xmark 0x%x/0x%x", info->ctmark, info->ctmask);
|
||||
+ if (info->func & XT_CONNMARK_DSCP)
|
||||
+ printf(" --set-dscpmark 0x%x/0x%x", info->ctmark, info->ctmask);
|
||||
+ break;
|
||||
+ case XT_CONNMARK_SAVE:
|
||||
+ printf(" --save-mark --nfmask 0x%x --ctmask 0x%x",
|
||||
+ info->nfmask, info->ctmask);
|
||||
+ break;
|
||||
+ case XT_CONNMARK_RESTORE:
|
||||
+ printf(" --restore-mark --nfmask 0x%x --ctmask 0x%x",
|
||||
+ info->nfmask, info->ctmask);
|
||||
+ break;
|
||||
+ default:
|
||||
+ printf(" ERROR: UNKNOWN CONNMARK MODE");
|
||||
+ break;
|
||||
+ }
|
||||
+ if (info->mode <= XT_CONNMARK_RESTORE &&
|
||||
+ !(info->mode == XT_CONNMARK_SET && info->func == XT_CONNMARK_DSCP) &&
|
||||
+ info->shift_bits != 0) {
|
||||
+ printf(" --%s %u", shift_op, info->shift_bits);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static int connmark_tg_xlate(struct xt_xlate *xl,
|
||||
const struct xt_xlate_tg_params *params)
|
||||
{
|
||||
@@ -639,6 +876,66 @@ static int connmark_tg_xlate_v2(struct xt_xlate *xl,
|
||||
|
||||
return 1;
|
||||
}
|
||||
+
|
||||
+static int connmark_tg_xlate_v3(struct xt_xlate *xl,
|
||||
+ const struct xt_xlate_tg_params *params)
|
||||
+{
|
||||
+ const struct xt_connmark_tginfo3 *info =
|
||||
+ (const void *)params->target->data;
|
||||
+ const char *shift_op = xt_connmark_shift_ops[info->shift_dir];
|
||||
+
|
||||
+ switch (info->mode) {
|
||||
+ case XT_CONNMARK_SET:
|
||||
+ xt_xlate_add(xl, "ct mark set ");
|
||||
+ if (info->func & XT_CONNMARK_VALUE) {
|
||||
+ if (info->ctmask == 0xFFFFFFFFU)
|
||||
+ xt_xlate_add(xl, "0x%x ", info->ctmark);
|
||||
+ else if (info->ctmark == 0)
|
||||
+ xt_xlate_add(xl, "ct mark and 0x%x", ~info->ctmask);
|
||||
+ else if (info->ctmark == info->ctmask)
|
||||
+ xt_xlate_add(xl, "ct mark or 0x%x",
|
||||
+ info->ctmark);
|
||||
+ else if (info->ctmask == 0)
|
||||
+ xt_xlate_add(xl, "ct mark xor 0x%x",
|
||||
+ info->ctmark);
|
||||
+ else
|
||||
+ xt_xlate_add(xl, "ct mark xor 0x%x and 0x%x",
|
||||
+ info->ctmark, ~info->ctmask);
|
||||
+ }
|
||||
+ if (info->func & XT_CONNMARK_DSCP) {
|
||||
+/* FIXME the nftables syntax would go here if only we knew what it was */
|
||||
+ xt_xlate_add(xl, "ct mark set typeof(ct mark) ip dscp "
|
||||
+ "<< %u or 0x%x", info->shift_bits,
|
||||
+ info->ctmask);
|
||||
+ }
|
||||
+ break;
|
||||
+ case XT_CONNMARK_SAVE:
|
||||
+ xt_xlate_add(xl, "ct mark set mark");
|
||||
+ if (!(info->nfmask == UINT32_MAX &&
|
||||
+ info->ctmask == UINT32_MAX)) {
|
||||
+ if (info->nfmask == info->ctmask)
|
||||
+ xt_xlate_add(xl, " and 0x%x", info->nfmask);
|
||||
+ }
|
||||
+ break;
|
||||
+ case XT_CONNMARK_RESTORE:
|
||||
+ xt_xlate_add(xl, "meta mark set ct mark");
|
||||
+ if (!(info->nfmask == UINT32_MAX &&
|
||||
+ info->ctmask == UINT32_MAX)) {
|
||||
+ if (info->nfmask == info->ctmask)
|
||||
+ xt_xlate_add(xl, " and 0x%x", info->nfmask);
|
||||
+ }
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ if (info->mode <= XT_CONNMARK_RESTORE &&
|
||||
+ !(info->mode == XT_CONNMARK_SET && info->func == XT_CONNMARK_DSCP) &&
|
||||
+ info->shift_bits != 0) {
|
||||
+ xt_xlate_add(xl, " %s %u", shift_op, info->shift_bits);
|
||||
+ }
|
||||
+
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
static struct xtables_target connmark_tg_reg[] = {
|
||||
{
|
||||
.family = NFPROTO_UNSPEC,
|
||||
@@ -687,6 +984,22 @@ static struct xtables_target connmark_tg_reg[] = {
|
||||
.x6_options = connmark_tg_opts_v2,
|
||||
.xlate = connmark_tg_xlate_v2,
|
||||
},
|
||||
+ {
|
||||
+ .version = XTABLES_VERSION,
|
||||
+ .name = "CONNMARK",
|
||||
+ .revision = 3,
|
||||
+ .family = NFPROTO_UNSPEC,
|
||||
+ .size = XT_ALIGN(sizeof(struct xt_connmark_tginfo3)),
|
||||
+ .userspacesize = XT_ALIGN(sizeof(struct xt_connmark_tginfo3)),
|
||||
+ .help = connmark_tg_help_v3,
|
||||
+ .init = connmark_tg_init_v3,
|
||||
+ .print = connmark_tg_print_v3,
|
||||
+ .save = connmark_tg_save_v3,
|
||||
+ .x6_parse = connmark_tg_parse_v3,
|
||||
+ .x6_fcheck = connmark_tg_check,
|
||||
+ .x6_options = connmark_tg_opts_v3,
|
||||
+ .xlate = connmark_tg_xlate_v3,
|
||||
+ },
|
||||
};
|
||||
|
||||
void _init(void)
|
||||
diff --git a/include/linux/netfilter/xt_connmark.h b/include/linux/netfilter/xt_connmark.h
|
||||
index bbf2acc9..1d8e721c 100644
|
||||
--- a/include/linux/netfilter/xt_connmark.h
|
||||
+++ b/include/linux/netfilter/xt_connmark.h
|
||||
@@ -18,6 +18,11 @@ enum {
|
||||
XT_CONNMARK_RESTORE
|
||||
};
|
||||
|
||||
+enum {
|
||||
+ XT_CONNMARK_VALUE = (1 << 0),
|
||||
+ XT_CONNMARK_DSCP = (1 << 1)
|
||||
+};
|
||||
+
|
||||
struct xt_connmark_tginfo1 {
|
||||
__u32 ctmark, ctmask, nfmask;
|
||||
__u8 mode;
|
||||
@@ -28,6 +33,11 @@ struct xt_connmark_tginfo2 {
|
||||
__u8 shift_dir, shift_bits, mode;
|
||||
};
|
||||
|
||||
+struct xt_connmark_tginfo3 {
|
||||
+ __u32 ctmark, ctmask, nfmask;
|
||||
+ __u8 shift_dir, shift_bits, mode, func;
|
||||
+};
|
||||
+
|
||||
struct xt_connmark_mtinfo1 {
|
||||
__u32 mark, mask;
|
||||
__u8 invert;
|
||||
--
|
||||
2.21.0 (Apple Git-122.2)
|
||||
|
||||
@ -0,0 +1,9 @@
|
||||
Index: libiwinfo-2020-01-05-bf2c1069/hardware.txt
|
||||
===================================================================
|
||||
--- libiwinfo-2020-01-05-bf2c1069.orig/hardware.txt
|
||||
+++ libiwinfo-2020-01-05-bf2c1069/hardware.txt
|
||||
@@ -180,3 +180,4 @@
|
||||
0x14c3 0x7650 0x14c3 0x7650 0 0 "MediaTek" "MT7610E"
|
||||
0x14c3 0x7662 0x14c3 0x7662 0 0 "MediaTek" "MT76x2E"
|
||||
0x1ae9 0x0310 0x1ae9 0x0000 0 0 "Wilocity" "Wil6210"
|
||||
+0x14e4 0xaa52 0x14e4 0xaa52 0 0 "Broadcom" "BRCM43602"
|
||||
@ -12,9 +12,9 @@ PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL=$(PROJECT_GIT)/project/procd.git
|
||||
PKG_SOURCE_DATE:=2020-01-24
|
||||
PKG_SOURCE_DATE:=2020-02-04
|
||||
PKG_SOURCE_VERSION:=00aafc4f439ec3ace834c1a803b899bd1ceba9db
|
||||
PKG_MIRROR_HASH:=0d5abe409f8dd5979fa753c2f9999c0434a4b465079fcdd861494814992f1980
|
||||
PKG_MIRROR_HASH:=a435449aed225a0394455d627b1ac5ca8bcf27d38238869bad5220a672012688
|
||||
CMAKE_INSTALL:=1
|
||||
|
||||
PKG_LICENSE:=GPL-2.0
|
||||
|
||||
@ -194,6 +194,7 @@ _procd_add_jail() {
|
||||
procfs) json_add_boolean "procfs" "1";;
|
||||
sysfs) json_add_boolean "sysfs" "1";;
|
||||
ronly) json_add_boolean "ronly" "1";;
|
||||
requirejail) json_add_boolean "requirejail" "1";;
|
||||
esac
|
||||
done
|
||||
json_add_object "mount"
|
||||
|
||||
@ -11,12 +11,11 @@ include $(TOPDIR)/rules.mk
|
||||
PKG_NAME:=uci
|
||||
PKG_RELEASE:=3
|
||||
|
||||
#PKG_SOURCE_URL=$(PROJECT_GIT)/project/uci.git
|
||||
PKG_SOURCE_URL=https://gitlab.com/ynezz/openwrt-uci.git
|
||||
PKG_SOURCE_URL=$(PROJECT_GIT)/project/uci.git
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_DATE=2019-12-12
|
||||
PKG_SOURCE_VERSION:=165b444131453d63fc78c1d86f23c3ca36a2ffd7
|
||||
PKG_MIRROR_HASH:=d4baa6454523ee11ecbfc49188e949a76c07deebf4d048049847b3d1d5e5e40c
|
||||
PKG_SOURCE_DATE=2020-01-27
|
||||
PKG_SOURCE_VERSION:=e8d83732f9
|
||||
PKG_MIRROR_HASH:=f39f82b71bc1072e4bcadaeb392d51055b2be72c41744bb97897a3ac63ce0805
|
||||
|
||||
PKG_LICENSE:=LGPL-2.1
|
||||
PKG_LICENSE_FILES:=
|
||||
|
||||
@ -1,39 +0,0 @@
|
||||
From 6e88098ca43a3d80ae86908f7badba683c8a0d84 Mon Sep 17 00:00:00 2001
|
||||
From: Corentin Labbe <clabbe@baylibre.com>
|
||||
Date: Wed, 23 Jan 2019 11:24:18 +0000
|
||||
Subject: [PATCH 07/15] crypto: crypto4xx - Fix wrong
|
||||
ppc4xx_trng_probe()/ppc4xx_trng_remove() arguments
|
||||
|
||||
When building without CONFIG_HW_RANDOM_PPC4XX, I hit the following build failure:
|
||||
drivers/crypto/amcc/crypto4xx_core.c: In function 'crypto4xx_probe':
|
||||
drivers/crypto/amcc/crypto4xx_core.c:1407:20: error: passing argument 1 of 'ppc4xx_trng_probe' from incompatible pointer type [-Werror=incompatible-pointer-types]
|
||||
In file included from drivers/crypto/amcc/crypto4xx_core.c:50:0:
|
||||
drivers/crypto/amcc/crypto4xx_trng.h:28:20: note: expected 'struct crypto4xx_device *' but argument is of type 'struct crypto4xx_core_device *'
|
||||
drivers/crypto/amcc/crypto4xx_core.c: In function 'crypto4xx_remove':
|
||||
drivers/crypto/amcc/crypto4xx_core.c:1434:21: error: passing argument 1 of 'ppc4xx_trng_remove' from incompatible pointer type [-Werror=incompatible-pointer-types]
|
||||
In file included from drivers/crypto/amcc/crypto4xx_core.c:50:0:
|
||||
drivers/crypto/amcc/crypto4xx_trng.h:30:20: note: expected 'struct crypto4xx_device *' but argument is of type 'struct crypto4xx_core_device *'
|
||||
|
||||
This patch fix the needed argument of ppc4xx_trng_probe()/ppc4xx_trng_remove() in that case.
|
||||
|
||||
Fixes: 5343e674f32f ("crypto4xx: integrate ppc4xx-rng into crypto4xx")
|
||||
Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
|
||||
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
---
|
||||
drivers/crypto/amcc/crypto4xx_trng.h | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/crypto/amcc/crypto4xx_trng.h
|
||||
+++ b/drivers/crypto/amcc/crypto4xx_trng.h
|
||||
@@ -26,9 +26,9 @@ void ppc4xx_trng_probe(struct crypto4xx_
|
||||
void ppc4xx_trng_remove(struct crypto4xx_core_device *core_dev);
|
||||
#else
|
||||
static inline void ppc4xx_trng_probe(
|
||||
- struct crypto4xx_device *dev __maybe_unused) { }
|
||||
+ struct crypto4xx_core_device *dev __maybe_unused) { }
|
||||
static inline void ppc4xx_trng_remove(
|
||||
- struct crypto4xx_device *dev __maybe_unused) { }
|
||||
+ struct crypto4xx_core_device *dev __maybe_unused) { }
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@ -1,39 +0,0 @@
|
||||
From 6e88098ca43a3d80ae86908f7badba683c8a0d84 Mon Sep 17 00:00:00 2001
|
||||
From: Corentin Labbe <clabbe@baylibre.com>
|
||||
Date: Wed, 23 Jan 2019 11:24:18 +0000
|
||||
Subject: [PATCH 07/15] crypto: crypto4xx - Fix wrong
|
||||
ppc4xx_trng_probe()/ppc4xx_trng_remove() arguments
|
||||
|
||||
When building without CONFIG_HW_RANDOM_PPC4XX, I hit the following build failure:
|
||||
drivers/crypto/amcc/crypto4xx_core.c: In function 'crypto4xx_probe':
|
||||
drivers/crypto/amcc/crypto4xx_core.c:1407:20: error: passing argument 1 of 'ppc4xx_trng_probe' from incompatible pointer type [-Werror=incompatible-pointer-types]
|
||||
In file included from drivers/crypto/amcc/crypto4xx_core.c:50:0:
|
||||
drivers/crypto/amcc/crypto4xx_trng.h:28:20: note: expected 'struct crypto4xx_device *' but argument is of type 'struct crypto4xx_core_device *'
|
||||
drivers/crypto/amcc/crypto4xx_core.c: In function 'crypto4xx_remove':
|
||||
drivers/crypto/amcc/crypto4xx_core.c:1434:21: error: passing argument 1 of 'ppc4xx_trng_remove' from incompatible pointer type [-Werror=incompatible-pointer-types]
|
||||
In file included from drivers/crypto/amcc/crypto4xx_core.c:50:0:
|
||||
drivers/crypto/amcc/crypto4xx_trng.h:30:20: note: expected 'struct crypto4xx_device *' but argument is of type 'struct crypto4xx_core_device *'
|
||||
|
||||
This patch fix the needed argument of ppc4xx_trng_probe()/ppc4xx_trng_remove() in that case.
|
||||
|
||||
Fixes: 5343e674f32f ("crypto4xx: integrate ppc4xx-rng into crypto4xx")
|
||||
Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
|
||||
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
---
|
||||
drivers/crypto/amcc/crypto4xx_trng.h | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/crypto/amcc/crypto4xx_trng.h
|
||||
+++ b/drivers/crypto/amcc/crypto4xx_trng.h
|
||||
@@ -26,9 +26,9 @@ void ppc4xx_trng_probe(struct crypto4xx_
|
||||
void ppc4xx_trng_remove(struct crypto4xx_core_device *core_dev);
|
||||
#else
|
||||
static inline void ppc4xx_trng_probe(
|
||||
- struct crypto4xx_device *dev __maybe_unused) { }
|
||||
+ struct crypto4xx_core_device *dev __maybe_unused) { }
|
||||
static inline void ppc4xx_trng_remove(
|
||||
- struct crypto4xx_device *dev __maybe_unused) { }
|
||||
+ struct crypto4xx_core_device *dev __maybe_unused) { }
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@ -211,6 +211,7 @@ CONFIG_SERIAL_AR933X_CONSOLE=y
|
||||
CONFIG_SERIAL_AR933X_NR_UARTS=2
|
||||
CONFIG_SERIAL_OF_PLATFORM=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_AR934X=y
|
||||
CONFIG_SPI_ATH79=y
|
||||
CONFIG_SPI_BITBANG=y
|
||||
CONFIG_SPI_GPIO=y
|
||||
|
||||
@ -4,8 +4,8 @@
|
||||
#include "ar7161_netgear_wndr3700.dtsi"
|
||||
|
||||
/ {
|
||||
compatible = "netgear,wndr3700v2", "qca,ar7161";
|
||||
model = "Netgear WNDR3700v2";
|
||||
compatible = "netgear,wndr3700-v2", "qca,ar7161";
|
||||
model = "Netgear WNDR3700 v2";
|
||||
};
|
||||
|
||||
&partitions {
|
||||
@ -18,7 +18,6 @@
|
||||
partition@50000 {
|
||||
label = "u-boot-env";
|
||||
reg = <0x050000 0x020000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@70000 {
|
||||
@ -18,7 +18,6 @@
|
||||
partition@50000 {
|
||||
label = "u-boot-env";
|
||||
reg = <0x050000 0x020000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@70000 {
|
||||
|
||||
@ -119,11 +119,10 @@
|
||||
};
|
||||
|
||||
spi: spi@1f000000 {
|
||||
compatible = "qca,ar7100-spi";
|
||||
reg = <0x1f000000 0x10>;
|
||||
compatible = "qca,ar934x-spi";
|
||||
reg = <0x1f000000 0x1c>;
|
||||
|
||||
clocks = <&pll ATH79_CLK_AHB>;
|
||||
clock-names = "ahb";
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
@ -110,7 +110,6 @@
|
||||
status = "okay";
|
||||
|
||||
num-cs = <2>;
|
||||
cs-gpios= <0>, <0>;
|
||||
|
||||
flash@0 {
|
||||
#address-cells = <1>;
|
||||
|
||||
@ -133,6 +133,19 @@
|
||||
|
||||
#reset-cells = <1>;
|
||||
};
|
||||
|
||||
hs_uart: uart@18500000 {
|
||||
compatible = "qca,ar9330-uart";
|
||||
reg = <0x18500000 0x14>;
|
||||
|
||||
interrupts = <6>;
|
||||
interrupt-parent = <&miscintc>;
|
||||
|
||||
clocks = <&pll ATH79_CLK_UART1>;
|
||||
clock-names = "uart";
|
||||
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
||||
nand: nand@1b000200 {
|
||||
@ -183,11 +196,10 @@
|
||||
};
|
||||
|
||||
spi: spi@1f000000 {
|
||||
compatible = "qca,ar9340-spi", "qca,ar7100-spi";
|
||||
compatible = "qca,ar934x-spi";
|
||||
reg = <0x1f000000 0x1c>;
|
||||
|
||||
clocks = <&pll ATH79_CLK_AHB>;
|
||||
clock-names = "ahb";
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
174
target/linux/ath79/dts/qca9531_comfast_cf-e560ac.dts
Normal file
174
target/linux/ath79/dts/qca9531_comfast_cf-e560ac.dts
Normal file
@ -0,0 +1,174 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
|
||||
/dts-v1/;
|
||||
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/input/input.h>
|
||||
|
||||
#include "qca953x.dtsi"
|
||||
|
||||
/ {
|
||||
compatible = "comfast,cf-e560ac", "qca,qca9531";
|
||||
model = "COMFAST CF-E560AC";
|
||||
|
||||
aliases {
|
||||
serial0 = &uart;
|
||||
label-mac-device = ð1;
|
||||
led-boot = &led_system;
|
||||
led-failsafe = &led_system;
|
||||
led-upgrade = &led_system;
|
||||
};
|
||||
|
||||
keys {
|
||||
compatible = "gpio-keys";
|
||||
|
||||
reset {
|
||||
label = "reset";
|
||||
linux,code = <KEY_RESTART>;
|
||||
gpios = <&gpio 17 GPIO_ACTIVE_LOW>;
|
||||
debounce-interval = <60>;
|
||||
};
|
||||
};
|
||||
|
||||
leds {
|
||||
compatible = "gpio-leds";
|
||||
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&jtag_disable_pins>;
|
||||
|
||||
lan1 {
|
||||
label = "cf-e560ac:blue:lan1";
|
||||
gpios = <&gpio 16 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
lan2 {
|
||||
label = "cf-e560ac:blue:lan2";
|
||||
gpios = <&gpio 15 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
lan3 {
|
||||
label = "cf-e560ac:blue:lan3";
|
||||
gpios = <&gpio 14 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
lan4 {
|
||||
label = "cf-e560ac:blue:lan4";
|
||||
gpios = <&gpio 11 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
led_system: system {
|
||||
label = "cf-e560ac:blue:system";
|
||||
gpios = <&gpio 3 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
wan {
|
||||
label = "cf-e560ac:blue:wan";
|
||||
gpios = <&gpio 4 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
wlan {
|
||||
label = "cf-e560ac:blue:wlan";
|
||||
gpios = <&gpio 0 GPIO_ACTIVE_LOW>;
|
||||
linux,default-trigger = "phy0tpt";
|
||||
};
|
||||
};
|
||||
|
||||
watchdog {
|
||||
compatible = "linux,wdt-gpio";
|
||||
gpios = <&gpio 13 GPIO_ACTIVE_LOW>;
|
||||
hw_algo = "toggle";
|
||||
hw_margin_ms = <1200>;
|
||||
always-running;
|
||||
};
|
||||
};
|
||||
|
||||
&spi {
|
||||
status = "okay";
|
||||
|
||||
num-cs = <1>;
|
||||
|
||||
flash@0 {
|
||||
compatible = "jedec,spi-nor";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <25000000>;
|
||||
|
||||
partitions {
|
||||
compatible = "fixed-partitions";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
partition@0 {
|
||||
label = "u-boot";
|
||||
reg = <0x000000 0x010000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
art: partition@10000 {
|
||||
label = "art";
|
||||
reg = <0x010000 0x010000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@20000 {
|
||||
compatible = "denx,uimage";
|
||||
label = "firmware";
|
||||
reg = <0x020000 0xfc0000>;
|
||||
};
|
||||
|
||||
partition@fe0000 {
|
||||
label = "configs";
|
||||
reg = <0xfe0000 0x010000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@ff0000 {
|
||||
label = "nvram";
|
||||
reg = <0xff0000 0x010000>;
|
||||
read-only;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&pcie0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&uart {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&usb_phy {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&usb0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "okay";
|
||||
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
#trigger-source-cells = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
ð0 {
|
||||
status = "okay";
|
||||
|
||||
phy-handle = <&swphy4>;
|
||||
|
||||
mtd-mac-address = <&art 0x0>;
|
||||
mtd-mac-address-increment = <1>;
|
||||
};
|
||||
|
||||
ð1 {
|
||||
mtd-mac-address = <&art 0x0>;
|
||||
};
|
||||
|
||||
&wmac {
|
||||
status = "okay";
|
||||
|
||||
mtd-cal-data = <&art 0x1000>;
|
||||
mtd-mac-address = <&art 0x0>;
|
||||
mtd-mac-address-increment = <10>;
|
||||
};
|
||||
@ -76,7 +76,6 @@
|
||||
status = "okay";
|
||||
|
||||
num-cs = <2>;
|
||||
cs-gpios = <0>, <0>;
|
||||
|
||||
flash@0 {
|
||||
compatible = "jedec,spi-nor";
|
||||
|
||||
@ -201,11 +201,10 @@
|
||||
};
|
||||
|
||||
spi: spi@1f000000 {
|
||||
compatible = "qca,ar9530-spi", "qca,ar7100-spi";
|
||||
reg = <0x1f000000 0x10>;
|
||||
compatible = "qca,ar934x-spi";
|
||||
reg = <0x1f000000 0x1c>;
|
||||
|
||||
clocks = <&pll ATH79_CLK_AHB>;
|
||||
clock-names = "ahb";
|
||||
|
||||
status = "disabled";
|
||||
|
||||
|
||||
@ -292,11 +292,10 @@
|
||||
};
|
||||
|
||||
spi: spi@1f000000 {
|
||||
compatible = "qca,ar9557-spi", "qca,ar7100-spi";
|
||||
reg = <0x1f000000 0x10>;
|
||||
compatible = "qca,ar934x-spi";
|
||||
reg = <0x1f000000 0x1c>;
|
||||
|
||||
clocks = <&pll ATH79_CLK_AHB>;
|
||||
clock-names = "ahb";
|
||||
|
||||
status = "disabled";
|
||||
|
||||
|
||||
@ -75,7 +75,6 @@
|
||||
status = "okay";
|
||||
|
||||
num-cs = <2>;
|
||||
cs-gpios = <0>, <0>;
|
||||
|
||||
flash_nor: flash@0 {
|
||||
compatible = "jedec,spi-nor";
|
||||
|
||||
@ -100,7 +100,6 @@
|
||||
status = "okay";
|
||||
|
||||
num-cs = <2>;
|
||||
cs-gpios = <0>, <0>;
|
||||
|
||||
flash@0 {
|
||||
compatible = "jedec,spi-nor";
|
||||
|
||||
@ -215,11 +215,10 @@
|
||||
};
|
||||
|
||||
spi: spi@1f000000 {
|
||||
compatible = "qca,qca9560-spi", "qca,ar7100-spi";
|
||||
reg = <0x1f000000 0x10>;
|
||||
compatible = "qca,ar934x-spi";
|
||||
reg = <0x1f000000 0x1c>;
|
||||
|
||||
clocks = <&pll ATH79_CLK_AHB>;
|
||||
clock-names = "ahb";
|
||||
|
||||
status = "disabled";
|
||||
|
||||
|
||||
@ -1214,14 +1214,22 @@ static int ag71xx_rx_packets(struct ag71xx *ag, int limit)
|
||||
unsigned int offset = ag->rx_buf_offset;
|
||||
int ring_mask = BIT(ring->order) - 1;
|
||||
int ring_size = BIT(ring->order);
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,19,0))
|
||||
struct list_head rx_list;
|
||||
struct sk_buff *next;
|
||||
#else
|
||||
struct sk_buff_head queue;
|
||||
#endif
|
||||
struct sk_buff *skb;
|
||||
int done = 0;
|
||||
|
||||
DBG("%s: rx packets, limit=%d, curr=%u, dirty=%u\n",
|
||||
dev->name, limit, ring->curr, ring->dirty);
|
||||
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,19,0))
|
||||
INIT_LIST_HEAD(&rx_list);
|
||||
#else
|
||||
skb_queue_head_init(&queue);
|
||||
#endif
|
||||
|
||||
while (done < limit) {
|
||||
unsigned int i = ring->curr & ring_mask;
|
||||
@ -1263,7 +1271,11 @@ static int ag71xx_rx_packets(struct ag71xx *ag, int limit)
|
||||
} else {
|
||||
skb->dev = dev;
|
||||
skb->ip_summed = CHECKSUM_NONE;
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,19,0))
|
||||
list_add_tail(&skb->list, &rx_list);
|
||||
#else
|
||||
__skb_queue_tail(&queue, skb);
|
||||
#endif
|
||||
}
|
||||
|
||||
next:
|
||||
@ -1275,10 +1287,16 @@ next:
|
||||
|
||||
ag71xx_ring_rx_refill(ag);
|
||||
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,19,0))
|
||||
list_for_each_entry_safe(skb, next, &rx_list, list)
|
||||
skb->protocol = eth_type_trans(skb, dev);
|
||||
netif_receive_skb_list(&rx_list);
|
||||
#else
|
||||
while ((skb = __skb_dequeue(&queue)) != NULL) {
|
||||
skb->protocol = eth_type_trans(skb, dev);
|
||||
netif_receive_skb(skb);
|
||||
}
|
||||
#endif
|
||||
|
||||
DBG("%s: rx finish, curr=%u, dirty=%u, done=%d\n",
|
||||
dev->name, ring->curr, ring->dirty, done);
|
||||
|
||||
@ -73,6 +73,13 @@ comfast,cf-e5)
|
||||
ucidef_set_led_rssi "rssimedium" "RSSIMEDIUM" "$boardname:blue:rssi1" "wlan0" "33" "100"
|
||||
ucidef_set_led_rssi "rssihigh" "RSSIHIGH" "$boardname:blue:rssi2" "wlan0" "66" "100"
|
||||
;;
|
||||
comfast,cf-e560ac)
|
||||
ucidef_set_led_netdev "wan" "WAN" "$boardname:blue:wan" "eth1"
|
||||
ucidef_set_led_switch "lan1" "LAN1" "$boardname:blue:lan1" "switch0" "0x02"
|
||||
ucidef_set_led_switch "lan2" "LAN2" "$boardname:blue:lan2" "switch0" "0x04"
|
||||
ucidef_set_led_switch "lan3" "LAN3" "$boardname:blue:lan3" "switch0" "0x08"
|
||||
ucidef_set_led_switch "lan4" "LAN4" "$boardname:blue:lan4" "switch0" "0x10"
|
||||
;;
|
||||
dlink,dir-842-c1|\
|
||||
dlink,dir-842-c2|\
|
||||
dlink,dir-842-c3|\
|
||||
@ -212,6 +219,7 @@ tplink,cpe510-v3)
|
||||
tplink,cpe610-v1|\
|
||||
tplink,tl-wr902ac-v1)
|
||||
ucidef_set_led_netdev "lan" "LAN" "tp-link:green:lan" "eth0"
|
||||
ucidef_set_led_netdev "internet" "Internet" "tp-link:green:internet" "eth0"
|
||||
;;
|
||||
tplink,re355-v1|\
|
||||
tplink,re450-v1|\
|
||||
|
||||
@ -103,6 +103,13 @@ ath79_setup_interfaces()
|
||||
ubnt,routerstation)
|
||||
ucidef_set_interfaces_lan_wan "eth1" "eth0"
|
||||
;;
|
||||
comfast,cf-e560ac|\
|
||||
tplink,archer-c60-v1|\
|
||||
tplink,archer-c60-v2)
|
||||
ucidef_set_interface_wan "eth1"
|
||||
ucidef_add_switch "switch0" \
|
||||
"0@eth0" "1:lan" "2:lan" "3:lan" "4:lan"
|
||||
;;
|
||||
comfast,cf-wr650ac-v1|\
|
||||
comfast,cf-wr650ac-v2)
|
||||
ucidef_add_switch "switch0" \
|
||||
@ -180,7 +187,7 @@ ath79_setup_interfaces()
|
||||
"0@eth0" "2:lan" "3:lan" "4:lan" "1:wan"
|
||||
;;
|
||||
netgear,wndr3700|\
|
||||
netgear,wndr3700v2|\
|
||||
netgear,wndr3700-v2|\
|
||||
netgear,wndr3800|\
|
||||
netgear,wndr3800ch)
|
||||
ucidef_set_interface_wan "eth1"
|
||||
@ -228,12 +235,6 @@ ath79_setup_interfaces()
|
||||
ucidef_add_switch "switch0" \
|
||||
"0@eth1" "2:lan" "3:lan" "4:lan" "5:lan" "6@eth0" "1:wan"
|
||||
;;
|
||||
tplink,archer-c60-v1|\
|
||||
tplink,archer-c60-v2)
|
||||
ucidef_set_interface_wan "eth1"
|
||||
ucidef_add_switch "switch0" \
|
||||
"0@eth0" "1:lan" "2:lan" "3:lan" "4:lan"
|
||||
;;
|
||||
tplink,archer-d50-v1)
|
||||
ucidef_add_switch "switch0" \
|
||||
"0@eth0" "2:lan:3" "3:lan:2" "4:lan:1" "1:wan"
|
||||
@ -386,7 +387,7 @@ ath79_setup_macs()
|
||||
label_mac=$wan_mac
|
||||
;;
|
||||
netgear,wndr3700|\
|
||||
netgear,wndr3700v2|\
|
||||
netgear,wndr3700-v2|\
|
||||
netgear,wndr3800)
|
||||
lan_mac=$(macaddr_setbit_la "$(mtd_get_mac_binary art 0x0)")
|
||||
;;
|
||||
|
||||
@ -114,7 +114,7 @@ case "$FIRMWARE" in
|
||||
case $board in
|
||||
buffalo,wzr-hp-ag300h|\
|
||||
netgear,wndr3700|\
|
||||
netgear,wndr3700v2|\
|
||||
netgear,wndr3700-v2|\
|
||||
netgear,wndr3800|\
|
||||
netgear,wndr3800ch)
|
||||
caldata_extract "art" 0x1000 0xeb8
|
||||
@ -132,7 +132,7 @@ case "$FIRMWARE" in
|
||||
case $board in
|
||||
buffalo,wzr-hp-ag300h|\
|
||||
netgear,wndr3700|\
|
||||
netgear,wndr3700v2|\
|
||||
netgear,wndr3700-v2|\
|
||||
netgear,wndr3800|\
|
||||
netgear,wndr3800ch)
|
||||
caldata_extract "art" 0x5000 0xeb8
|
||||
|
||||
@ -130,6 +130,13 @@ case "$FIRMWARE" in
|
||||
/lib/firmware/ath10k/QCA9888/hw2.0/board.bin
|
||||
rm /lib/firmware/ath10k/QCA9888/hw2.0/board-2.bin
|
||||
;;
|
||||
comfast,cf-e560ac)
|
||||
caldata_extract "art" 0x5000 0x2f20
|
||||
ath10k_patch_mac $(macaddr_add $(mtd_get_mac_binary art 0x0) +2)
|
||||
ln -sf /lib/firmware/ath10k/pre-cal-pci-0000\:00\:00.0.bin \
|
||||
/lib/firmware/ath10k/QCA9888/hw2.0/board.bin
|
||||
rm /lib/firmware/ath10k/QCA9888/hw2.0/board-2.bin
|
||||
;;
|
||||
dlink,dir-842-c1|\
|
||||
dlink,dir-842-c2|\
|
||||
dlink,dir-842-c3|\
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
DEVICE_VARS += TPLINK_HWID TPLINK_HWREV TPLINK_FLASHLAYOUT TPLINK_HEADER_VERSION
|
||||
DEVICE_VARS += TPLINK_BOARD_ID
|
||||
DEVICE_VARS += TPLINK_BOARD_ID TPLINK_HWREVADD TPLINK_HVERSION
|
||||
|
||||
define Build/uImageArcher
|
||||
mkimage -A $(LINUX_KARCH) \
|
||||
@ -9,7 +9,7 @@ define Build/uImageArcher
|
||||
@mv $@.new $@
|
||||
endef
|
||||
|
||||
define Device/tplink
|
||||
define Device/tplink-v1
|
||||
DEVICE_VENDOR := TP-Link
|
||||
TPLINK_HWREV := 0x1
|
||||
TPLINK_HEADER_VERSION := 1
|
||||
@ -21,8 +21,19 @@ define Device/tplink
|
||||
IMAGE/factory.bin := tplink-v1-image factory
|
||||
endef
|
||||
|
||||
define Device/tplink-v2
|
||||
DEVICE_VENDOR := TP-Link
|
||||
TPLINK_HWREV := 0x1
|
||||
TPLINK_HWREVADD := 0x0
|
||||
TPLINK_HVERSION := 3
|
||||
KERNEL := kernel-bin | append-dtb | lzma
|
||||
KERNEL_INITRAMFS := kernel-bin | append-dtb | lzma | tplink-v2-header
|
||||
IMAGE/sysupgrade.bin := tplink-v2-image -s | append-metadata | \
|
||||
check-size $$$$(IMAGE_SIZE)
|
||||
endef
|
||||
|
||||
define Device/tplink-nolzma
|
||||
$(Device/tplink)
|
||||
$(Device/tplink-v1)
|
||||
LOADER_FLASH_OFFS := 0x22000
|
||||
COMPILE := loader-$(1).gz
|
||||
COMPILE/loader-$(1).gz := loader-okli-compile
|
||||
@ -38,7 +49,7 @@ define Device/tplink-4m
|
||||
endef
|
||||
|
||||
define Device/tplink-4mlzma
|
||||
$(Device/tplink)
|
||||
$(Device/tplink-v1)
|
||||
TPLINK_FLASHLAYOUT := 4Mlzma
|
||||
IMAGE_SIZE := 3904k
|
||||
endef
|
||||
@ -50,19 +61,19 @@ define Device/tplink-8m
|
||||
endef
|
||||
|
||||
define Device/tplink-8mlzma
|
||||
$(Device/tplink)
|
||||
$(Device/tplink-v1)
|
||||
TPLINK_FLASHLAYOUT := 8Mlzma
|
||||
IMAGE_SIZE := 8000k
|
||||
endef
|
||||
|
||||
define Device/tplink-16mlzma
|
||||
$(Device/tplink)
|
||||
$(Device/tplink-v1)
|
||||
TPLINK_FLASHLAYOUT := 16Mlzma
|
||||
IMAGE_SIZE := 16192k
|
||||
endef
|
||||
|
||||
define Device/tplink-safeloader
|
||||
$(Device/tplink)
|
||||
$(Device/tplink-v1)
|
||||
KERNEL := kernel-bin | append-dtb | lzma | tplink-v1-header -O
|
||||
IMAGE/sysupgrade.bin := append-rootfs | tplink-safeloader sysupgrade | \
|
||||
append-metadata | check-size $$$$(IMAGE_SIZE)
|
||||
@ -74,7 +85,7 @@ define Device/tplink-safeloader-uimage
|
||||
KERNEL := kernel-bin | append-dtb | lzma | uImageArcher lzma
|
||||
endef
|
||||
|
||||
define Device/tplink-loader-okli
|
||||
define Device/tplink-safeloader-okli
|
||||
$(Device/tplink-safeloader)
|
||||
LOADER_TYPE := elf
|
||||
LOADER_FLASH_OFFS := 0x43000
|
||||
|
||||
@ -190,8 +190,8 @@ endef
|
||||
TARGET_DEVICES += tplink_archer-c7-v5
|
||||
|
||||
define Device/tplink_archer-d50-v1
|
||||
$(Device/tplink-v2)
|
||||
SOC := qca9531
|
||||
DEVICE_VENDOR := TP-Link
|
||||
DEVICE_MODEL := Archer D50
|
||||
DEVICE_VARIANT := v1
|
||||
DEVICE_PACKAGES := kmod-usb2 kmod-usb-ledtrig-usbport \
|
||||
@ -201,19 +201,13 @@ define Device/tplink_archer-d50-v1
|
||||
TPLINK_HWID := 0xC1200001
|
||||
TPLINK_HWREV := 0x00000046
|
||||
TPLINK_FLASHLAYOUT := 8Mqca
|
||||
TPLINK_HWREVADD := 0x00000000
|
||||
TPLINK_HVERSION := 3
|
||||
KERNEL := kernel-bin | append-dtb | lzma
|
||||
KERNEL_INITRAMFS := kernel-bin | append-dtb | lzma | \
|
||||
tplink-v2-header -s -V "ver. 1.0"
|
||||
IMAGES := sysupgrade.bin
|
||||
IMAGE/sysupgrade.bin := tplink-v2-image -s -V "ver. 2.0" | append-metadata | \
|
||||
check-size $$$$(IMAGE_SIZE)
|
||||
endef
|
||||
TARGET_DEVICES += tplink_archer-d50-v1
|
||||
|
||||
define Device/tplink_cpe210-v1
|
||||
$(Device/tplink-loader-okli)
|
||||
$(Device/tplink-safeloader-okli)
|
||||
SOC := ar9344
|
||||
IMAGE_SIZE := 7680k
|
||||
DEVICE_MODEL := CPE210
|
||||
@ -251,7 +245,7 @@ endef
|
||||
TARGET_DEVICES += tplink_cpe210-v3
|
||||
|
||||
define Device/tplink_cpe220-v2
|
||||
$(Device/tplink-loader-okli)
|
||||
$(Device/tplink-safeloader-okli)
|
||||
SOC := ar9344
|
||||
IMAGE_SIZE := 7680k
|
||||
DEVICE_MODEL := CPE220
|
||||
@ -274,7 +268,7 @@ endef
|
||||
TARGET_DEVICES += tplink_cpe220-v3
|
||||
|
||||
define Device/tplink_cpe510-v1
|
||||
$(Device/tplink-loader-okli)
|
||||
$(Device/tplink-safeloader-okli)
|
||||
SOC := ar9344
|
||||
IMAGE_SIZE := 7680k
|
||||
DEVICE_MODEL := CPE510
|
||||
@ -286,7 +280,7 @@ endef
|
||||
TARGET_DEVICES += tplink_cpe510-v1
|
||||
|
||||
define Device/tplink_cpe510-v2
|
||||
$(Device/tplink-loader-okli)
|
||||
$(Device/tplink-safeloader-okli)
|
||||
SOC := ar9344
|
||||
IMAGE_SIZE := 7680k
|
||||
DEVICE_MODEL := CPE510
|
||||
@ -298,7 +292,7 @@ endef
|
||||
TARGET_DEVICES += tplink_cpe510-v2
|
||||
|
||||
define Device/tplink_cpe510-v3
|
||||
$(Device/tplink-loader-okli)
|
||||
$(Device/tplink-safeloader-okli)
|
||||
SOC := ar9344
|
||||
IMAGE_SIZE := 7680k
|
||||
DEVICE_MODEL := CPE510
|
||||
@ -309,7 +303,7 @@ endef
|
||||
TARGET_DEVICES += tplink_cpe510-v3
|
||||
|
||||
define Device/tplink_cpe610-v1
|
||||
$(Device/tplink-loader-okli)
|
||||
$(Device/tplink-safeloader-okli)
|
||||
SOC := ar9344
|
||||
IMAGE_SIZE := 7680k
|
||||
DEVICE_MODEL := CPE610
|
||||
@ -598,7 +592,7 @@ endef
|
||||
TARGET_DEVICES += tplink_tl-wr902ac-v1
|
||||
|
||||
define Device/tplink_wbs210-v2
|
||||
$(Device/tplink-loader-okli)
|
||||
$(Device/tplink-safeloader-okli)
|
||||
SOC := ar9344
|
||||
IMAGE_SIZE := 7680k
|
||||
DEVICE_MODEL := WBS210
|
||||
@ -609,7 +603,7 @@ endef
|
||||
TARGET_DEVICES += tplink_wbs210-v2
|
||||
|
||||
define Device/tplink_wbs510-v1
|
||||
$(Device/tplink-loader-okli)
|
||||
$(Device/tplink-safeloader-okli)
|
||||
SOC := ar9344
|
||||
IMAGE_SIZE := 7680k
|
||||
DEVICE_MODEL := WBS510
|
||||
@ -621,7 +615,7 @@ endef
|
||||
TARGET_DEVICES += tplink_wbs510-v1
|
||||
|
||||
define Device/tplink_wbs510-v2
|
||||
$(Device/tplink-loader-okli)
|
||||
$(Device/tplink-safeloader-okli)
|
||||
SOC := ar9344
|
||||
IMAGE_SIZE := 7680k
|
||||
DEVICE_MODEL := WBS510
|
||||
|
||||
@ -300,6 +300,16 @@ define Device/comfast_cf-e5
|
||||
endef
|
||||
TARGET_DEVICES += comfast_cf-e5
|
||||
|
||||
define Device/comfast_cf-e560ac
|
||||
SOC := qca9531
|
||||
DEVICE_VENDOR := COMFAST
|
||||
DEVICE_MODEL := CF-E560AC
|
||||
DEVICE_PACKAGES := kmod-leds-gpio kmod-usb2 kmod-ath10k-ct \
|
||||
ath10k-firmware-qca9888-ct
|
||||
IMAGE_SIZE := 16128k
|
||||
endef
|
||||
TARGET_DEVICES += comfast_cf-e560ac
|
||||
|
||||
define Device/comfast_cf-wr650ac-v1
|
||||
SOC := qca9558
|
||||
DEVICE_VENDOR := COMFAST
|
||||
@ -819,7 +829,7 @@ define Device/netgear_wndr3700
|
||||
endef
|
||||
TARGET_DEVICES += netgear_wndr3700
|
||||
|
||||
define Device/netgear_wndr3700v2
|
||||
define Device/netgear_wndr3700-v2
|
||||
$(Device/netgear_wndr3x00)
|
||||
DEVICE_MODEL := WNDR3700
|
||||
DEVICE_VARIANT := v2
|
||||
@ -827,9 +837,9 @@ define Device/netgear_wndr3700v2
|
||||
NETGEAR_BOARD_ID := WNDR3700v2
|
||||
NETGEAR_HW_ID := 29763654+16+64
|
||||
IMAGE_SIZE := 15872k
|
||||
SUPPORTED_DEVICES += wndr3700
|
||||
SUPPORTED_DEVICES += wndr3700 netgear,wndr3700v2
|
||||
endef
|
||||
TARGET_DEVICES += netgear_wndr3700v2
|
||||
TARGET_DEVICES += netgear_wndr3700-v2
|
||||
|
||||
define Device/netgear_wndr3800
|
||||
$(Device/netgear_wndr3x00)
|
||||
|
||||
@ -0,0 +1,52 @@
|
||||
--- a/arch/mips/ath79/clock.c
|
||||
+++ b/arch/mips/ath79/clock.c
|
||||
@@ -42,6 +42,7 @@ static const char * const clk_names[ATH7
|
||||
[ATH79_CLK_AHB] = "ahb",
|
||||
[ATH79_CLK_REF] = "ref",
|
||||
[ATH79_CLK_MDIO] = "mdio",
|
||||
+ [ATH79_CLK_UART1] = "uart1",
|
||||
};
|
||||
|
||||
static const char * __init ath79_clk_name(int type)
|
||||
@@ -346,6 +347,9 @@ static void __init ar934x_clocks_init(vo
|
||||
if (clk_ctrl & AR934X_PLL_SWITCH_CLOCK_CONTROL_MDIO_CLK_SEL)
|
||||
ath79_set_clk(ATH79_CLK_MDIO, 100 * 1000 * 1000);
|
||||
|
||||
+ if (clk_ctrl & AR934X_PLL_SWITCH_CLOCK_CONTROL_UART1_CLK_SEL)
|
||||
+ ath79_set_clk(ATH79_CLK_UART1, 100 * 1000 * 1000);
|
||||
+
|
||||
iounmap(dpll_base);
|
||||
}
|
||||
|
||||
@@ -651,6 +655,9 @@ static void __init ath79_clocks_init_dt(
|
||||
if (!clks[ATH79_CLK_MDIO])
|
||||
clks[ATH79_CLK_MDIO] = clks[ATH79_CLK_REF];
|
||||
|
||||
+ if (!clks[ATH79_CLK_UART1])
|
||||
+ clks[ATH79_CLK_UART1] = clks[ATH79_CLK_REF];
|
||||
+
|
||||
if (of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data)) {
|
||||
pr_err("%pOF: could not register clk provider\n", np);
|
||||
goto err_iounmap;
|
||||
--- a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h
|
||||
+++ b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h
|
||||
@@ -351,6 +351,7 @@
|
||||
#define AR934X_PLL_CPU_DDR_CLK_CTRL_AHBCLK_FROM_DDRPLL BIT(24)
|
||||
|
||||
#define AR934X_PLL_SWITCH_CLOCK_CONTROL_MDIO_CLK_SEL BIT(6)
|
||||
+#define AR934X_PLL_SWITCH_CLOCK_CONTROL_UART1_CLK_SEL BIT(7)
|
||||
|
||||
#define QCA953X_PLL_CPU_CONFIG_REG 0x00
|
||||
#define QCA953X_PLL_DDR_CONFIG_REG 0x04
|
||||
--- a/include/dt-bindings/clock/ath79-clk.h
|
||||
+++ b/include/dt-bindings/clock/ath79-clk.h
|
||||
@@ -15,7 +15,8 @@
|
||||
#define ATH79_CLK_AHB 2
|
||||
#define ATH79_CLK_REF 3
|
||||
#define ATH79_CLK_MDIO 4
|
||||
+#define ATH79_CLK_UART1 5
|
||||
|
||||
-#define ATH79_CLK_END 5
|
||||
+#define ATH79_CLK_END 6
|
||||
|
||||
#endif /* __DT_BINDINGS_ATH79_CLK_H */
|
||||
@ -0,0 +1,61 @@
|
||||
From 7945f929f1a77a1c8887a97ca07f87626858ff42 Mon Sep 17 00:00:00 2001
|
||||
From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
|
||||
Date: Wed, 20 Feb 2019 11:12:39 +0000
|
||||
Subject: [PATCH] drivers: provide devm_platform_ioremap_resource()
|
||||
|
||||
There are currently 1200+ instances of using platform_get_resource()
|
||||
and devm_ioremap_resource() together in the kernel tree.
|
||||
|
||||
This patch wraps these two calls in a single helper. Thanks to that
|
||||
we don't have to declare a local variable for struct resource * and can
|
||||
omit the redundant argument for resource type. We also have one
|
||||
function call less.
|
||||
|
||||
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
|
||||
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
|
||||
---
|
||||
drivers/base/platform.c | 18 ++++++++++++++++++
|
||||
include/linux/platform_device.h | 3 +++
|
||||
2 files changed, 21 insertions(+)
|
||||
|
||||
--- a/drivers/base/platform.c
|
||||
+++ b/drivers/base/platform.c
|
||||
@@ -80,6 +80,24 @@ struct resource *platform_get_resource(s
|
||||
EXPORT_SYMBOL_GPL(platform_get_resource);
|
||||
|
||||
/**
|
||||
+ * devm_platform_ioremap_resource - call devm_ioremap_resource() for a platform
|
||||
+ * device
|
||||
+ *
|
||||
+ * @pdev: platform device to use both for memory resource lookup as well as
|
||||
+ * resource managemend
|
||||
+ * @index: resource index
|
||||
+ */
|
||||
+void __iomem *devm_platform_ioremap_resource(struct platform_device *pdev,
|
||||
+ unsigned int index)
|
||||
+{
|
||||
+ struct resource *res;
|
||||
+
|
||||
+ res = platform_get_resource(pdev, IORESOURCE_MEM, index);
|
||||
+ return devm_ioremap_resource(&pdev->dev, res);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(devm_platform_ioremap_resource);
|
||||
+
|
||||
+/**
|
||||
* platform_get_irq - get an IRQ for a device
|
||||
* @dev: platform device
|
||||
* @num: IRQ number index
|
||||
--- a/include/linux/platform_device.h
|
||||
+++ b/include/linux/platform_device.h
|
||||
@@ -51,6 +51,9 @@ extern struct device platform_bus;
|
||||
extern void arch_setup_pdev_archdata(struct platform_device *);
|
||||
extern struct resource *platform_get_resource(struct platform_device *,
|
||||
unsigned int, unsigned int);
|
||||
+extern void __iomem *
|
||||
+devm_platform_ioremap_resource(struct platform_device *pdev,
|
||||
+ unsigned int index);
|
||||
extern int platform_get_irq(struct platform_device *, unsigned int);
|
||||
extern int platform_irq_count(struct platform_device *);
|
||||
extern struct resource *platform_get_resource_byname(struct platform_device *,
|
||||
@ -0,0 +1,277 @@
|
||||
From b518f18f89dbd49fe9403a8c92230f1af59219bc Mon Sep 17 00:00:00 2001
|
||||
From: Chuanhong Guo <gch981213@gmail.com>
|
||||
Date: Wed, 5 Feb 2020 18:25:37 +0800
|
||||
Subject: [PATCH 1/2] spi: add driver for ar934x spi controller
|
||||
|
||||
This patch adds driver for SPI controller found in Qualcomm Atheros
|
||||
AR934x/QCA95xx SoCs.
|
||||
This controller is a superset of the already supported qca,ar7100-spi.
|
||||
Besides the bit-bang mode in spi-ath79.c, this new controller added
|
||||
a new "shift register" mode, allowing faster spi operations.
|
||||
|
||||
Signed-off-by: Chuanhong Guo <gch981213@gmail.com>
|
||||
---
|
||||
drivers/spi/Kconfig | 7 ++
|
||||
drivers/spi/Makefile | 1 +
|
||||
drivers/spi/spi-ar934x.c | 229 +++++++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 237 insertions(+)
|
||||
create mode 100644 drivers/spi/spi-ar934x.c
|
||||
|
||||
--- a/drivers/spi/Kconfig
|
||||
+++ b/drivers/spi/Kconfig
|
||||
@@ -61,6 +61,13 @@ config SPI_ALTERA
|
||||
help
|
||||
This is the driver for the Altera SPI Controller.
|
||||
|
||||
+config SPI_AR934X
|
||||
+ tristate "Qualcomm Atheros AR934X/QCA95XX SPI controller driver"
|
||||
+ depends on ATH79 || COMPILE_TEST
|
||||
+ help
|
||||
+ This enables support for the SPI controller present on the
|
||||
+ Qualcomm Atheros AR934X/QCA95XX SoCs.
|
||||
+
|
||||
config SPI_ATH79
|
||||
tristate "Atheros AR71XX/AR724X/AR913X SPI controller driver"
|
||||
depends on ATH79 && GPIOLIB
|
||||
--- a/drivers/spi/Makefile
|
||||
+++ b/drivers/spi/Makefile
|
||||
@@ -14,6 +14,7 @@ obj-$(CONFIG_SPI_LOOPBACK_TEST) += spi-
|
||||
|
||||
# SPI master controller drivers (bus)
|
||||
obj-$(CONFIG_SPI_ALTERA) += spi-altera.o
|
||||
+obj-$(CONFIG_SPI_AR934X) += spi-ar934x.o
|
||||
obj-$(CONFIG_SPI_ARMADA_3700) += spi-armada-3700.o
|
||||
obj-$(CONFIG_SPI_ATMEL) += spi-atmel.o
|
||||
obj-$(CONFIG_SPI_ATH79) += spi-ath79.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/spi/spi-ar934x.c
|
||||
@@ -0,0 +1,229 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0
|
||||
+//
|
||||
+// SPI controller driver for Qualcomm Atheros AR934x/QCA95xx SoCs
|
||||
+//
|
||||
+// Copyright (C) 2020 Chuanhong Guo <gch981213@gmail.com>
|
||||
+//
|
||||
+// Based on spi-mt7621.c:
|
||||
+// Copyright (C) 2011 Sergiy <piratfm@gmail.com>
|
||||
+// Copyright (C) 2011-2013 Gabor Juhos <juhosg@openwrt.org>
|
||||
+// Copyright (C) 2014-2015 Felix Fietkau <nbd@nbd.name>
|
||||
+
|
||||
+#include <linux/clk.h>
|
||||
+#include <linux/io.h>
|
||||
+#include <linux/iopoll.h>
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/of_device.h>
|
||||
+#include <linux/spi/spi.h>
|
||||
+
|
||||
+#define DRIVER_NAME "spi-ar934x"
|
||||
+
|
||||
+#define AR934X_SPI_REG_FS 0x00
|
||||
+#define AR934X_SPI_ENABLE BIT(0)
|
||||
+
|
||||
+#define AR934X_SPI_REG_CTRL 0x04
|
||||
+#define AR934X_SPI_CLK_MASK GENMASK(5, 0)
|
||||
+
|
||||
+#define AR934X_SPI_DATAOUT 0x10
|
||||
+
|
||||
+#define AR934X_SPI_REG_SHIFT_CTRL 0x14
|
||||
+#define AR934X_SPI_SHIFT_EN BIT(31)
|
||||
+#define AR934X_SPI_SHIFT_CS(n) BIT(28 + (n))
|
||||
+#define AR934X_SPI_SHIFT_TERM 26
|
||||
+#define AR934X_SPI_SHIFT_VAL(cs, term, count) \
|
||||
+ (AR934X_SPI_SHIFT_EN | AR934X_SPI_SHIFT_CS(cs) | \
|
||||
+ (term) << AR934X_SPI_SHIFT_TERM | (count))
|
||||
+
|
||||
+#define AR934X_SPI_DATAIN 0x18
|
||||
+
|
||||
+struct ar934x_spi {
|
||||
+ struct spi_controller *ctlr;
|
||||
+ void __iomem *base;
|
||||
+ struct clk *clk;
|
||||
+ unsigned int clk_freq;
|
||||
+};
|
||||
+
|
||||
+static inline int ar934x_spi_clk_div(struct ar934x_spi *sp, unsigned int freq)
|
||||
+{
|
||||
+ int div = DIV_ROUND_UP(sp->clk_freq, freq * 2) - 1;
|
||||
+
|
||||
+ if (div < 0)
|
||||
+ return 0;
|
||||
+ else if (div > AR934X_SPI_CLK_MASK)
|
||||
+ return -EINVAL;
|
||||
+ else
|
||||
+ return div;
|
||||
+}
|
||||
+
|
||||
+static int ar934x_spi_setup(struct spi_device *spi)
|
||||
+{
|
||||
+ struct ar934x_spi *sp = spi_controller_get_devdata(spi->master);
|
||||
+
|
||||
+ if ((spi->max_speed_hz == 0) ||
|
||||
+ (spi->max_speed_hz > (sp->clk_freq / 2))) {
|
||||
+ spi->max_speed_hz = sp->clk_freq / 2;
|
||||
+ } else if (spi->max_speed_hz < (sp->clk_freq / 128)) {
|
||||
+ dev_err(&spi->dev, "spi clock is too low\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int ar934x_spi_transfer_one_message(struct spi_controller *master,
|
||||
+ struct spi_message *m)
|
||||
+{
|
||||
+ struct ar934x_spi *sp = spi_controller_get_devdata(master);
|
||||
+ struct spi_transfer *t = NULL;
|
||||
+ struct spi_device *spi = m->spi;
|
||||
+ unsigned long trx_done, trx_cur;
|
||||
+ int stat = 0;
|
||||
+ u8 term = 0;
|
||||
+ int div, i;
|
||||
+ u32 reg;
|
||||
+ const u8 *tx_buf;
|
||||
+ u8 *buf;
|
||||
+
|
||||
+ m->actual_length = 0;
|
||||
+ list_for_each_entry(t, &m->transfers, transfer_list) {
|
||||
+ if (t->speed_hz)
|
||||
+ div = ar934x_spi_clk_div(sp, t->speed_hz);
|
||||
+ else
|
||||
+ div = ar934x_spi_clk_div(sp, spi->max_speed_hz);
|
||||
+ if (div < 0) {
|
||||
+ stat = -EIO;
|
||||
+ goto msg_done;
|
||||
+ }
|
||||
+
|
||||
+ reg = ioread32(sp->base + AR934X_SPI_REG_CTRL);
|
||||
+ reg &= ~AR934X_SPI_CLK_MASK;
|
||||
+ reg |= div;
|
||||
+ iowrite32(reg, sp->base + AR934X_SPI_REG_CTRL);
|
||||
+ iowrite32(0, sp->base + AR934X_SPI_DATAOUT);
|
||||
+
|
||||
+ for (trx_done = 0; trx_done < t->len; trx_done += 4) {
|
||||
+ trx_cur = t->len - trx_done;
|
||||
+ if (trx_cur > 4)
|
||||
+ trx_cur = 4;
|
||||
+ else if (list_is_last(&t->transfer_list, &m->transfers))
|
||||
+ term = 1;
|
||||
+
|
||||
+ if (t->tx_buf) {
|
||||
+ tx_buf = t->tx_buf + trx_done;
|
||||
+ reg = tx_buf[0];
|
||||
+ for (i = 1; i < trx_cur; i++)
|
||||
+ reg = reg << 8 | tx_buf[i];
|
||||
+ iowrite32(reg, sp->base + AR934X_SPI_DATAOUT);
|
||||
+ }
|
||||
+
|
||||
+ reg = AR934X_SPI_SHIFT_VAL(spi->chip_select, term,
|
||||
+ trx_cur * 8);
|
||||
+ iowrite32(reg, sp->base + AR934X_SPI_REG_SHIFT_CTRL);
|
||||
+ stat = readl_poll_timeout(
|
||||
+ sp->base + AR934X_SPI_REG_SHIFT_CTRL, reg,
|
||||
+ !(reg & AR934X_SPI_SHIFT_EN), 0, 5);
|
||||
+ if (stat < 0)
|
||||
+ goto msg_done;
|
||||
+
|
||||
+ if (t->rx_buf) {
|
||||
+ reg = ioread32(sp->base + AR934X_SPI_DATAIN);
|
||||
+ buf = t->rx_buf + trx_done;
|
||||
+ for (i = 0; i < trx_cur; i++) {
|
||||
+ buf[trx_cur - i - 1] = reg & 0xff;
|
||||
+ reg >>= 8;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ m->actual_length += t->len;
|
||||
+ }
|
||||
+
|
||||
+msg_done:
|
||||
+ m->status = stat;
|
||||
+ spi_finalize_current_message(master);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id ar934x_spi_match[] = {
|
||||
+ { .compatible = "qca,ar934x-spi" },
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, ar934x_spi_match);
|
||||
+
|
||||
+static int ar934x_spi_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct spi_controller *ctlr;
|
||||
+ struct ar934x_spi *sp;
|
||||
+ void __iomem *base;
|
||||
+ struct clk *clk;
|
||||
+ int ret;
|
||||
+
|
||||
+ base = devm_platform_ioremap_resource(pdev, 0);
|
||||
+ if (IS_ERR(base))
|
||||
+ return PTR_ERR(base);
|
||||
+
|
||||
+ clk = devm_clk_get(&pdev->dev, NULL);
|
||||
+ if (IS_ERR(clk)) {
|
||||
+ dev_err(&pdev->dev, "failed to get clock\n");
|
||||
+ return PTR_ERR(clk);
|
||||
+ }
|
||||
+
|
||||
+ ret = clk_prepare_enable(clk);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ ctlr = spi_alloc_master(&pdev->dev, sizeof(*sp));
|
||||
+ if (!ctlr) {
|
||||
+ dev_info(&pdev->dev, "failed to allocate spi controller\n");
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
+ iowrite32(AR934X_SPI_ENABLE, base + AR934X_SPI_REG_FS);
|
||||
+
|
||||
+ ctlr->mode_bits = SPI_LSB_FIRST;
|
||||
+ ctlr->setup = ar934x_spi_setup;
|
||||
+ ctlr->transfer_one_message = ar934x_spi_transfer_one_message;
|
||||
+ ctlr->bits_per_word_mask = SPI_BPW_MASK(8);
|
||||
+ ctlr->dev.of_node = pdev->dev.of_node;
|
||||
+ ctlr->num_chipselect = 3;
|
||||
+
|
||||
+ dev_set_drvdata(&pdev->dev, ctlr);
|
||||
+
|
||||
+ sp = spi_controller_get_devdata(ctlr);
|
||||
+ sp->base = base;
|
||||
+ sp->clk = clk;
|
||||
+ sp->clk_freq = clk_get_rate(clk);
|
||||
+ sp->ctlr = ctlr;
|
||||
+
|
||||
+ return devm_spi_register_controller(&pdev->dev, ctlr);
|
||||
+}
|
||||
+
|
||||
+static int ar934x_spi_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct spi_controller *ctlr;
|
||||
+ struct ar934x_spi *sp;
|
||||
+
|
||||
+ ctlr = dev_get_drvdata(&pdev->dev);
|
||||
+ sp = spi_controller_get_devdata(ctlr);
|
||||
+
|
||||
+ clk_disable_unprepare(sp->clk);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct platform_driver ar934x_spi_driver = {
|
||||
+ .driver = {
|
||||
+ .name = DRIVER_NAME,
|
||||
+ .of_match_table = ar934x_spi_match,
|
||||
+ },
|
||||
+ .probe = ar934x_spi_probe,
|
||||
+ .remove = ar934x_spi_remove,
|
||||
+};
|
||||
+
|
||||
+module_platform_driver(ar934x_spi_driver);
|
||||
+
|
||||
+MODULE_DESCRIPTION("SPI controller driver for Qualcomm Atheros AR934x/QCA95xx");
|
||||
+MODULE_AUTHOR("Chuanhong Guo <gch981213@gmail.com>");
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
+MODULE_ALIAS("platform:" DRIVER_NAME);
|
||||
@ -0,0 +1,64 @@
|
||||
From patchwork Fri Feb 7 09:53:35 2020
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
X-Patchwork-Submitter: Daniel Golle <daniel@makrotopia.org>
|
||||
X-Patchwork-Id: 1190470
|
||||
Date: Fri, 7 Feb 2020 11:53:35 +0200
|
||||
From: Daniel Golle <daniel@makrotopia.org>
|
||||
To: linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org
|
||||
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
|
||||
Jiri Slaby <jslaby@suse.com>,
|
||||
Chuanhong Guo <gch981213@gmail.com>,
|
||||
Eitan Cohen <eitan@neot-semadar.com>,
|
||||
Ori Gofen <origofen@gmail.com>
|
||||
Subject: [PATCH] serial: ar933x_uart: set UART_CS_{RX,TX}_READY_ORIDE
|
||||
Message-ID: <20200207095335.GA179836@makrotopia.org>
|
||||
MIME-Version: 1.0
|
||||
Content-Disposition: inline
|
||||
Sender: linux-kernel-owner@vger.kernel.org
|
||||
Precedence: bulk
|
||||
List-ID: <linux-kernel.vger.kernel.org>
|
||||
X-Mailing-List: linux-kernel@vger.kernel.org
|
||||
|
||||
On AR934x this UART is usually not initialized by the bootloader
|
||||
as it is only used as a secondary serial port while the primary
|
||||
UART is a newly introduced NS16550-compatible.
|
||||
In order to make use of the ar933x-uart on AR934x without RTS/CTS
|
||||
hardware flow control, one needs to set the
|
||||
UART_CS_{RX,TX}_READY_ORIDE bits as other than on AR933x where this
|
||||
UART is used as primary/console, the bootloader on AR934x typically
|
||||
doesn't set those bits.
|
||||
Setting them explicitely on AR933x should not do any harm, so just
|
||||
set them unconditionally.
|
||||
|
||||
Tested-by: Chuanhong Guo <gch981213@gmail.com>
|
||||
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
---
|
||||
drivers/tty/serial/ar933x_uart.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
--- a/drivers/tty/serial/ar933x_uart.c
|
||||
+++ b/drivers/tty/serial/ar933x_uart.c
|
||||
@@ -328,6 +328,10 @@ static void ar933x_uart_set_termios(stru
|
||||
ar933x_uart_rmw_set(up, AR933X_UART_CS_REG,
|
||||
AR933X_UART_CS_HOST_INT_EN);
|
||||
|
||||
+ /* enable RX and TX ready overide */
|
||||
+ ar933x_uart_rmw_set(up, AR933X_UART_CS_REG,
|
||||
+ AR933X_UART_CS_TX_READY_ORIDE | AR933X_UART_CS_RX_READY_ORIDE);
|
||||
+
|
||||
/* reenable the UART */
|
||||
ar933x_uart_rmw(up, AR933X_UART_CS_REG,
|
||||
AR933X_UART_CS_IF_MODE_M << AR933X_UART_CS_IF_MODE_S,
|
||||
@@ -460,6 +464,10 @@ static int ar933x_uart_startup(struct ua
|
||||
ar933x_uart_rmw_set(up, AR933X_UART_CS_REG,
|
||||
AR933X_UART_CS_HOST_INT_EN);
|
||||
|
||||
+ /* enable RX and TX ready overide */
|
||||
+ ar933x_uart_rmw_set(up, AR933X_UART_CS_REG,
|
||||
+ AR933X_UART_CS_TX_READY_ORIDE | AR933X_UART_CS_RX_READY_ORIDE);
|
||||
+
|
||||
/* Enable RX interrupts */
|
||||
up->ier = AR933X_UART_INT_RX_VALID;
|
||||
ar933x_uart_write(up, AR933X_UART_INT_EN_REG, up->ier);
|
||||
@ -728,7 +728,7 @@
|
||||
EXPORT_SYMBOL(xfrm_parse_spi);
|
||||
--- a/net/ipv4/tcp_input.c
|
||||
+++ b/net/ipv4/tcp_input.c
|
||||
@@ -3895,14 +3895,16 @@ static bool tcp_parse_aligned_timestamp(
|
||||
@@ -3896,14 +3896,16 @@ static bool tcp_parse_aligned_timestamp(
|
||||
{
|
||||
const __be32 *ptr = (const __be32 *)(th + 1);
|
||||
|
||||
|
||||
@ -24,6 +24,13 @@ buffalo,wzr-1750dhp)
|
||||
board_config_flush
|
||||
exit 0
|
||||
;;
|
||||
luxul,abr-4500-v1|\
|
||||
luxul,xbr-4500-v1)
|
||||
ucidef_add_switch "switch0" \
|
||||
"0:wan" "1:lan:4" "2:lan:3" "3:lan:2" "4:lan:1" "5@eth0"
|
||||
board_config_flush
|
||||
exit 0
|
||||
;;
|
||||
phicomm,k3)
|
||||
ucidef_add_switch "switch0" \
|
||||
"0:lan" "1:lan" "2:lan" "3:wan" "5@eth0"
|
||||
|
||||
@ -83,6 +83,13 @@ define Build/asus-trx
|
||||
mv $@.new $@
|
||||
endef
|
||||
|
||||
define Build/luxul-lxl
|
||||
$(STAGING_DIR_HOST)/bin/lxlfw create $@.new \
|
||||
-i $@ \
|
||||
-b $(LUXUL_BOARD)
|
||||
mv $@.new $@
|
||||
endef
|
||||
|
||||
define Build/seama-nand
|
||||
# Seama entity
|
||||
$(STAGING_DIR_HOST)/bin/oseama \
|
||||
@ -102,6 +109,7 @@ endef
|
||||
|
||||
DEVICE_VARS += PRODUCTID SIGNATURE NETGEAR_BOARD_ID NETGEAR_REGION TPLINK_BOARD
|
||||
DEVICE_VARS += BUFFALO_TAG_PLATFORM BUFFALO_TAG_VERSION BUFFALO_TAG_MINOR
|
||||
DEVICE_VARS += LUXUL_BOARD
|
||||
|
||||
IEEE8021X := wpad-basic
|
||||
B43 := $(IEEE8021X) kmod-b43
|
||||
@ -262,6 +270,28 @@ define Device/linksys-ea9500
|
||||
endef
|
||||
# TARGET_DEVICES += linksys-ea9500
|
||||
|
||||
define Device/luxul
|
||||
DEVICE_VENDOR := Luxul
|
||||
IMAGES := lxl
|
||||
IMAGE/lxl := append-ubi | trx-nand | luxul-lxl
|
||||
endef
|
||||
|
||||
define Device/luxul-abr-4500
|
||||
$(Device/luxul)
|
||||
DEVICE_MODEL := ABR-4500
|
||||
DEVICE_PACKAGES := $(USB3_PACKAGES)
|
||||
LUXUL_BOARD := ABR-4500
|
||||
endef
|
||||
TARGET_DEVICES += luxul-abr-4500
|
||||
|
||||
define Device/luxul-xbr-4500
|
||||
$(Device/luxul)
|
||||
DEVICE_MODEL := XBR-4500
|
||||
DEVICE_PACKAGES := $(USB3_PACKAGES)
|
||||
LUXUL_BOARD := XBR-4500
|
||||
endef
|
||||
TARGET_DEVICES += luxul-xbr-4500
|
||||
|
||||
define Device/netgear
|
||||
DEVICE_VENDOR := NETGEAR
|
||||
IMAGES := chk
|
||||
|
||||
@ -13,7 +13,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
|
||||
--- a/drivers/mtd/spi-nor/spi-nor.c
|
||||
+++ b/drivers/mtd/spi-nor/spi-nor.c
|
||||
@@ -1222,6 +1222,18 @@ static const struct flash_info *spi_nor_
|
||||
@@ -1226,6 +1226,18 @@ static const struct flash_info *spi_nor_
|
||||
}
|
||||
dev_err(nor->dev, "unrecognized JEDEC id bytes: %02x, %02x, %02x\n",
|
||||
id[0], id[1], id[2]);
|
||||
|
||||
@ -13,7 +13,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
|
||||
--- a/drivers/mtd/spi-nor/spi-nor.c
|
||||
+++ b/drivers/mtd/spi-nor/spi-nor.c
|
||||
@@ -1297,6 +1297,18 @@ static const struct flash_info *spi_nor_
|
||||
@@ -1301,6 +1301,18 @@ static const struct flash_info *spi_nor_
|
||||
}
|
||||
dev_err(nor->dev, "unrecognized JEDEC id bytes: %02x, %02x, %02x\n",
|
||||
id[0], id[1], id[2]);
|
||||
|
||||
@ -532,6 +532,33 @@ endef
|
||||
$(eval $(call KernelPackage,sound-soc-hifiberry-dacplusdsp))
|
||||
|
||||
|
||||
define KernelPackage/sound-soc-hifiberry-dacplushd
|
||||
TITLE:=Support for HifiBerry DAC+HD
|
||||
KCONFIG:= \
|
||||
CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSHD \
|
||||
CONFIG_SND_SOC_PCM179X \
|
||||
CONFIG_SND_SOC_PCM179X_I2C
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/drivers/clk/clk-hifiberry-dachd.ko \
|
||||
$(LINUX_DIR)/sound/soc/bcm/snd-soc-hifiberry-dacplushd.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-pcm179x-codec.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-pcm179x-i2c.ko
|
||||
AUTOLOAD:=$(call AutoLoad,68,clk-hifiberry-dachd snd-soc-pcm179x-codec \
|
||||
snd-soc-pcm179x-i2c snd-soc-hifiberry-dacplushd)
|
||||
DEPENDS:= \
|
||||
kmod-sound-soc-bcm2835-i2s \
|
||||
+kmod-i2c-bcm2835 \
|
||||
+kmod-regmap-i2c
|
||||
$(call AddDepends/sound)
|
||||
endef
|
||||
|
||||
define KernelPackage/sound-soc-hifiberry-dacplushd/description
|
||||
This package contains support for HifiBerry DAC+HD
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,sound-soc-hifiberry-dacplushd))
|
||||
|
||||
|
||||
define KernelPackage/sound-soc-hifiberry-dacplusadc-pro
|
||||
TITLE:=Support for HifiBerry DAC+ADC PRO
|
||||
KCONFIG:= \
|
||||
@ -704,6 +731,32 @@ endef
|
||||
$(eval $(call KernelPackage,sound-soc-i-sabe-q2m))
|
||||
|
||||
|
||||
define KernelPackage/sound-soc-justboom-both
|
||||
TITLE:=Support for JustBoom DAC and Digi
|
||||
KCONFIG:= \
|
||||
CONFIG_SND_BCM2708_SOC_JUSTBOOM_BOTH \
|
||||
CONFIG_SND_SOC_PCM512x \
|
||||
CONFIG_SND_SOC_WM8804
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/sound/soc/bcm/snd-soc-justboom-both.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-pcm512x.ko \
|
||||
$(LINUX_DIR)/sound/soc/codecs/snd-soc-wm8804.ko
|
||||
AUTOLOAD:=$(call AutoLoad,68,snd-soc-pcm512x snd-soc-wm8804 \
|
||||
snd-soc-justboom-both)
|
||||
DEPENDS:= \
|
||||
kmod-sound-soc-bcm2835-i2s \
|
||||
+kmod-sound-soc-rpi-wm8804-soundcard \
|
||||
+kmod-i2c-bcm2835
|
||||
$(call AddDepends/sound)
|
||||
endef
|
||||
|
||||
define KernelPackage/sound-soc-justboom-both/description
|
||||
This package contains support for JustBoom DAC and Digi
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,sound-soc-justboom-both))
|
||||
|
||||
|
||||
define KernelPackage/sound-soc-justboom-dac
|
||||
TITLE:=Support for JustBoom DAC
|
||||
KCONFIG:= \
|
||||
|
||||
@ -14,7 +14,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
|
||||
--- a/drivers/net/usb/lan78xx.c
|
||||
+++ b/drivers/net/usb/lan78xx.c
|
||||
@@ -2476,6 +2476,11 @@ static int lan78xx_reset(struct lan78xx_
|
||||
@@ -2477,6 +2477,11 @@ static int lan78xx_reset(struct lan78xx_
|
||||
int ret = 0;
|
||||
unsigned long timeout;
|
||||
u8 sig;
|
||||
@ -26,7 +26,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
|
||||
ret = lan78xx_read_reg(dev, HW_CFG, &buf);
|
||||
buf |= HW_CFG_LRST_;
|
||||
@@ -2529,6 +2534,9 @@ static int lan78xx_reset(struct lan78xx_
|
||||
@@ -2530,6 +2535,9 @@ static int lan78xx_reset(struct lan78xx_
|
||||
|
||||
ret = lan78xx_read_reg(dev, HW_CFG, &buf);
|
||||
buf |= HW_CFG_MEF_;
|
||||
@ -36,7 +36,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
ret = lan78xx_write_reg(dev, HW_CFG, buf);
|
||||
|
||||
ret = lan78xx_read_reg(dev, USB_CFG0, &buf);
|
||||
@@ -2584,6 +2592,9 @@ static int lan78xx_reset(struct lan78xx_
|
||||
@@ -2585,6 +2593,9 @@ static int lan78xx_reset(struct lan78xx_
|
||||
buf |= MAC_CR_AUTO_DUPLEX_ | MAC_CR_AUTO_SPEED_;
|
||||
}
|
||||
}
|
||||
|
||||
@ -2119,17 +2119,6 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
+ <&cpu3>, "clock-frequency:0";
|
||||
+ };
|
||||
+};
|
||||
--- a/arch/arm/boot/dts/bcm2835-rpi.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm2835-rpi.dtsi
|
||||
@@ -32,7 +32,7 @@
|
||||
|
||||
mailbox@7e00b840 {
|
||||
compatible = "brcm,bcm2835-vchiq";
|
||||
- reg = <0x7e00b840 0xf>;
|
||||
+ reg = <0x7e00b840 0x3c>;
|
||||
interrupts = <0 2>;
|
||||
};
|
||||
};
|
||||
--- a/arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi
|
||||
@@ -21,7 +21,24 @@
|
||||
|
||||
@ -15,7 +15,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
|
||||
--- a/drivers/net/usb/lan78xx.c
|
||||
+++ b/drivers/net/usb/lan78xx.c
|
||||
@@ -2658,6 +2658,22 @@ static int lan78xx_open(struct net_devic
|
||||
@@ -2659,6 +2659,22 @@ static int lan78xx_open(struct net_devic
|
||||
|
||||
netif_dbg(dev, ifup, dev->net, "phy initialised successfully");
|
||||
|
||||
|
||||
@ -21,7 +21,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.org>
|
||||
|
||||
--- a/drivers/net/usb/lan78xx.c
|
||||
+++ b/drivers/net/usb/lan78xx.c
|
||||
@@ -439,6 +439,15 @@ static int msg_level = -1;
|
||||
@@ -440,6 +440,15 @@ static int msg_level = -1;
|
||||
module_param(msg_level, int, 0);
|
||||
MODULE_PARM_DESC(msg_level, "Override default message level");
|
||||
|
||||
@ -37,7 +37,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.org>
|
||||
static int lan78xx_read_reg(struct lan78xx_net *dev, u32 index, u32 *data)
|
||||
{
|
||||
u32 *buf = kmalloc(sizeof(u32), GFP_KERNEL);
|
||||
@@ -3009,8 +3018,14 @@ static int lan78xx_bind(struct lan78xx_n
|
||||
@@ -3010,8 +3019,14 @@ static int lan78xx_bind(struct lan78xx_n
|
||||
if (DEFAULT_RX_CSUM_ENABLE)
|
||||
dev->net->features |= NETIF_F_RXCSUM;
|
||||
|
||||
|
||||
@ -16,7 +16,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
|
||||
--- a/drivers/net/usb/lan78xx.c
|
||||
+++ b/drivers/net/usb/lan78xx.c
|
||||
@@ -2190,6 +2190,22 @@ static int lan78xx_phy_init(struct lan78
|
||||
@@ -2191,6 +2191,22 @@ static int lan78xx_phy_init(struct lan78
|
||||
mii_adv = (u32)mii_advertise_flowctrl(dev->fc_request_control);
|
||||
phydev->advertising |= mii_adv_to_ethtool_adv_t(mii_adv);
|
||||
|
||||
@ -39,7 +39,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
if (phydev->mdio.dev.of_node) {
|
||||
u32 reg;
|
||||
int len;
|
||||
@@ -2667,22 +2683,6 @@ static int lan78xx_open(struct net_devic
|
||||
@@ -2668,22 +2684,6 @@ static int lan78xx_open(struct net_devic
|
||||
|
||||
netif_dbg(dev, ifup, dev->net, "phy initialised successfully");
|
||||
|
||||
|
||||
@ -26,7 +26,7 @@ Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
int bcm2835_v4l2_debug;
|
||||
module_param_named(debug, bcm2835_v4l2_debug, int, 0644);
|
||||
MODULE_PARM_DESC(bcm2835_v4l2_debug, "Debug level 0-2");
|
||||
@@ -1980,3 +1974,9 @@ static struct platform_driver bcm2835_ca
|
||||
@@ -1989,3 +1983,9 @@ static struct platform_driver bcm2835_ca
|
||||
};
|
||||
|
||||
module_platform_driver(bcm2835_camera_driver)
|
||||
@ -1,24 +0,0 @@
|
||||
From 8b6e9f2a951b38becf5b8a1e99ba1993f7751aac Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
Date: Sat, 20 Oct 2018 19:26:18 +0200
|
||||
Subject: [PATCH] staging: bcm2835-camera: fix module autoloading
|
||||
|
||||
In order to make the module bcm2835-camera load automatically, we need to
|
||||
add a module alias.
|
||||
|
||||
Fixes: 4bebb0312ea9 ("staging/bcm2835-camera: Set ourselves up as a platform driver.")
|
||||
Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
---
|
||||
drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c
|
||||
+++ b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c
|
||||
@@ -47,6 +47,7 @@ MODULE_DESCRIPTION("Broadcom 2835 MMAL v
|
||||
MODULE_AUTHOR("Vincent Sanders");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_VERSION(BM2835_MMAL_VERSION);
|
||||
+MODULE_ALIAS("platform:bcm2835-camera");
|
||||
|
||||
int bcm2835_v4l2_debug;
|
||||
module_param_named(debug, bcm2835_v4l2_debug, int, 0644);
|
||||
@ -98,7 +98,7 @@ Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -1880,21 +1891,29 @@ static int bcm2835_mmal_probe(struct pla
|
||||
@@ -1886,21 +1897,29 @@ static int bcm2835_mmal_probe(struct pla
|
||||
snprintf(dev->v4l2_dev.name, sizeof(dev->v4l2_dev.name),
|
||||
"%s", BM2835_MMAL_MODULE_NAME);
|
||||
ret = v4l2_device_register(NULL, &dev->v4l2_dev);
|
||||
@ -132,7 +132,7 @@ Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
/* initialize queue */
|
||||
q = &dev->capture.vb_vidq;
|
||||
memset(q, 0, sizeof(*q));
|
||||
@@ -1912,16 +1931,19 @@ static int bcm2835_mmal_probe(struct pla
|
||||
@@ -1918,16 +1937,19 @@ static int bcm2835_mmal_probe(struct pla
|
||||
|
||||
/* initialise video devices */
|
||||
ret = bm2835_mmal_init_device(dev, &dev->vdev);
|
||||
@ -155,12 +155,12 @@ Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
goto unreg_dev;
|
||||
}
|
||||
|
||||
@@ -1945,8 +1967,6 @@ cleanup_gdev:
|
||||
@@ -1951,8 +1973,6 @@ cleanup_gdev:
|
||||
bcm2835_cleanup_instance(gdev[i]);
|
||||
gdev[i] = NULL;
|
||||
}
|
||||
- pr_info("%s: error %d while loading driver\n",
|
||||
- BM2835_MMAL_MODULE_NAME, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
cleanup_mmal:
|
||||
vchiq_mmal_finalise(instance);
|
||||
@ -1,41 +0,0 @@
|
||||
From b0ebcf556b543b0b509ad071584ca6b41076a2da Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
Date: Mon, 22 Oct 2018 11:09:18 +0200
|
||||
Subject: [PATCH] staging: bcm2835: Don't probe if no camera is
|
||||
detected
|
||||
|
||||
It is a waste of resources to load the camera driver in case there isn't
|
||||
a camera actually connected to the Raspberry Pi. This solution also
|
||||
avoids a NULL ptr dereference of mmal instance on driver unload.
|
||||
|
||||
Fixes: 7b3ad5abf027 ("staging: Import the BCM2835 MMAL-based V4L2 camera driver.")
|
||||
Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
---
|
||||
.../vc04_services/bcm2835-camera/bcm2835-camera.c | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
--- a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c
|
||||
+++ b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c
|
||||
@@ -1860,6 +1860,12 @@ static int bcm2835_mmal_probe(struct pla
|
||||
num_cameras = get_num_cameras(instance,
|
||||
resolutions,
|
||||
MAX_BCM2835_CAMERAS);
|
||||
+
|
||||
+ if (num_cameras < 1) {
|
||||
+ ret = -ENODEV;
|
||||
+ goto cleanup_mmal;
|
||||
+ }
|
||||
+
|
||||
if (num_cameras > MAX_BCM2835_CAMERAS)
|
||||
num_cameras = MAX_BCM2835_CAMERAS;
|
||||
|
||||
@@ -1968,6 +1974,9 @@ cleanup_gdev:
|
||||
gdev[i] = NULL;
|
||||
}
|
||||
|
||||
+cleanup_mmal:
|
||||
+ vchiq_mmal_finalise(instance);
|
||||
+
|
||||
return ret;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user