From 2175fb410ce63d997b99b8c310a0206cdfaa73b9 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Mon, 23 Oct 2017 13:10:30 +0800 Subject: [PATCH 01/37] add init support for Asus RT-ACRH17 --- .../arm/boot/dts/qcom-ipq4019-rt-acrh17.dts | 271 +++++++++++ .../arm/boot/dts/qcom-ipq8064-wxr-2533dhp.dts | 448 ++++++++++++++++++ target/linux/ipq806x/image/Makefile | 22 +- 3 files changed, 739 insertions(+), 2 deletions(-) create mode 100644 target/linux/ipq806x/files-4.9/arch/arm/boot/dts/qcom-ipq4019-rt-acrh17.dts create mode 100644 target/linux/ipq806x/files-4.9/arch/arm/boot/dts/qcom-ipq8064-wxr-2533dhp.dts diff --git a/target/linux/ipq806x/files-4.9/arch/arm/boot/dts/qcom-ipq4019-rt-acrh17.dts b/target/linux/ipq806x/files-4.9/arch/arm/boot/dts/qcom-ipq4019-rt-acrh17.dts new file mode 100644 index 0000000000..1eb4b2e6f4 --- /dev/null +++ b/target/linux/ipq806x/files-4.9/arch/arm/boot/dts/qcom-ipq4019-rt-acrh17.dts @@ -0,0 +1,271 @@ +/* Copyright (c) 2015, The Linux Foundation. All rights reserved. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +#include "qcom-ipq4019-ap.dk01.1.dtsi" +#include "qcom-ipq4019-bus.dtsi" +#include +#include +#include + +/ { + model = "ASUS RT-ACRH17"; + compatible = "asus,rt-acrh17", "qcom,ipq4019"; + + memory { + device_type = "memory"; + reg = <0x80000000 0x10000000>; + }; + + aliases { + led-boot = &power; + led-failsafe = &power; + led-running = &power; + led-upgrade = &power; + }; + + reserved-memory { + #address-cells = <0x1>; + #size-cells = <0x1>; + ranges; + + rsvd1@87E00000 { + reg = <0x87e00000 0x200000>; + no-map; + }; + }; + + soc { + + tcsr@194b000 { + /* select hostmode */ + compatible = "qcom,tcsr"; + reg = <0x194b000 0x100>; + qcom,usb-hsphy-mode-select = ; + status = "ok"; + }; + + ess_tcsr@1953000 { + compatible = "qcom,tcsr"; + reg = <0x1953000 0x1000>; + qcom,ess-interface-select = ; + }; + + + tcsr@1949000 { + compatible = "qcom,tcsr"; + reg = <0x1949000 0x100>; + qcom,wifi_glb_cfg = ; + }; + + tcsr@1957000 { + compatible = "qcom,tcsr"; + reg = <0x1957000 0x100>; + qcom,wifi_noc_memtype_m0_m2 = ; + }; + + counter@4a1000 { + compatible = "qcom,qca-gcnt"; + reg = <0x4a1000 0x4>; + }; + + mdio@90000 { + status = "okay"; + }; + + ess-switch@c000000 { + status = "okay"; + }; + + ess-psgmii@98000 { + status = "okay"; + }; + + edma@c080000 { + status = "okay"; + }; + + wifi@a000000 { + status = "okay"; + }; + + wifi@a800000 { + status = "okay"; + }; + + cryptobam: dma@8e04000 { + status = "okay"; + }; + + crypto@8e3a000 { + status = "okay"; + }; + }; + + gpio-keys { + compatible = "gpio-keys"; + + reset { + label = "reset"; + gpios = <&tlmm 4 GPIO_ACTIVE_LOW>; + linux,code = ; + }; + + wps { + label = "wps"; + gpios = <&tlmm 63 GPIO_ACTIVE_LOW>; + linux,code = ; + }; + }; + + gpio-leds { + compatible = "gpio-leds"; + + power: status { + label = "rt-ac58u:blue:status"; + gpios = <&tlmm 3 GPIO_ACTIVE_HIGH>; + }; + + wan { + label = "rt-ac58u:blue:wan"; + gpios = <&tlmm 1 GPIO_ACTIVE_HIGH>; + }; + + wlan2G { + label = "rt-ac58u:blue:wlan2G"; + gpios = <&tlmm 58 GPIO_ACTIVE_HIGH>; + }; + + wan5G { + label = "rt-ac58u:blue:wlan5G"; + gpios = <&tlmm 5 GPIO_ACTIVE_HIGH>; + }; + + usb { + label = "rt-ac58u:blue:usb"; + gpios = <&tlmm 0 GPIO_ACTIVE_HIGH>; + }; + + lan { + label = "rt-ac58u:blue:lan"; + gpios = <&tlmm 2 GPIO_ACTIVE_HIGH>; + }; + }; +}; + +&spi_0_pins { + pinmux_cs { + function = "gpio"; + pins = "gpio54", "gpio59"; + }; + pinconf_cs { + pins = "gpio54", "gpio59"; + drive-strength = <2>; + bias-disable; + output-high; + }; +}; + + +&spi_0 { /* BLSP1 QUP1 */ + status = "ok"; + cs-gpios = <&tlmm 54 0>, + <&tlmm 59 0>; + + mx25l25635e@0 { + status = "disabled"; + }; + + m25p80@0 { + #address-cells = <1>; + #size-cells = <0>; + /* + * U-boot looks for "n25q128a11" node, + * if we don't have it, it will spit out the following warning: + * "ipq: fdt fixup unable to find compatible node". + */ + compatible = "mx25l1606e", "n25q128a11", "jedec,spi-nor"; + reg = <0>; + linux,modalias = "m25p80", "mx25l1606e", "n25q128a11"; + spi-max-frequency = <24000000>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition0@0 { + label = "SBL1"; + reg = <0x00000000 0x00040000>; + read-only; + }; + partition1@40000 { + label = "MIBIB"; + reg = <0x00040000 0x00020000>; + read-only; + }; + partition2@60000 { + label = "QSEE"; + reg = <0x00060000 0x00060000>; + read-only; + }; + partition3@c0000 { + label = "CDT"; + reg = <0x000c0000 0x00010000>; + read-only; + }; + partition4@d0000 { + label = "DDRPARAMS"; + reg = <0x000d0000 0x00010000>; + read-only; + }; + partition5@e0000 { + label = "APPSBLENV"; /* uboot env*/ + reg = <0x000e0000 0x00010000>; + read-only; + }; + partition5@f0000 { + label = "APPSBL"; /* uboot */ + reg = <0x000f0000 0x00080000>; + read-only; + }; + partition5@170000 { + label = "ART"; + reg = <0x00170000 0x00010000>; + read-only; + }; + /* 0x00180000 - 0x00200000 unused */ + }; + }; + + mt29f@1 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "spinand,mt29f", "w25n01gv"; + reg = <1>; + spi-max-frequency = <24000000>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition0@0 { + label = "ubi"; + reg = <0x00000000 0x08000000>; + }; + }; + }; +}; diff --git a/target/linux/ipq806x/files-4.9/arch/arm/boot/dts/qcom-ipq8064-wxr-2533dhp.dts b/target/linux/ipq806x/files-4.9/arch/arm/boot/dts/qcom-ipq8064-wxr-2533dhp.dts new file mode 100644 index 0000000000..2d6957e56b --- /dev/null +++ b/target/linux/ipq806x/files-4.9/arch/arm/boot/dts/qcom-ipq8064-wxr-2533dhp.dts @@ -0,0 +1,448 @@ +#include "qcom-ipq8064-v1.0.dtsi" + +#include + +/ { + model = "Buffalo WXR-2533DHP"; + compatible = "buffalo,wxr-2533dhp", "qcom,ipq8064"; + + memory@0 { + reg = <0x42000000 0x1e000000>; + device_type = "memory"; + }; + + reserved-memory { + #address-cells = <1>; + #size-cells = <1>; + ranges; + rsvd@41200000 { + reg = <0x41200000 0x300000>; + no-map; + }; + }; + + aliases { + serial0 = &uart4; + mdio-gpio0 = &mdio0; + + led-boot = &power_white; + led-failsafe = &power_orange; + led-running = &power_white; + led-upgrade = &power_orange; + }; + + chosen { + bootargs = "console=ttyMSM0,115200n8 ubi.mtd=0 ubi.block=0,1 root=/dev/ubiblock0_1 rootfstype=squashfs"; + linux,stdout-path = "serial0:115200n8"; + }; + + soc { + pinmux@800000 { + i2c4_pins: i2c4_pinmux { + mux { + pins = "gpio12", "gpio13"; + function = "gsbi4"; + drive-strength = <12>; + bias-disable; + }; + }; + + spi_pins: spi_pins { + mux { + pins = "gpio18", "gpio19", "gpio21"; + function = "gsbi5"; + drive-strength = <10>; + bias-none; + }; + }; + + nand_pins: nand_pins { + mux { + pins = "gpio34", "gpio35", "gpio36", + "gpio37", "gpio38", "gpio39", + "gpio40", "gpio41", "gpio42", + "gpio43", "gpio44", "gpio45", + "gpio46", "gpio47"; + function = "nand"; + drive-strength = <10>; + bias-disable; + }; + pullups { + pins = "gpio39"; + bias-pull-up; + }; + hold { + pins = "gpio40", "gpio41", "gpio42", + "gpio43", "gpio44", "gpio45", + "gpio46", "gpio47"; + bias-bus-hold; + }; + }; + + mdio0_pins: mdio0_pins { + mux { + pins = "gpio0", "gpio1"; + function = "gpio"; + drive-strength = <8>; + bias-disable; + }; + }; + + rgmii2_pins: rgmii2_pins { + mux { + pins = "gpio27", "gpio28", "gpio29", "gpio30", "gpio31", "gpio32", + "gpio51", "gpio52", "gpio59", "gpio60", "gpio61", "gpio62" ; + function = "rgmii2"; + drive-strength = <8>; + bias-disable; + }; + }; + + led_pins: led_pins { + mux { + pins = "gpio7", "gpio8", "gpio9", "gpio16", "gpio22", "gpio23", + "gpio24", "gpio25", "gpio26", "gpio53"; + function = "gpio"; + drive-strength = <2>; + bias-pull-up; + }; + }; + + button_pins: button_pins { + mux { + pins = "gpio54", "gpio65"; + function = "gpio"; + drive-strength = <2>; + bias-pull-up; + }; + }; + + }; + + nand@1ac00000 { + status = "ok"; + + pinctrl-0 = <&nand_pins>; + pinctrl-names = "default"; + + cs0 { + reg = <0>; + compatible = "qcom,nandcs"; + + nand-ecc-strength = <4>; + nand-bus-width = <8>; + nand-ecc-step-size = <512>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + rootfs@0000000 { + label = "rootfs"; + reg = <0x0000000 0x4000000>; + }; + + rootfs_1@4000000 { + label = "rootfs_1"; + reg = <0x4000000 0x4000000>; + }; + }; + }; + }; + + gsbi@16300000 { + qcom,mode = ; + status = "ok"; + + uart4: serial@16340000 { + status = "ok"; + }; + /* + * The i2c device on gsbi4 should not be enabled. + * On ipq806x designs gsbi4 i2c is meant for exclusive + * RPM usage. Turning this on in kernel manifests as + * i2c failure for the RPM. + */ + }; + + gsbi5: gsbi@1a200000 { + qcom,mode = ; + status = "ok"; + + spi5: spi@1a280000 { + status = "ok"; + + pinctrl-0 = <&spi_pins>; + pinctrl-names = "default"; + + cs-gpios = <&qcom_pinmux 20 GPIO_ACTIVE_HIGH>; + + flash: m25p80@0 { + compatible = "jedec,spi-nor"; + #address-cells = <1>; + #size-cells = <1>; + spi-max-frequency = <50000000>; + reg = <0>; + + SBL1@0 { + label = "SBL1"; + reg = <0x0 0x10000>; + read-only; + }; + + MIBIB@10000 { + label = "MIBIB"; + reg = <0x10000 0x20000>; + read-only; + }; + + SBL2@30000 { + label = "SBL2"; + reg = <0x30000 0x30000>; + read-only; + }; + + SBL3@60000 { + label = "SBL3"; + reg = <0x60000 0x30000>; + read-only; + }; + + DDRCONFIG@90000 { + label = "DDRCONFIG"; + reg = <0x90000 0x10000>; + read-only; + }; + + SSD@a0000 { + label = "SSD"; + reg = <0xa0000 0x10000>; + read-only; + }; + + TZ@b0000 { + label = "TZ"; + reg = <0xb0000 0x30000>; + read-only; + }; + + RPM@e0000 { + label = "RPM"; + reg = <0xe0000 0x20000>; + read-only; + }; + + APPSBL@100000 { + label = "APPSBL"; + reg = <0x100000 0x70000>; + read-only; + }; + + APPSBLENV@170000 { + label = "APPSBLENV"; + reg = <0x170000 0x10000>; + read-only; + }; + + ART: ART@180000 { + label = "ART"; + reg = <0x180000 0x40000>; + read-only; + }; + + BOOTCONFIG@1c0000 { + label = "OLDART"; + reg = <0x1c0000 0x10000>; + read-only; + }; + + APPSBL_1@1d0000 { + label = "APPSBL_1"; + reg = <0x1d0000 0x70000>; + }; + }; + }; + }; + + phy@100f8800 { /* USB3 port 1 HS phy */ + status = "ok"; + }; + + phy@100f8830 { /* USB3 port 1 SS phy */ + status = "ok"; + }; + + phy@110f8800 { /* USB3 port 0 HS phy */ + status = "ok"; + }; + + phy@110f8830 { /* USB3 port 0 SS phy */ + status = "ok"; + }; + + usb30@0 { + status = "ok"; + }; + + usb30@1 { + status = "ok"; + }; + + pcie0: pci@1b500000 { + status = "ok"; + phy-tx0-term-offset = <7>; + }; + + pcie1: pci@1b700000 { + status = "ok"; + phy-tx0-term-offset = <7>; + }; + + mdio0: mdio { + compatible = "virtual,mdio-gpio"; + #address-cells = <1>; + #size-cells = <0>; + gpios = <&qcom_pinmux 1 GPIO_ACTIVE_HIGH &qcom_pinmux 0 GPIO_ACTIVE_HIGH>; + pinctrl-0 = <&mdio0_pins>; + pinctrl-names = "default"; + + phy0: ethernet-phy@0 { + device_type = "ethernet-phy"; + reg = <0>; + qca,ar8327-initvals = < + 0x00004 0x7600000 /* PAD0_MODE */ + 0x00008 0x1000000 /* PAD5_MODE */ + 0x0000c 0x80 /* PAD6_MODE */ + 0x000e4 0x6a545 /* MAC_POWER_SEL */ + 0x000e0 0xc74164de /* SGMII_CTRL */ + 0x0007c 0x4e /* PORT0_STATUS */ + 0x00094 0x4e /* PORT6_STATUS */ + >; + }; + + phy4: ethernet-phy@4 { + device_type = "ethernet-phy"; + reg = <4>; + }; + }; + + gmac1: ethernet@37200000 { + status = "ok"; + phy-mode = "rgmii"; + qcom,id = <1>; + qcom,phy_mdio_addr = <4>; + qcom,poll_required = <1>; + qcom,rgmii_delay = <0>; + qcom,emulation = <0>; + pinctrl-0 = <&rgmii2_pins>; + pinctrl-names = "default"; + mtd-mac-address = <&ART 6>; + fixed-link { + speed = <1000>; + full-duplex; + }; + }; + //lan + gmac2: ethernet@37400000 { + status = "ok"; + phy-mode = "sgmii"; + qcom,id = <2>; + qcom,phy_mdio_addr = <0>; /* none */ + qcom,poll_required = <0>; /* no polling */ + qcom,rgmii_delay = <0>; + qcom,emulation = <0>; + mtd-mac-address = <&ART 0>; + fixed-link { + speed = <1000>; + full-duplex; + }; + }; + + rpm@108000 { + pinctrl-0 = <&i2c4_pins>; + pinctrl-names = "default"; + }; + }; + + gpio-keys { + compatible = "gpio-keys"; + pinctrl-0 = <&button_pins>; + pinctrl-names = "default"; + + reset { + label = "reset"; + gpios = <&qcom_pinmux 54 GPIO_ACTIVE_LOW>; + linux,code = ; + }; + + aoss { + label = "aoss"; + gpios = <&qcom_pinmux 65 GPIO_ACTIVE_LOW>; + linux,code = ; + }; + + }; + + gpio-leds { + compatible = "gpio-leds"; + pinctrl-0 = <&led_pins>; + pinctrl-names = "default"; + + power_white: power_white { + label = "wxr-2533dhp:white:power"; + gpios = <&qcom_pinmux 53 GPIO_ACTIVE_HIGH>; + default-state = "keep"; + }; + + power_orange: power_orange { + label = "wxr-2533dhp:orange:power"; + gpios = <&qcom_pinmux 9 GPIO_ACTIVE_HIGH>; + default-state = "keep"; + }; + + wireless_white: wireless_white { + label = "wxr-2533dhp:white:wireless"; + gpios = <&qcom_pinmux 24 GPIO_ACTIVE_HIGH>; + }; + + wireless_orange: wireless_orange { + label = "wxr-2533dhp:orange:wireless"; + gpios = <&qcom_pinmux 23 GPIO_ACTIVE_HIGH>; + }; + + internet_white: internet_white { + label = "wxr-2533dhp:white:internet"; + gpios = <&qcom_pinmux 22 GPIO_ACTIVE_HIGH>; + }; + + internet_orange: internet_orange { + label = "wxr-2533dhp:orange:internet"; + gpios = <&qcom_pinmux 16 GPIO_ACTIVE_HIGH>; + }; + + router_white: router_white { + label = "wxr-2533dhp:white:router"; + gpios = <&qcom_pinmux 26 GPIO_ACTIVE_LOW>; + }; + + router_orange: router_orange { + label = "wxr-2533dhp:orange:router"; + gpios = <&qcom_pinmux 25 GPIO_ACTIVE_HIGH>; + }; + + usb_green: usb_green { + label = "wxr-2533dhp:green:usb"; + gpios = <&qcom_pinmux 7 GPIO_ACTIVE_HIGH>; + }; + + guest_green: guest_green { + label = "wxr-2533dhp:green:guest"; + gpios = <&qcom_pinmux 8 GPIO_ACTIVE_HIGH>; + }; + }; +}; + +&adm_dma { + status = "ok"; +}; diff --git a/target/linux/ipq806x/image/Makefile b/target/linux/ipq806x/image/Makefile index d0a22242b3..09ce82b933 100644 --- a/target/linux/ipq806x/image/Makefile +++ b/target/linux/ipq806x/image/Makefile @@ -252,6 +252,24 @@ define Device/RT-AC58U DEVICE_PACKAGES := kmod-usb-phy-qcom-ipq4019 ipq-wifi-rt-ac58u endef +define Device/RT-ACRH17 + $(call Device/FitImageLzma) + DEVICE_DTS := qcom-ipq4019-rt-acrh17 + BLOCKSIZE := 128k + PAGESIZE := 2048 + DTB_SIZE := 65536 + BOARD_NAME := rt-acrh17 + KERNEL_LOADADDR := 0x80208000 + DEVICE_TITLE := Asus RT-ACRH17 + IMAGE_SIZE := 20439364 + FILESYSTEMS := squashfs + UIMAGE_NAME:=$(shell echo -e '\03\01\01\01RT-ACRH17') + IMAGES = sysupgrade.tar flash-factory.trx + IMAGE/flash-factory.trx := copy-file $(KDIR)/tmp/$$(KERNEL_INITRAMFS_IMAGE) | uImage none + IMAGE/sysupgrade.tar := sysupgrade-tar | append-metadata + DEVICE_PACKAGES := kmod-usb-phy-qcom-ipq4019 ipq-wifi-rt-ac58u ath10k-firmware-qca9984 +endef + define Device/NBG6817 DEVICE_DTS := qcom-ipq8065-nbg6817 KERNEL_SIZE := 4096k @@ -293,8 +311,8 @@ define Device/AP-DK04.1-C1 endef TARGET_DEVICES += AP148 AP148-legacy C2600 D7800 DB149 EA8500 FRITZ4040 R7500 \ - R7500v2 R7800 RT-AC58U NBG6817 VR2600v AP-DK04.1-C1 + R7500v2 R7800 RT-AC58U RT-ACRH17 NBG6817 VR2600v AP-DK04.1-C1 .NOTPARALLEL: -$(eval $(call BuildImage)) +$(eval $(call BuildImage)) \ No newline at end of file From 140a51482d00f5a88554c8e72b2e4a9e9e97c78f Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Tue, 24 Oct 2017 23:12:44 +0800 Subject: [PATCH 02/37] update kernel to 4.9.58 --- include/kernel-version.mk | 4 +- ...vert-to-current-get_user_pages-argum.patch | 2 +- ...ate-for-rename-of-page_cache_release.patch | 4 +- ...90-net-generalize-napi_complete_done.patch | 2 +- .../hack-4.9/904-debloat_dma_buf.patch | 2 +- .../pending-4.9/920-mangle_bootargs.patch | 4 +- ...Mangle-bootloader-s-kernel-arguments.patch | 4 +- .../601-net-support-layerscape.patch | 4 +- .../patches-4.9/0052-stmmac-form-4-12.patch | 464 +++++++++--------- 9 files changed, 234 insertions(+), 256 deletions(-) diff --git a/include/kernel-version.mk b/include/kernel-version.mk index 21e0c1f48e..2bddc87109 100644 --- a/include/kernel-version.mk +++ b/include/kernel-version.mk @@ -4,11 +4,11 @@ LINUX_RELEASE?=1 LINUX_VERSION-3.18 = .71 LINUX_VERSION-4.4 = .93 -LINUX_VERSION-4.9 = .57 +LINUX_VERSION-4.9 = .58 LINUX_KERNEL_HASH-3.18.71 = 5abc9778ad44ce02ed6c8ab52ece8a21c6d20d21f6ed8a19287b4a38a50c1240 LINUX_KERNEL_HASH-4.4.93 = ed349314f16e78a6571b5f8884f6452782aef6c26b81bcc7ccdac44ecd917c36 -LINUX_KERNEL_HASH-4.9.57 = 09230554ec6a34a12e2d2a6b32733aed3c9bc90b1662cc1b06dd67bf726c96a6 +LINUX_KERNEL_HASH-4.9.58 = 748f12a28689644b6a9102c67f8fa7938ca73823a949ba6f65024aecf2f221a7 ifdef KERNEL_PATCHVER LINUX_VERSION:=$(KERNEL_PATCHVER)$(strip $(LINUX_VERSION-$(KERNEL_PATCHVER))) diff --git a/target/linux/brcm2708/patches-4.9/950-0100-staging-vchi-Convert-to-current-get_user_pages-argum.patch b/target/linux/brcm2708/patches-4.9/950-0100-staging-vchi-Convert-to-current-get_user_pages-argum.patch index e80c414633..e5038ab647 100644 --- a/target/linux/brcm2708/patches-4.9/950-0100-staging-vchi-Convert-to-current-get_user_pages-argum.patch +++ b/target/linux/brcm2708/patches-4.9/950-0100-staging-vchi-Convert-to-current-get_user_pages-argum.patch @@ -11,7 +11,7 @@ Signed-off-by: Eric Anholt --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c -@@ -420,7 +420,7 @@ create_pagelist(char __user *buf, size_t +@@ -426,7 +426,7 @@ create_pagelist(char __user *buf, size_t *need_release = 0; /* do not try and release vmalloc pages */ } else { down_read(&task->mm->mmap_sem); diff --git a/target/linux/brcm2708/patches-4.9/950-0101-staging-vchi-Update-for-rename-of-page_cache_release.patch b/target/linux/brcm2708/patches-4.9/950-0101-staging-vchi-Update-for-rename-of-page_cache_release.patch index 8979bc2f6f..5cc5ff1651 100644 --- a/target/linux/brcm2708/patches-4.9/950-0101-staging-vchi-Update-for-rename-of-page_cache_release.patch +++ b/target/linux/brcm2708/patches-4.9/950-0101-staging-vchi-Update-for-rename-of-page_cache_release.patch @@ -12,7 +12,7 @@ Signed-off-by: Eric Anholt --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c -@@ -438,7 +438,7 @@ create_pagelist(char __user *buf, size_t +@@ -444,7 +444,7 @@ create_pagelist(char __user *buf, size_t while (actual_pages > 0) { actual_pages--; @@ -21,7 +21,7 @@ Signed-off-by: Eric Anholt } kfree(pagelist); if (actual_pages == 0) -@@ -579,7 +579,7 @@ free_pagelist(PAGELIST_T *pagelist, int +@@ -585,7 +585,7 @@ free_pagelist(PAGELIST_T *pagelist, int offset = 0; set_page_dirty(pg); } diff --git a/target/linux/generic/backport-4.9/090-net-generalize-napi_complete_done.patch b/target/linux/generic/backport-4.9/090-net-generalize-napi_complete_done.patch index e1541e90a9..d7b7b48979 100644 --- a/target/linux/generic/backport-4.9/090-net-generalize-napi_complete_done.patch +++ b/target/linux/generic/backport-4.9/090-net-generalize-napi_complete_done.patch @@ -819,7 +819,7 @@ Signed-off-by: David S. Miller --- a/drivers/net/ethernet/marvell/mvpp2.c +++ b/drivers/net/ethernet/marvell/mvpp2.c -@@ -5405,7 +5405,7 @@ static int mvpp2_poll(struct napi_struct +@@ -5404,7 +5404,7 @@ static int mvpp2_poll(struct napi_struct if (budget > 0) { cause_rx = 0; diff --git a/target/linux/generic/hack-4.9/904-debloat_dma_buf.patch b/target/linux/generic/hack-4.9/904-debloat_dma_buf.patch index 4f432c3568..b9a5c1dca2 100644 --- a/target/linux/generic/hack-4.9/904-debloat_dma_buf.patch +++ b/target/linux/generic/hack-4.9/904-debloat_dma_buf.patch @@ -54,7 +54,7 @@ Signed-off-by: Felix Fietkau +MODULE_LICENSE("GPL"); --- a/kernel/sched/core.c +++ b/kernel/sched/core.c -@@ -2170,6 +2170,7 @@ int wake_up_state(struct task_struct *p, +@@ -2171,6 +2171,7 @@ int wake_up_state(struct task_struct *p, { return try_to_wake_up(p, state, 0); } diff --git a/target/linux/generic/pending-4.9/920-mangle_bootargs.patch b/target/linux/generic/pending-4.9/920-mangle_bootargs.patch index dc996808dd..a985a7c952 100644 --- a/target/linux/generic/pending-4.9/920-mangle_bootargs.patch +++ b/target/linux/generic/pending-4.9/920-mangle_bootargs.patch @@ -31,7 +31,7 @@ Signed-off-by: Imre Kaloz help --- a/init/main.c +++ b/init/main.c -@@ -352,6 +352,29 @@ static inline void setup_nr_cpu_ids(void +@@ -351,6 +351,29 @@ static inline void setup_nr_cpu_ids(void static inline void smp_prepare_cpus(unsigned int maxcpus) { } #endif @@ -61,7 +61,7 @@ Signed-off-by: Imre Kaloz /* * We need to store the untouched command line for future reference. * We also need to store the touched command line since the parameter -@@ -504,6 +527,7 @@ asmlinkage __visible void __init start_k +@@ -503,6 +526,7 @@ asmlinkage __visible void __init start_k pr_notice("%s", linux_banner); setup_arch(&command_line); mm_init_cpumask(&init_mm); diff --git a/target/linux/ipq806x/patches-4.9/0067-generic-Mangle-bootloader-s-kernel-arguments.patch b/target/linux/ipq806x/patches-4.9/0067-generic-Mangle-bootloader-s-kernel-arguments.patch index d34e08ff62..467ffbf220 100644 --- a/target/linux/ipq806x/patches-4.9/0067-generic-Mangle-bootloader-s-kernel-arguments.patch +++ b/target/linux/ipq806x/patches-4.9/0067-generic-Mangle-bootloader-s-kernel-arguments.patch @@ -157,7 +157,7 @@ Signed-off-by: Adrian Panella } --- a/init/main.c +++ b/init/main.c -@@ -88,6 +88,10 @@ +@@ -87,6 +87,10 @@ #include #include @@ -168,7 +168,7 @@ Signed-off-by: Adrian Panella static int kernel_init(void *); extern void init_IRQ(void); -@@ -538,6 +542,18 @@ asmlinkage __visible void __init start_k +@@ -537,6 +541,18 @@ asmlinkage __visible void __init start_k page_alloc_init(); pr_notice("Kernel command line: %s\n", boot_command_line); diff --git a/target/linux/layerscape/patches-4.9/601-net-support-layerscape.patch b/target/linux/layerscape/patches-4.9/601-net-support-layerscape.patch index 7f94776745..9db40dc2ff 100644 --- a/target/linux/layerscape/patches-4.9/601-net-support-layerscape.patch +++ b/target/linux/layerscape/patches-4.9/601-net-support-layerscape.patch @@ -962,7 +962,7 @@ Signed-off-by: Yangbo Lu /* Rx descriptors helper methods */ --- a/drivers/net/ethernet/marvell/mvpp2.c +++ b/drivers/net/ethernet/marvell/mvpp2.c -@@ -5762,7 +5762,7 @@ error: +@@ -5761,7 +5761,7 @@ error: return err; } @@ -971,7 +971,7 @@ Signed-off-by: Yangbo Lu mvpp2_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) { struct mvpp2_port *port = netdev_priv(dev); -@@ -5794,8 +5794,6 @@ mvpp2_get_stats64(struct net_device *dev +@@ -5793,8 +5793,6 @@ mvpp2_get_stats64(struct net_device *dev stats->rx_errors = dev->stats.rx_errors; stats->rx_dropped = dev->stats.rx_dropped; stats->tx_dropped = dev->stats.tx_dropped; diff --git a/target/linux/sunxi/patches-4.9/0052-stmmac-form-4-12.patch b/target/linux/sunxi/patches-4.9/0052-stmmac-form-4-12.patch index a5cdec5525..285e4d2762 100644 --- a/target/linux/sunxi/patches-4.9/0052-stmmac-form-4-12.patch +++ b/target/linux/sunxi/patches-4.9/0052-stmmac-form-4-12.patch @@ -2887,7 +2887,7 @@ + + /* Display RX ring */ + priv->hw->desc->display_ring(head_rx, DMA_RX_SIZE, true); -+ } + } +} + +static void stmmac_display_tx_rings(struct stmmac_priv *priv) @@ -2906,15 +2906,15 @@ + head_tx = (void *)tx_q->dma_etx; + else + head_tx = (void *)tx_q->dma_tx; -+ -+ priv->hw->desc->display_ring(head_tx, DMA_TX_SIZE, false); - } -+} - /* Display Rx ring */ - priv->hw->desc->display_ring(head_rx, DMA_RX_SIZE, true); - /* Display Tx ring */ - priv->hw->desc->display_ring(head_tx, DMA_TX_SIZE, false); ++ priv->hw->desc->display_ring(head_tx, DMA_TX_SIZE, false); ++ } ++} ++ +static void stmmac_display_rings(struct stmmac_priv *priv) +{ + /* Display RX ring */ @@ -3131,7 +3131,7 @@ if (priv->hw->mode->set_16kib_bfsize) bfsize = priv->hw->mode->set_16kib_bfsize(dev->mtu); -@@ -1018,257 +1228,516 @@ static int init_dma_desc_rings(struct ne +@@ -1018,235 +1228,409 @@ static int init_dma_desc_rings(struct ne priv->dma_buf_sz = bfsize; @@ -3163,10 +3163,7 @@ + p = &((rx_q->dma_erx + i)->basic); + else + p = rx_q->dma_rx + i; - -- ret = stmmac_init_rx_buffers(priv, p, i, flags); -- if (ret) -- goto err_init_rx_buffers; ++ + ret = stmmac_init_rx_buffers(priv, p, i, flags, + queue); + if (ret) @@ -3176,15 +3173,18 @@ + rx_q->rx_skbuff[i], rx_q->rx_skbuff[i]->data, + (unsigned int)rx_q->rx_skbuff_dma[i]); + } -+ + +- ret = stmmac_init_rx_buffers(priv, p, i, flags); +- if (ret) +- goto err_init_rx_buffers; + rx_q->cur_rx = 0; + rx_q->dirty_rx = (unsigned int)(i - DMA_RX_SIZE); -+ -+ stmmac_clear_rx_descriptors(priv, queue); - netif_dbg(priv, probe, priv->dev, "[%p]\t[%p]\t[%x]\n", - priv->rx_skbuff[i], priv->rx_skbuff[i]->data, - (unsigned int)priv->rx_skbuff_dma[i]); ++ stmmac_clear_rx_descriptors(priv, queue); ++ + /* Setup the chained descriptor addresses */ + if (priv->mode == STMMAC_CHAIN_MODE) { + if (priv->extend_desc) @@ -3277,13 +3277,8 @@ + priv->hw->mode->init(tx_q->dma_tx, + tx_q->dma_tx_phy, + DMA_TX_SIZE, 0); - } - -- priv->tx_skbuff_dma[i].buf = 0; -- priv->tx_skbuff_dma[i].map_as_page = false; -- priv->tx_skbuff_dma[i].len = 0; -- priv->tx_skbuff_dma[i].last_segment = false; -- priv->tx_skbuff[i] = NULL; ++ } ++ + for (i = 0; i < DMA_TX_SIZE; i++) { + struct dma_desc *p; + if (priv->extend_desc) @@ -3305,8 +3300,13 @@ + tx_q->tx_skbuff_dma[i].len = 0; + tx_q->tx_skbuff_dma[i].last_segment = false; + tx_q->tx_skbuff[i] = NULL; -+ } -+ + } + +- priv->tx_skbuff_dma[i].buf = 0; +- priv->tx_skbuff_dma[i].map_as_page = false; +- priv->tx_skbuff_dma[i].len = 0; +- priv->tx_skbuff_dma[i].last_segment = false; +- priv->tx_skbuff[i] = NULL; + tx_q->dirty_tx = 0; + tx_q->cur_tx = 0; + @@ -3387,10 +3387,17 @@ - priv->tx_skbuff_dma[i].buf, - priv->tx_skbuff_dma[i].len, - DMA_TO_DEVICE); +- } + for (i = 0; i < DMA_TX_SIZE; i++) + stmmac_free_tx_buffer(priv, queue, i); +} -+ + +- if (priv->tx_skbuff[i]) { +- dev_kfree_skb_any(priv->tx_skbuff[i]); +- priv->tx_skbuff[i] = NULL; +- priv->tx_skbuff_dma[i].buf = 0; +- priv->tx_skbuff_dma[i].map_as_page = false; +- } +/** + * free_dma_rx_desc_resources - free RX dma desc resources + * @priv: private structure @@ -3419,10 +3426,11 @@ + + kfree(rx_q->rx_skbuff_dma); + kfree(rx_q->rx_skbuff); -+ } -+} -+ -+/** + } + } + + /** +- * alloc_dma_desc_resources - alloc TX/RX resources. + * free_dma_tx_desc_resources - free TX dma desc resources + * @priv: private structure + */ @@ -3455,36 +3463,90 @@ + +/** + * alloc_dma_rx_desc_resources - alloc RX resources. -+ * @priv: private structure -+ * Description: according to which descriptor can be used (extend or basic) -+ * this function allocates the resources for TX and RX paths. In case of -+ * reception, for example, it pre-allocated the RX socket buffer in order to -+ * allow zero-copy mechanism. -+ */ + * @priv: private structure + * Description: according to which descriptor can be used (extend or basic) + * this function allocates the resources for TX and RX paths. In case of + * reception, for example, it pre-allocated the RX socket buffer in order to + * allow zero-copy mechanism. + */ +-static int alloc_dma_desc_resources(struct stmmac_priv *priv) +static int alloc_dma_rx_desc_resources(struct stmmac_priv *priv) -+{ + { + u32 rx_count = priv->plat->rx_queues_to_use; -+ int ret = -ENOMEM; + int ret = -ENOMEM; + u32 queue; -+ + +- priv->rx_skbuff_dma = kmalloc_array(DMA_RX_SIZE, sizeof(dma_addr_t), +- GFP_KERNEL); +- if (!priv->rx_skbuff_dma) +- return -ENOMEM; + /* RX queues buffers and DMA */ + for (queue = 0; queue < rx_count; queue++) { + struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; -+ + +- priv->rx_skbuff = kmalloc_array(DMA_RX_SIZE, sizeof(struct sk_buff *), +- GFP_KERNEL); +- if (!priv->rx_skbuff) +- goto err_rx_skbuff; +- +- priv->tx_skbuff_dma = kmalloc_array(DMA_TX_SIZE, +- sizeof(*priv->tx_skbuff_dma), +- GFP_KERNEL); +- if (!priv->tx_skbuff_dma) +- goto err_tx_skbuff_dma; +- +- priv->tx_skbuff = kmalloc_array(DMA_TX_SIZE, sizeof(struct sk_buff *), +- GFP_KERNEL); +- if (!priv->tx_skbuff) +- goto err_tx_skbuff; +- +- if (priv->extend_desc) { +- priv->dma_erx = dma_zalloc_coherent(priv->device, DMA_RX_SIZE * +- sizeof(struct +- dma_extended_desc), +- &priv->dma_rx_phy, +- GFP_KERNEL); +- if (!priv->dma_erx) +- goto err_dma; + rx_q->queue_index = queue; + rx_q->priv_data = priv; -+ + +- priv->dma_etx = dma_zalloc_coherent(priv->device, DMA_TX_SIZE * +- sizeof(struct +- dma_extended_desc), +- &priv->dma_tx_phy, + rx_q->rx_skbuff_dma = kmalloc_array(DMA_RX_SIZE, + sizeof(dma_addr_t), -+ GFP_KERNEL); + GFP_KERNEL); +- if (!priv->dma_etx) { +- dma_free_coherent(priv->device, DMA_RX_SIZE * +- sizeof(struct dma_extended_desc), +- priv->dma_erx, priv->dma_rx_phy); +- goto err_dma; +- } +- } else { +- priv->dma_rx = dma_zalloc_coherent(priv->device, DMA_RX_SIZE * +- sizeof(struct dma_desc), +- &priv->dma_rx_phy, +- GFP_KERNEL); +- if (!priv->dma_rx) +- goto err_dma; + if (!rx_q->rx_skbuff_dma) + return -ENOMEM; -+ + +- priv->dma_tx = dma_zalloc_coherent(priv->device, DMA_TX_SIZE * +- sizeof(struct dma_desc), +- &priv->dma_tx_phy, +- GFP_KERNEL); +- if (!priv->dma_tx) { +- dma_free_coherent(priv->device, DMA_RX_SIZE * +- sizeof(struct dma_desc), +- priv->dma_rx, priv->dma_rx_phy); + rx_q->rx_skbuff = kmalloc_array(DMA_RX_SIZE, + sizeof(struct sk_buff *), + GFP_KERNEL); + if (!rx_q->rx_skbuff) -+ goto err_dma; + goto err_dma; + + if (priv->extend_desc) { + rx_q->dma_erx = dma_zalloc_coherent(priv->device, @@ -3505,12 +3567,19 @@ + GFP_KERNEL); + if (!rx_q->dma_rx) + goto err_dma; -+ } -+ } -+ -+ return 0; -+ -+err_dma: + } + } + + return 0; + + err_dma: +- kfree(priv->tx_skbuff); +-err_tx_skbuff: +- kfree(priv->tx_skbuff_dma); +-err_tx_skbuff_dma: +- kfree(priv->rx_skbuff); +-err_rx_skbuff: +- kfree(priv->rx_skbuff_dma); + free_dma_rx_desc_resources(priv); + + return ret; @@ -3567,7 +3636,7 @@ + GFP_KERNEL); + if (!tx_q->dma_tx) + goto err_dma_buffers; - } ++ } + } + + return 0; @@ -3575,9 +3644,9 @@ +err_dma_buffers: + free_dma_tx_desc_resources(priv); + -+ return ret; -+} -+ + return ret; + } + +/** + * alloc_dma_desc_resources - alloc TX/RX resources. + * @priv: private structure @@ -3603,176 +3672,7 @@ + * free_dma_desc_resources - free dma desc resources + * @priv: private structure + */ -+static void free_dma_desc_resources(struct stmmac_priv *priv) -+{ -+ /* Release the DMA RX socket buffers */ -+ free_dma_rx_desc_resources(priv); -+ -+ /* Release the DMA TX socket buffers */ -+ free_dma_tx_desc_resources(priv); -+} -+ -+/** -+ * stmmac_mac_enable_rx_queues - Enable MAC rx queues -+ * @priv: driver private structure -+ * Description: It is used for enabling the rx queues in the MAC -+ */ -+static void stmmac_mac_enable_rx_queues(struct stmmac_priv *priv) -+{ -+ u32 rx_queues_count = priv->plat->rx_queues_to_use; -+ int queue; -+ u8 mode; - -- if (priv->tx_skbuff[i]) { -- dev_kfree_skb_any(priv->tx_skbuff[i]); -- priv->tx_skbuff[i] = NULL; -- priv->tx_skbuff_dma[i].buf = 0; -- priv->tx_skbuff_dma[i].map_as_page = false; -- } -+ for (queue = 0; queue < rx_queues_count; queue++) { -+ mode = priv->plat->rx_queues_cfg[queue].mode_to_use; -+ priv->hw->mac->rx_queue_enable(priv->hw, mode, queue); - } - } - - /** -- * alloc_dma_desc_resources - alloc TX/RX resources. -- * @priv: private structure -- * Description: according to which descriptor can be used (extend or basic) -- * this function allocates the resources for TX and RX paths. In case of -- * reception, for example, it pre-allocated the RX socket buffer in order to -- * allow zero-copy mechanism. -+ * stmmac_start_rx_dma - start RX DMA channel -+ * @priv: driver private structure -+ * @chan: RX channel index -+ * Description: -+ * This starts a RX DMA channel - */ --static int alloc_dma_desc_resources(struct stmmac_priv *priv) -+static void stmmac_start_rx_dma(struct stmmac_priv *priv, u32 chan) - { -- int ret = -ENOMEM; -- -- priv->rx_skbuff_dma = kmalloc_array(DMA_RX_SIZE, sizeof(dma_addr_t), -- GFP_KERNEL); -- if (!priv->rx_skbuff_dma) -- return -ENOMEM; -- -- priv->rx_skbuff = kmalloc_array(DMA_RX_SIZE, sizeof(struct sk_buff *), -- GFP_KERNEL); -- if (!priv->rx_skbuff) -- goto err_rx_skbuff; -- -- priv->tx_skbuff_dma = kmalloc_array(DMA_TX_SIZE, -- sizeof(*priv->tx_skbuff_dma), -- GFP_KERNEL); -- if (!priv->tx_skbuff_dma) -- goto err_tx_skbuff_dma; -- -- priv->tx_skbuff = kmalloc_array(DMA_TX_SIZE, sizeof(struct sk_buff *), -- GFP_KERNEL); -- if (!priv->tx_skbuff) -- goto err_tx_skbuff; -- -- if (priv->extend_desc) { -- priv->dma_erx = dma_zalloc_coherent(priv->device, DMA_RX_SIZE * -- sizeof(struct -- dma_extended_desc), -- &priv->dma_rx_phy, -- GFP_KERNEL); -- if (!priv->dma_erx) -- goto err_dma; -- -- priv->dma_etx = dma_zalloc_coherent(priv->device, DMA_TX_SIZE * -- sizeof(struct -- dma_extended_desc), -- &priv->dma_tx_phy, -- GFP_KERNEL); -- if (!priv->dma_etx) { -- dma_free_coherent(priv->device, DMA_RX_SIZE * -- sizeof(struct dma_extended_desc), -- priv->dma_erx, priv->dma_rx_phy); -- goto err_dma; -- } -- } else { -- priv->dma_rx = dma_zalloc_coherent(priv->device, DMA_RX_SIZE * -- sizeof(struct dma_desc), -- &priv->dma_rx_phy, -- GFP_KERNEL); -- if (!priv->dma_rx) -- goto err_dma; -+ netdev_dbg(priv->dev, "DMA RX processes started in channel %d\n", chan); -+ priv->hw->dma->start_rx(priv->ioaddr, chan); -+} - -- priv->dma_tx = dma_zalloc_coherent(priv->device, DMA_TX_SIZE * -- sizeof(struct dma_desc), -- &priv->dma_tx_phy, -- GFP_KERNEL); -- if (!priv->dma_tx) { -- dma_free_coherent(priv->device, DMA_RX_SIZE * -- sizeof(struct dma_desc), -- priv->dma_rx, priv->dma_rx_phy); -- goto err_dma; -- } -- } -+/** -+ * stmmac_start_tx_dma - start TX DMA channel -+ * @priv: driver private structure -+ * @chan: TX channel index -+ * Description: -+ * This starts a TX DMA channel -+ */ -+static void stmmac_start_tx_dma(struct stmmac_priv *priv, u32 chan) -+{ -+ netdev_dbg(priv->dev, "DMA TX processes started in channel %d\n", chan); -+ priv->hw->dma->start_tx(priv->ioaddr, chan); -+} - -- return 0; -+/** -+ * stmmac_stop_rx_dma - stop RX DMA channel -+ * @priv: driver private structure -+ * @chan: RX channel index -+ * Description: -+ * This stops a RX DMA channel -+ */ -+static void stmmac_stop_rx_dma(struct stmmac_priv *priv, u32 chan) -+{ -+ netdev_dbg(priv->dev, "DMA RX processes stopped in channel %d\n", chan); -+ priv->hw->dma->stop_rx(priv->ioaddr, chan); -+} - --err_dma: -- kfree(priv->tx_skbuff); --err_tx_skbuff: -- kfree(priv->tx_skbuff_dma); --err_tx_skbuff_dma: -- kfree(priv->rx_skbuff); --err_rx_skbuff: -- kfree(priv->rx_skbuff_dma); -- return ret; -+/** -+ * stmmac_stop_tx_dma - stop TX DMA channel -+ * @priv: driver private structure -+ * @chan: TX channel index -+ * Description: -+ * This stops a TX DMA channel -+ */ -+static void stmmac_stop_tx_dma(struct stmmac_priv *priv, u32 chan) -+{ -+ netdev_dbg(priv->dev, "DMA TX processes stopped in channel %d\n", chan); -+ priv->hw->dma->stop_tx(priv->ioaddr, chan); - } - --static void free_dma_desc_resources(struct stmmac_priv *priv) -+/** -+ * stmmac_start_all_dma - start all RX and TX DMA channels -+ * @priv: driver private structure -+ * Description: -+ * This starts all the RX and TX DMA channels -+ */ -+static void stmmac_start_all_dma(struct stmmac_priv *priv) + static void free_dma_desc_resources(struct stmmac_priv *priv) { - /* Release the DMA TX/RX socket buffers */ - dma_free_rx_skbufs(priv); @@ -3798,6 +3698,99 @@ - kfree(priv->rx_skbuff); - kfree(priv->tx_skbuff_dma); - kfree(priv->tx_skbuff); ++ /* Release the DMA RX socket buffers */ ++ free_dma_rx_desc_resources(priv); ++ ++ /* Release the DMA TX socket buffers */ ++ free_dma_tx_desc_resources(priv); + } + + /** +@@ -1256,19 +1640,104 @@ static void free_dma_desc_resources(stru + */ + static void stmmac_mac_enable_rx_queues(struct stmmac_priv *priv) + { +- int rx_count = priv->dma_cap.number_rx_queues; +- int queue = 0; ++ u32 rx_queues_count = priv->plat->rx_queues_to_use; ++ int queue; ++ u8 mode; + +- /* If GMAC does not have multiple queues, then this is not necessary*/ +- if (rx_count == 1) +- return; ++ for (queue = 0; queue < rx_queues_count; queue++) { ++ mode = priv->plat->rx_queues_cfg[queue].mode_to_use; ++ priv->hw->mac->rx_queue_enable(priv->hw, mode, queue); ++ } ++} + +- /** +- * If the core is synthesized with multiple rx queues / multiple +- * dma channels, then rx queues will be disabled by default. +- * For now only rx queue 0 is enabled. +- */ +- priv->hw->mac->rx_queue_enable(priv->hw, queue); ++/** ++ * stmmac_start_rx_dma - start RX DMA channel ++ * @priv: driver private structure ++ * @chan: RX channel index ++ * Description: ++ * This starts a RX DMA channel ++ */ ++static void stmmac_start_rx_dma(struct stmmac_priv *priv, u32 chan) ++{ ++ netdev_dbg(priv->dev, "DMA RX processes started in channel %d\n", chan); ++ priv->hw->dma->start_rx(priv->ioaddr, chan); ++} ++ ++/** ++ * stmmac_start_tx_dma - start TX DMA channel ++ * @priv: driver private structure ++ * @chan: TX channel index ++ * Description: ++ * This starts a TX DMA channel ++ */ ++static void stmmac_start_tx_dma(struct stmmac_priv *priv, u32 chan) ++{ ++ netdev_dbg(priv->dev, "DMA TX processes started in channel %d\n", chan); ++ priv->hw->dma->start_tx(priv->ioaddr, chan); ++} ++ ++/** ++ * stmmac_stop_rx_dma - stop RX DMA channel ++ * @priv: driver private structure ++ * @chan: RX channel index ++ * Description: ++ * This stops a RX DMA channel ++ */ ++static void stmmac_stop_rx_dma(struct stmmac_priv *priv, u32 chan) ++{ ++ netdev_dbg(priv->dev, "DMA RX processes stopped in channel %d\n", chan); ++ priv->hw->dma->stop_rx(priv->ioaddr, chan); ++} ++ ++/** ++ * stmmac_stop_tx_dma - stop TX DMA channel ++ * @priv: driver private structure ++ * @chan: TX channel index ++ * Description: ++ * This stops a TX DMA channel ++ */ ++static void stmmac_stop_tx_dma(struct stmmac_priv *priv, u32 chan) ++{ ++ netdev_dbg(priv->dev, "DMA TX processes stopped in channel %d\n", chan); ++ priv->hw->dma->stop_tx(priv->ioaddr, chan); ++} ++ ++/** ++ * stmmac_start_all_dma - start all RX and TX DMA channels ++ * @priv: driver private structure ++ * Description: ++ * This starts all the RX and TX DMA channels ++ */ ++static void stmmac_start_all_dma(struct stmmac_priv *priv) ++{ + u32 rx_channels_count = priv->plat->rx_queues_to_use; + u32 tx_channels_count = priv->plat->tx_queues_to_use; + u32 chan = 0; @@ -3807,38 +3800,23 @@ + + for (chan = 0; chan < tx_channels_count; chan++) + stmmac_start_tx_dma(priv, chan); - } - - /** -- * stmmac_mac_enable_rx_queues - Enable MAC rx queues -- * @priv: driver private structure -- * Description: It is used for enabling the rx queues in the MAC ++} ++ ++/** + * stmmac_stop_all_dma - stop all RX and TX DMA channels + * @priv: driver private structure + * Description: + * This stops the RX and TX DMA channels - */ --static void stmmac_mac_enable_rx_queues(struct stmmac_priv *priv) ++ */ +static void stmmac_stop_all_dma(struct stmmac_priv *priv) - { -- int rx_count = priv->dma_cap.number_rx_queues; -- int queue = 0; ++{ + u32 rx_channels_count = priv->plat->rx_queues_to_use; + u32 tx_channels_count = priv->plat->tx_queues_to_use; + u32 chan = 0; - -- /* If GMAC does not have multiple queues, then this is not necessary*/ -- if (rx_count == 1) -- return; ++ + for (chan = 0; chan < rx_channels_count; chan++) + stmmac_stop_rx_dma(priv, chan); - -- /** -- * If the core is synthesized with multiple rx queues / multiple -- * dma channels, then rx queues will be disabled by default. -- * For now only rx queue 0 is enabled. -- */ -- priv->hw->mac->rx_queue_enable(priv->hw, queue); ++ + for (chan = 0; chan < tx_channels_count; chan++) + stmmac_stop_tx_dma(priv, chan); } From 903264764508dfceb4f73020afc7dc723dbea617 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Tue, 24 Oct 2017 23:15:26 +0800 Subject: [PATCH 03/37] update ar71xx to kernel 4.9 again --- target/linux/ar71xx/Makefile | 2 +- target/linux/ar71xx/config-4.4 | 3 +- .../arch/mips/ath79/mach-archer-c25-v1.c | 18 +++---- .../arch/mips/ath79/mach-archer-c59-v1.c | 18 +++---- .../files/arch/mips/ath79/mach-archer-c7-v4.c | 2 +- .../ar71xx/files/arch/mips/ath79/mach-rb91x.c | 2 +- .../files/arch/mips/ath79/mach-tl-wr942n-v1.c | 18 +++---- .../files/drivers/mtd/nand/rb4xx_nand.c | 48 +++++++++++++++---- .../files/drivers/mtd/nand/rb750_nand.c | 43 +++++++++++++---- .../files/drivers/mtd/nand/rb91x_nand.c | 44 +++++++++++++---- target/linux/ar71xx/image/generic.mk | 1 - .../ar71xx/image/lzma-loader/src/Makefile | 8 ++-- .../linux/ar71xx/image/lzma-loader/src/head.S | 13 +++++ target/linux/ar71xx/image/tp-link.mk | 5 +- target/linux/ar71xx/image/ubnt.mk | 1 - target/linux/ar71xx/mikrotik/config-default | 1 + 16 files changed, 160 insertions(+), 67 deletions(-) diff --git a/target/linux/ar71xx/Makefile b/target/linux/ar71xx/Makefile index 3f5bc67243..6d5b4c52b3 100644 --- a/target/linux/ar71xx/Makefile +++ b/target/linux/ar71xx/Makefile @@ -13,7 +13,7 @@ FEATURES:=usbgadget CPU_TYPE:=24kc SUBTARGETS:=generic nand mikrotik -KERNEL_PATCHVER:=4.4 +KERNEL_PATCHVER:=4.9 include $(INCLUDE_DIR)/target.mk diff --git a/target/linux/ar71xx/config-4.4 b/target/linux/ar71xx/config-4.4 index 1f4d9f4c32..4793bf4deb 100644 --- a/target/linux/ar71xx/config-4.4 +++ b/target/linux/ar71xx/config-4.4 @@ -223,8 +223,8 @@ CONFIG_ATH79_MACH_UBNT=y CONFIG_ATH79_MACH_UBNT_UNIFIAC=y CONFIG_ATH79_MACH_UBNT_XM=y CONFIG_ATH79_MACH_WEIO=y -CONFIG_ATH79_MACH_WHR_HP_G300N=y # CONFIG_ATH79_MACH_WI2A_AC200I is not set +CONFIG_ATH79_MACH_WHR_HP_G300N=y CONFIG_ATH79_MACH_WLAE_AG300N=y CONFIG_ATH79_MACH_WLR8100=y CONFIG_ATH79_MACH_WNDAP360=y @@ -374,7 +374,6 @@ CONFIG_MIPS_CLOCK_VSYSCALL=y CONFIG_MIPS_CMDLINE_FROM_BOOTLOADER=y # CONFIG_MIPS_CMDLINE_FROM_DTB is not set # CONFIG_MIPS_ELF_APPENDED_DTB is not set -CONFIG_MIPS_FPU_EMULATOR=y # CONFIG_MIPS_HUGE_TLB_SUPPORT is not set CONFIG_MIPS_L1_CACHE_SHIFT=5 CONFIG_MIPS_MACHINE=y diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c index 9e08c157e4..c6c6463224 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c @@ -35,15 +35,15 @@ #define ARCHER_C25_GPIO_SHIFT_SRCLR 19 /* MR, Master Reset */ #define ARCHER_C25_GPIO_SHIFT_RCLK 16 /* STCP, Storage Reg Clock Input */ -#define ARCHER_C25_74HC_GPIO_BASE QCA956X_GPIO_COUNT -#define ARCHER_C25_74HC_GPIO_LED_WAN_AMBER 27 -#define ARCHER_C25_74HC_GPIO_LED_WAN_GREEN 28 -#define ARCHER_C25_74HC_GPIO_LED_WLAN2 29 -#define ARCHER_C25_74HC_GPIO_LED_WLAN5 30 -#define ARCHER_C25_74HC_GPIO_LED_LAN1 23 -#define ARCHER_C25_74HC_GPIO_LED_LAN2 24 -#define ARCHER_C25_74HC_GPIO_LED_LAN3 25 -#define ARCHER_C25_74HC_GPIO_LED_LAN4 26 +#define ARCHER_C25_74HC_GPIO_BASE 32 +#define ARCHER_C25_74HC_GPIO_LED_WAN_AMBER (ARCHER_C25_74HC_GPIO_BASE + 4) +#define ARCHER_C25_74HC_GPIO_LED_WAN_GREEN (ARCHER_C25_74HC_GPIO_BASE + 5) +#define ARCHER_C25_74HC_GPIO_LED_WLAN2 (ARCHER_C25_74HC_GPIO_BASE + 6) +#define ARCHER_C25_74HC_GPIO_LED_WLAN5 (ARCHER_C25_74HC_GPIO_BASE + 7) +#define ARCHER_C25_74HC_GPIO_LED_LAN1 (ARCHER_C25_74HC_GPIO_BASE + 0) +#define ARCHER_C25_74HC_GPIO_LED_LAN2 (ARCHER_C25_74HC_GPIO_BASE + 1) +#define ARCHER_C25_74HC_GPIO_LED_LAN3 (ARCHER_C25_74HC_GPIO_BASE + 2) +#define ARCHER_C25_74HC_GPIO_LED_LAN4 (ARCHER_C25_74HC_GPIO_BASE + 3) #define ARCHER_C25_V1_SSR_BIT_0 0 #define ARCHER_C25_V1_SSR_BIT_1 1 diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c59-v1.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c59-v1.c index da15919a54..3c85a20550 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c59-v1.c +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c59-v1.c @@ -43,15 +43,15 @@ #define ARCHER_C59_GPIO_SHIFT_SRCLR 19 #define ARCHER_C59_GPIO_SHIFT_RCLK 20 -#define ARCHER_C59_74HC_GPIO_BASE QCA956X_GPIO_COUNT -#define ARCHER_C59_74HC_GPIO_LED_POWER 23 -#define ARCHER_C59_74HC_GPIO_LED_WLAN2 24 -#define ARCHER_C59_74HC_GPIO_LED_WLAN5 25 -#define ARCHER_C59_74HC_GPIO_LED_LAN 26 -#define ARCHER_C59_74HC_GPIO_LED_WAN_GREEN 27 -#define ARCHER_C59_74HC_GPIO_LED_WAN_AMBER 28 -#define ARCHER_C59_74HC_GPIO_LED_WPS 29 -#define ARCHER_C59_74HC_GPIO_LED_USB 30 +#define ARCHER_C59_74HC_GPIO_BASE 32 +#define ARCHER_C59_74HC_GPIO_LED_POWER (ARCHER_C59_74HC_GPIO_BASE + 0) +#define ARCHER_C59_74HC_GPIO_LED_WLAN2 (ARCHER_C59_74HC_GPIO_BASE + 1) +#define ARCHER_C59_74HC_GPIO_LED_WLAN5 (ARCHER_C59_74HC_GPIO_BASE + 2) +#define ARCHER_C59_74HC_GPIO_LED_LAN (ARCHER_C59_74HC_GPIO_BASE + 3) +#define ARCHER_C59_74HC_GPIO_LED_WAN_GREEN (ARCHER_C59_74HC_GPIO_BASE + 4) +#define ARCHER_C59_74HC_GPIO_LED_WAN_AMBER (ARCHER_C59_74HC_GPIO_BASE + 5) +#define ARCHER_C59_74HC_GPIO_LED_WPS (ARCHER_C59_74HC_GPIO_BASE + 6) +#define ARCHER_C59_74HC_GPIO_LED_USB (ARCHER_C59_74HC_GPIO_BASE + 7) #define ARCHER_C59_V1_SSR_BIT_0 0 #define ARCHER_C59_V1_SSR_BIT_1 1 diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c7-v4.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c7-v4.c index 64955c7994..21b8e8cf8b 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c7-v4.c +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c7-v4.c @@ -56,7 +56,7 @@ #define ARCHER_C7_GPIO_LED_USB1 7 #define ARCHER_C7_GPIO_LED_USB2 8 -#define ARCHER_C7_74HC_GPIO_BASE QCA956X_GPIO_COUNT +#define ARCHER_C7_74HC_GPIO_BASE 32 #define ARCHER_C7_GPIO_LED_WPS (ARCHER_C7_74HC_GPIO_BASE + 0) #define ARCHER_C7_GPIO_LED_LAN1 (ARCHER_C7_74HC_GPIO_BASE + 1) #define ARCHER_C7_GPIO_LED_LAN2 (ARCHER_C7_74HC_GPIO_BASE + 2) diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-rb91x.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-rb91x.c index 64f927dc6a..691566fa82 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/mach-rb91x.c +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-rb91x.c @@ -53,7 +53,7 @@ #define RB91X_FLAG_USB BIT(0) #define RB91X_FLAG_PCIE BIT(1) -#define RB91X_LATCH_GPIO_BASE AR934X_GPIO_COUNT +#define RB91X_LATCH_GPIO_BASE 32 #define RB91X_LATCH_GPIO(_x) (RB91X_LATCH_GPIO_BASE + (_x)) #define RB91X_SSR_GPIO_BASE (RB91X_LATCH_GPIO_BASE + AR934X_GPIO_COUNT) diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr942n-v1.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr942n-v1.c index 76f6a0759b..32e2bc9521 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr942n-v1.c +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr942n-v1.c @@ -49,15 +49,15 @@ #define TL_WR942N_V1_GPIO_LED_WPS 21 #define TL_WR942N_V1_GPIO_LED_STATUS 22 -#define TL_WR942N_V1_74HC_GPIO_BASE QCA956X_GPIO_COUNT -#define TL_WR942N_V1_74HC_GPIO_LED_LAN4 23 -#define TL_WR942N_V1_74HC_GPIO_LED_LAN3 24 -#define TL_WR942N_V1_74HC_GPIO_LED_LAN2 25 -#define TL_WR942N_V1_74HC_GPIO_LED_LAN1 26 -#define TL_WR942N_V1_74HC_GPIO_LED_WAN_GREEN 27 -#define TL_WR942N_V1_74HC_GPIO_LED_WAN_AMBER 28 -#define TL_WR942N_V1_74HC_GPIO_LED_WLAN 29 -#define TL_WR942N_V1_74HC_GPIO_HUB_RESET 30 /* from u-boot sources */ +#define TL_WR942N_V1_74HC_GPIO_BASE 32 +#define TL_WR942N_V1_74HC_GPIO_LED_LAN4 (TL_WR942N_V1_74HC_GPIO_BASE + 0) +#define TL_WR942N_V1_74HC_GPIO_LED_LAN3 (TL_WR942N_V1_74HC_GPIO_BASE + 1) +#define TL_WR942N_V1_74HC_GPIO_LED_LAN2 (TL_WR942N_V1_74HC_GPIO_BASE + 2) +#define TL_WR942N_V1_74HC_GPIO_LED_LAN1 (TL_WR942N_V1_74HC_GPIO_BASE + 3) +#define TL_WR942N_V1_74HC_GPIO_LED_WAN_GREEN (TL_WR942N_V1_74HC_GPIO_BASE + 4) +#define TL_WR942N_V1_74HC_GPIO_LED_WAN_AMBER (TL_WR942N_V1_74HC_GPIO_BASE + 5) +#define TL_WR942N_V1_74HC_GPIO_LED_WLAN (TL_WR942N_V1_74HC_GPIO_BASE + 6) +#define TL_WR942N_V1_74HC_GPIO_HUB_RESET (TL_WR942N_V1_74HC_GPIO_BASE + 7) /* from u-boot sources */ #define TL_WR942N_V1_SSR_BIT_0 0 #define TL_WR942N_V1_SSR_BIT_1 1 diff --git a/target/linux/ar71xx/files/drivers/mtd/nand/rb4xx_nand.c b/target/linux/ar71xx/files/drivers/mtd/nand/rb4xx_nand.c index b397575f77..5bbe9789fb 100644 --- a/target/linux/ar71xx/files/drivers/mtd/nand/rb4xx_nand.c +++ b/target/linux/ar71xx/files/drivers/mtd/nand/rb4xx_nand.c @@ -39,9 +39,31 @@ struct rb4xx_nand_info { struct nand_chip chip; +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0) struct mtd_info mtd; +#endif }; +static inline struct rb4xx_nand_info *mtd_to_rbinfo(struct mtd_info *mtd) +{ +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0) + return container_of(mtd, struct rb4xx_nand_info, mtd); +#else + struct nand_chip *chip = mtd_to_nand(mtd); + + return container_of(chip, struct rb4xx_nand_info, chip); +#endif +} + +static struct mtd_info *rbinfo_to_mtd(struct rb4xx_nand_info *nfc) +{ +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0) + return &nfc->mtd; +#else + return nand_to_mtd(&nfc->chip); +#endif +} + #if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0) /* * We need to use the OLD Yaffs-1 OOB layout, otherwise the RB bootloader @@ -191,6 +213,7 @@ static void rb4xx_nand_read_buf(struct mtd_info *mtd, unsigned char *buf, static int rb4xx_nand_probe(struct platform_device *pdev) { struct rb4xx_nand_info *info; + struct mtd_info *mtd; int ret; printk(KERN_INFO DRV_DESC " version " DRV_VERSION "\n"); @@ -259,8 +282,12 @@ static int rb4xx_nand_probe(struct platform_device *pdev) } info->chip.priv = &info; - info->mtd.priv = &info->chip; - info->mtd.owner = THIS_MODULE; + mtd = rbinfo_to_mtd(info); + +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0) + mtd->priv = &info->chip; +#endif + mtd->owner = THIS_MODULE; info->chip.cmd_ctrl = rb4xx_nand_cmd_ctrl; info->chip.dev_ready = rb4xx_nand_dev_ready; @@ -270,30 +297,33 @@ static int rb4xx_nand_probe(struct platform_device *pdev) info->chip.chip_delay = 25; info->chip.ecc.mode = NAND_ECC_SOFT; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,6,0) + info->chip.ecc.algo = NAND_ECC_HAMMING; +#endif info->chip.options = NAND_NO_SUBPAGE_WRITE; platform_set_drvdata(pdev, info); - ret = nand_scan_ident(&info->mtd, 1, NULL); + ret = nand_scan_ident(mtd, 1, NULL); if (ret) { ret = -ENXIO; goto err_free_info; } - if (info->mtd.writesize == 512) + if (mtd->writesize == 512) #if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0) info->chip.ecc.layout = &rb4xx_nand_ecclayout; #else - mtd_set_ooblayout(&info->mtd, &rb4xx_nand_ecclayout_ops); + mtd_set_ooblayout(mtd, &rb4xx_nand_ecclayout_ops); #endif - ret = nand_scan_tail(&info->mtd); + ret = nand_scan_tail(mtd); if (ret) { return -ENXIO; goto err_set_drvdata; } - mtd_device_register(&info->mtd, rb4xx_nand_partitions, + mtd_device_register(mtd, rb4xx_nand_partitions, ARRAY_SIZE(rb4xx_nand_partitions)); if (ret) goto err_release_nand; @@ -301,7 +331,7 @@ static int rb4xx_nand_probe(struct platform_device *pdev) return 0; err_release_nand: - nand_release(&info->mtd); + nand_release(mtd); err_set_drvdata: platform_set_drvdata(pdev, NULL); err_free_info: @@ -322,7 +352,7 @@ static int rb4xx_nand_remove(struct platform_device *pdev) { struct rb4xx_nand_info *info = platform_get_drvdata(pdev); - nand_release(&info->mtd); + nand_release(rbinfo_to_mtd(info)); platform_set_drvdata(pdev, NULL); kfree(info); gpio_free(RB4XX_NAND_GPIO_NCE); diff --git a/target/linux/ar71xx/files/drivers/mtd/nand/rb750_nand.c b/target/linux/ar71xx/files/drivers/mtd/nand/rb750_nand.c index f8a6722cba..dbada68dd0 100644 --- a/target/linux/ar71xx/files/drivers/mtd/nand/rb750_nand.c +++ b/target/linux/ar71xx/files/drivers/mtd/nand/rb750_nand.c @@ -41,13 +41,30 @@ struct rb750_nand_info { struct nand_chip chip; +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0) struct mtd_info mtd; +#endif struct rb7xx_nand_platform_data *pdata; }; static inline struct rb750_nand_info *mtd_to_rbinfo(struct mtd_info *mtd) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0) return container_of(mtd, struct rb750_nand_info, mtd); +#else + struct nand_chip *chip = mtd_to_nand(mtd); + + return container_of(chip, struct rb750_nand_info, chip); +#endif +} + +static struct mtd_info *rbinfo_to_mtd(struct rb750_nand_info *nfc) +{ +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0) + return &nfc->mtd; +#else + return nand_to_mtd(&nfc->chip); +#endif } #if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0) @@ -304,6 +321,7 @@ static int rb750_nand_probe(struct platform_device *pdev) { struct rb750_nand_info *info; struct rb7xx_nand_platform_data *pdata; + struct mtd_info *mtd; int ret; printk(KERN_INFO DRV_DESC " version " DRV_VERSION "\n"); @@ -317,8 +335,12 @@ static int rb750_nand_probe(struct platform_device *pdev) return -ENOMEM; info->chip.priv = &info; - info->mtd.priv = &info->chip; - info->mtd.owner = THIS_MODULE; + + mtd = rbinfo_to_mtd(info); +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0) + mtd->priv = &info->chip; +#endif + mtd->owner = THIS_MODULE; info->chip.select_chip = rb750_nand_select_chip; info->chip.cmd_ctrl = rb750_nand_cmd_ctrl; @@ -329,6 +351,9 @@ static int rb750_nand_probe(struct platform_device *pdev) info->chip.chip_delay = 25; info->chip.ecc.mode = NAND_ECC_SOFT; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,6,0) + info->chip.ecc.algo = NAND_ECC_HAMMING; +#endif info->chip.options = NAND_NO_SUBPAGE_WRITE; info->pdata = pdata; @@ -337,26 +362,26 @@ static int rb750_nand_probe(struct platform_device *pdev) rb750_nand_gpio_init(info); - ret = nand_scan_ident(&info->mtd, 1, NULL); + ret = nand_scan_ident(mtd, 1, NULL); if (ret) { ret = -ENXIO; goto err_free_info; } - if (info->mtd.writesize == 512) + if (mtd->writesize == 512) #if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0) info->chip.ecc.layout = &rb750_nand_ecclayout; #else - mtd_set_ooblayout(&info->mtd, &rb750_nand_ecclayout_ops); + mtd_set_ooblayout(mtd, &rb750_nand_ecclayout_ops); #endif - ret = nand_scan_tail(&info->mtd); + ret = nand_scan_tail(mtd); if (ret) { return -ENXIO; goto err_set_drvdata; } - ret = mtd_device_register(&info->mtd, rb750_nand_partitions, + ret = mtd_device_register(mtd, rb750_nand_partitions, ARRAY_SIZE(rb750_nand_partitions)); if (ret) goto err_release_nand; @@ -364,7 +389,7 @@ static int rb750_nand_probe(struct platform_device *pdev) return 0; err_release_nand: - nand_release(&info->mtd); + nand_release(mtd); err_set_drvdata: platform_set_drvdata(pdev, NULL); err_free_info: @@ -376,7 +401,7 @@ static int rb750_nand_remove(struct platform_device *pdev) { struct rb750_nand_info *info = platform_get_drvdata(pdev); - nand_release(&info->mtd); + nand_release(rbinfo_to_mtd(info)); platform_set_drvdata(pdev, NULL); kfree(info); diff --git a/target/linux/ar71xx/files/drivers/mtd/nand/rb91x_nand.c b/target/linux/ar71xx/files/drivers/mtd/nand/rb91x_nand.c index 15b1816ae1..c808f39989 100644 --- a/target/linux/ar71xx/files/drivers/mtd/nand/rb91x_nand.c +++ b/target/linux/ar71xx/files/drivers/mtd/nand/rb91x_nand.c @@ -40,7 +40,9 @@ struct rb91x_nand_info { struct nand_chip chip; +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0) struct mtd_info mtd; +#endif struct device *dev; int gpio_nce; @@ -54,9 +56,25 @@ struct rb91x_nand_info { static inline struct rb91x_nand_info *mtd_to_rbinfo(struct mtd_info *mtd) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0) return container_of(mtd, struct rb91x_nand_info, mtd); +#else + struct nand_chip *chip = mtd_to_nand(mtd); + + return container_of(chip, struct rb91x_nand_info, chip); +#endif } +static struct mtd_info *rbinfo_to_mtd(struct rb91x_nand_info *nfc) +{ +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0) + return &nfc->mtd; +#else + return nand_to_mtd(&nfc->chip); +#endif +} + + #if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0) /* * We need to use the OLD Yaffs-1 OOB layout, otherwise the RB bootloader @@ -340,6 +358,7 @@ static int rb91x_nand_probe(struct platform_device *pdev) { struct rb91x_nand_info *rbni; struct rb91x_nand_platform_data *pdata; + struct mtd_info *mtd; int ret; pr_info(DRV_DESC "\n"); @@ -362,8 +381,12 @@ static int rb91x_nand_probe(struct platform_device *pdev) rbni->gpio_nle = pdata->gpio_nle; rbni->chip.priv = &rbni; - rbni->mtd.priv = &rbni->chip; - rbni->mtd.owner = THIS_MODULE; + mtd = rbinfo_to_mtd(rbni); + +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0) + mtd->priv = &rbni->chip; +#endif + mtd->owner = THIS_MODULE; rbni->chip.cmd_ctrl = rb91x_nand_cmd_ctrl; rbni->chip.dev_ready = rb91x_nand_dev_ready; @@ -373,6 +396,9 @@ static int rb91x_nand_probe(struct platform_device *pdev) rbni->chip.chip_delay = 25; rbni->chip.ecc.mode = NAND_ECC_SOFT; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,6,0) + rbni->chip.ecc.algo = NAND_ECC_HAMMING; +#endif rbni->chip.options = NAND_NO_SUBPAGE_WRITE; platform_set_drvdata(pdev, rbni); @@ -381,22 +407,22 @@ static int rb91x_nand_probe(struct platform_device *pdev) if (ret) return ret; - ret = nand_scan_ident(&rbni->mtd, 1, NULL); + ret = nand_scan_ident(mtd, 1, NULL); if (ret) return ret; - if (rbni->mtd.writesize == 512) + if (mtd->writesize == 512) #if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0) rbni->chip.ecc.layout = &rb91x_nand_ecclayout; #else - mtd_set_ooblayout(&rbni->mtd, &rb91x_nand_ecclayout_ops); + mtd_set_ooblayout(mtd, &rb91x_nand_ecclayout_ops); #endif - ret = nand_scan_tail(&rbni->mtd); + ret = nand_scan_tail(mtd); if (ret) return ret; - ret = mtd_device_register(&rbni->mtd, rb91x_nand_partitions, + ret = mtd_device_register(mtd, rb91x_nand_partitions, ARRAY_SIZE(rb91x_nand_partitions)); if (ret) goto err_release_nand; @@ -404,7 +430,7 @@ static int rb91x_nand_probe(struct platform_device *pdev) return 0; err_release_nand: - nand_release(&rbni->mtd); + nand_release(mtd); return ret; } @@ -412,7 +438,7 @@ static int rb91x_nand_remove(struct platform_device *pdev) { struct rb91x_nand_info *info = platform_get_drvdata(pdev); - nand_release(&info->mtd); + nand_release(rbinfo_to_mtd(info)); return 0; } diff --git a/target/linux/ar71xx/image/generic.mk b/target/linux/ar71xx/image/generic.mk index 6f5a7016eb..3c5fcc3f3c 100644 --- a/target/linux/ar71xx/image/generic.mk +++ b/target/linux/ar71xx/image/generic.mk @@ -358,7 +358,6 @@ define Device/dr344 MTDPARTS := spi0.0:256k(u-boot)ro,64k(u-boot-env)ro,6336k(rootfs),1408k(kernel),64k(nvram),64k(art)ro,7744k@0x50000(firmware) IMAGE/sysupgrade.bin := append-rootfs | pad-rootfs | pad-to $$$$(ROOTFS_SIZE) | append-kernel | check-size $$$$(IMAGE_SIZE) endef -TARGET_DEVICES += dr344 define Device/dr531 DEVICE_TITLE := Wallys DR531 diff --git a/target/linux/ar71xx/image/lzma-loader/src/Makefile b/target/linux/ar71xx/image/lzma-loader/src/Makefile index 5f10bdb8f1..682b31fe8c 100644 --- a/target/linux/ar71xx/image/lzma-loader/src/Makefile +++ b/target/linux/ar71xx/image/lzma-loader/src/Makefile @@ -37,11 +37,13 @@ CFLAGS = -D__KERNEL__ -Wall -Wstrict-prototypes -Wno-trigraphs -Os \ -mabi=32 -march=mips32r2 \ -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap CFLAGS += -D_LZMA_PROB32 +CFLAGS += -flto ASFLAGS = $(CFLAGS) -D__ASSEMBLY__ -LDFLAGS = -static --gc-sections -no-warn-mismatch -LDFLAGS += -e startup -T loader.lds -Ttext $(LZMA_TEXT_START) +LDFLAGS = -static -Wl,--gc-sections -Wl,-no-warn-mismatch +LDFLAGS += -Wl,-e,startup -T loader.lds -Wl,-Ttext,$(LZMA_TEXT_START) +LDFLAGS += -flto -fwhole-program O_FORMAT = $(shell $(OBJDUMP) -i | head -2 | grep elf32) @@ -86,7 +88,7 @@ data.o: $(LOADER_DATA) $(LD) -r -b binary --oformat $(O_FORMAT) -T lzma-data.lds -o $@ $< loader: $(OBJECTS) - $(LD) $(LDFLAGS) -o $@ $(OBJECTS) + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJECTS) loader.bin: loader $(OBJCOPY) $(BIN_FLAGS) $< $@ diff --git a/target/linux/ar71xx/image/lzma-loader/src/head.S b/target/linux/ar71xx/image/lzma-loader/src/head.S index 47a7c9bd63..d414b14d11 100644 --- a/target/linux/ar71xx/image/lzma-loader/src/head.S +++ b/target/linux/ar71xx/image/lzma-loader/src/head.S @@ -42,6 +42,19 @@ LEAF(startup) mtc0 t0, CP0_STATUS ehb + /* + * Some bootloaders set the 'Kseg0 coherency algorithm' to + * 'Cacheable, noncoherent, write-through, no write allocate' + * and this cause performance issues. Let's go and change it to + * 'Cacheable, noncoherent, write-back, write allocate' + */ + mfc0 t0, CP0_CONFIG + li t1, ~7 #~CONF_CM_CMASK + and t0, t1 + ori t0, 3 #CONF_CM_CACHABLE_NONCOHERENT + mtc0 t0, CP0_CONFIG + nop + mtc0 zero, CP0_COUNT mtc0 zero, CP0_COMPARE ehb diff --git a/target/linux/ar71xx/image/tp-link.mk b/target/linux/ar71xx/image/tp-link.mk index 4e81251d02..6d5b0fe8d1 100644 --- a/target/linux/ar71xx/image/tp-link.mk +++ b/target/linux/ar71xx/image/tp-link.mk @@ -150,7 +150,7 @@ define Device/archer-c60-v1 MTDPARTS := spi0.0:64k(u-boot)ro,64k(mac)ro,1344k(kernel),6592k(rootfs),64k(tplink)ro,64k(art)ro,7936k@0x20000(firmware) SUPPORTED_DEVICES := archer-c60-v1 endef -TARGET_DEVICES += archer-c25-v1 archer-c58-v1 archer-c59-v1 archer-c60-v1 +TARGET_DEVICES += archer-c25-v1 archer-c59-v1 define Device/archer-c5-v1 $(Device/tplink-16mlzma) @@ -1043,7 +1043,6 @@ define Device/tl-wr902ac-v1 append-metadata | check-size $$$$(IMAGE_SIZE) MTDPARTS := spi0.0:128k(u-boot)ro,7360k(firmware),640k(tplink)ro,64k(art)ro endef -TARGET_DEVICES += tl-wr902ac-v1 define Device/tl-wr940n-v4 $(Device/tplink-8mlzma) @@ -1118,4 +1117,4 @@ define Device/tl-wr942n-v1 MTDPARTS := spi0.0:128k(u-boot)ro,1344k(kernel),13120k(rootfs),64k(product-info)ro,64k(partition-table)ro,256k(oem-config)ro,1344k(oem-vars)ro,64k(ART)ro,14464k@0x20000(firmware) SUPPORTED_DEVICES := tl-wr942n-v1 endef -TARGET_DEVICES += tl-wr940n-v4 tl-wr941nd-v2 tl-wr941nd-v3 tl-wr941nd-v4 tl-wr941nd-v5 tl-wr941nd-v6 tl-wr941nd-v6-cn tl-wr942n-v1 +TARGET_DEVICES += tl-wr940n-v4 tl-wr941nd-v2 tl-wr941nd-v3 tl-wr941nd-v4 tl-wr941nd-v5 tl-wr941nd-v6 tl-wr941nd-v6-cn diff --git a/target/linux/ar71xx/image/ubnt.mk b/target/linux/ar71xx/image/ubnt.mk index f80f2f1b33..dfc795bb21 100644 --- a/target/linux/ar71xx/image/ubnt.mk +++ b/target/linux/ar71xx/image/ubnt.mk @@ -256,4 +256,3 @@ define Device/ubnt-unifi-outdoor-plus BOARDNAME := UBNT-UOP DEVICE_PROFILE := UBNT endef -TARGET_DEVICES += ubnt-uap-pro ubnt-unifi-outdoor-plus diff --git a/target/linux/ar71xx/mikrotik/config-default b/target/linux/ar71xx/mikrotik/config-default index e333166e93..42f9882bb2 100644 --- a/target/linux/ar71xx/mikrotik/config-default +++ b/target/linux/ar71xx/mikrotik/config-default @@ -231,6 +231,7 @@ CONFIG_MTD_NAND_RB4XX=y CONFIG_MTD_NAND_RB750=y CONFIG_MTD_NAND_RB91X=y # CONFIG_MTD_REDBOOT_PARTS is not set +CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y # CONFIG_MTD_SPLIT_EVA_FW is not set # CONFIG_MTD_SPLIT_TPLINK_FW is not set # CONFIG_MTD_TPLINK_PARTS is not set From 4cb2f96c71e7995c99c2d3fc26991aa76e630c64 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Tue, 24 Oct 2017 23:21:06 +0800 Subject: [PATCH 04/37] include: Include new location for DT bindings in kernel 4.12 --- include/image.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/include/image.mk b/include/image.mk index 3f5b4544e9..fc6bf06e96 100644 --- a/include/image.mk +++ b/include/image.mk @@ -161,6 +161,7 @@ define Image/BuildDTB $(TARGET_CROSS)cpp -nostdinc -x assembler-with-cpp \ -I$(DTS_DIR) \ -I$(DTS_DIR)/include \ + -I$(LINUX_DIR)/include/ \ -undef -D__DTS__ $(3) \ -o $(2).tmp $(1) $(LINUX_DIR)/scripts/dtc/dtc -O dtb \ From 5d1a43f7829e76cc81bac0dada4a9b7343db06fd Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Tue, 24 Oct 2017 23:23:45 +0800 Subject: [PATCH 05/37] squashfs: use host cflags and fix for x86/x64 vmware firstboot --- package/libs/lzo/Makefile | 4 ---- tools/squashfs/Makefile | 1 + 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/package/libs/lzo/Makefile b/package/libs/lzo/Makefile index 8d85e4652e..ef33619d88 100644 --- a/package/libs/lzo/Makefile +++ b/package/libs/lzo/Makefile @@ -42,10 +42,6 @@ CONFIGURE_ARGS += \ TARGET_CFLAGS += $(FPIC) MAKE_FLAGS += CFLAGS_O="$(TARGET_CFLAGS)" -ifeq ($(CONFIG_i386)$(CONFIG_x86_64),) - TARGET_CFLAGS += -DLZO_CFG_NO_UNALIGNED=1 -endif - define Build/InstallDev $(INSTALL_DIR) $(1)/usr/include $(1)/usr/lib $(CP) $(PKG_INSTALL_DIR)/usr/include/lzo $(1)/usr/include/ diff --git a/tools/squashfs/Makefile b/tools/squashfs/Makefile index 27adca1d7f..87f6e8fd99 100644 --- a/tools/squashfs/Makefile +++ b/tools/squashfs/Makefile @@ -21,6 +21,7 @@ include $(INCLUDE_DIR)/host-build.mk define Host/Compile $(MAKE) -C $(HOST_BUILD_DIR)/squashfs-tools \ CC="$(HOSTCC)" \ + CFLAGS="$(HOST_CFLAGS) -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -I." \ CXX="$(CXX)" \ LZMAPATH=$(STAGING_DIR_HOST)/lib \ mksquashfs-lzma unsquashfs-lzma From 193672160ae826312b607efb02313d590978fd44 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Wed, 25 Oct 2017 00:34:46 +0800 Subject: [PATCH 06/37] update full support for Asus RT-ACRH17 --- target/linux/ipq806x/base-files/etc/board.d/01_leds | 1 + .../linux/ipq806x/base-files/etc/board.d/02_network | 1 + .../etc/hotplug.d/firmware/11-ath10k-caldata | 2 ++ target/linux/ipq806x/base-files/lib/ipq806x.sh | 3 +++ .../linux/ipq806x/base-files/lib/upgrade/platform.sh | 1 + .../arch/arm/boot/dts/qcom-ipq4019-rt-acrh17.dts | 12 ++++++------ .../patches-4.9/0069-arm-boot-add-dts-files.patch | 7 ++++--- 7 files changed, 18 insertions(+), 9 deletions(-) diff --git a/target/linux/ipq806x/base-files/etc/board.d/01_leds b/target/linux/ipq806x/base-files/etc/board.d/01_leds index 224cabf14e..a5b6bfc034 100755 --- a/target/linux/ipq806x/base-files/etc/board.d/01_leds +++ b/target/linux/ipq806x/base-files/etc/board.d/01_leds @@ -35,6 +35,7 @@ nbg6817) ucidef_set_led_wlan "wlan5g" "WLAN5G" "$board:amber:wifi5g" "phy0tpt" ucidef_set_led_netdev "wan" "WAN" "$board:white:internet" "eth1" ;; +rt-acrh17 |\ rt-ac58u) ucidef_set_led_wlan "wlan2g" "WLAN2G" "$board:blue:wlan2G" "phy0tpt" ucidef_set_led_wlan "wlan5g" "WLAN5G" "$board:blue:wlan5G" "phy1tpt" diff --git a/target/linux/ipq806x/base-files/etc/board.d/02_network b/target/linux/ipq806x/base-files/etc/board.d/02_network index fd6a253f10..9d5ba2d68c 100755 --- a/target/linux/ipq806x/base-files/etc/board.d/02_network +++ b/target/linux/ipq806x/base-files/etc/board.d/02_network @@ -53,6 +53,7 @@ nbg6817) ucidef_set_interface_macaddr "lan" "$hw_mac_addr" ucidef_set_interface_macaddr "wan" "$(macaddr_add $hw_mac_addr 1)" ;; +rt-acrh17 |\ rt-ac58u) CI_UBIPART=UBI_DEV wan_mac_addr=$(mtd_get_mac_binary_ubi Factory 20486) diff --git a/target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata index 6ee403f7fe..9557b539a8 100644 --- a/target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata +++ b/target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata @@ -62,6 +62,7 @@ board=$(board_name) case "$FIRMWARE" in "ath10k/pre-cal-ahb-a000000.wifi.bin") case "$board" in + rt-acrh17 |\ rt-ac58u) . /lib/upgrade/nand.sh @@ -75,6 +76,7 @@ case "$FIRMWARE" in ;; "ath10k/pre-cal-ahb-a800000.wifi.bin") case "$board" in + rt-acrh17 |\ rt-ac58u) . /lib/upgrade/nand.sh diff --git a/target/linux/ipq806x/base-files/lib/ipq806x.sh b/target/linux/ipq806x/base-files/lib/ipq806x.sh index a46c1bd56d..c4af88b00e 100644 --- a/target/linux/ipq806x/base-files/lib/ipq806x.sh +++ b/target/linux/ipq806x/base-files/lib/ipq806x.sh @@ -44,6 +44,9 @@ ipq806x_board_detect() { *"R7800") name="r7800" ;; + *"RT-ACRH17") + name="rt-acrh17" + ;; *"RT-AC58U") name="rt-ac58u" ;; diff --git a/target/linux/ipq806x/base-files/lib/upgrade/platform.sh b/target/linux/ipq806x/base-files/lib/upgrade/platform.sh index d13c0b1ad9..cf046800d0 100644 --- a/target/linux/ipq806x/base-files/lib/upgrade/platform.sh +++ b/target/linux/ipq806x/base-files/lib/upgrade/platform.sh @@ -8,6 +8,7 @@ platform_check_image() { local board=$(board_name) case "$board" in + rt-acrh17 |\ rt-ac58u) CI_UBIPART="UBI_DEV" local ubidev=$(nand_find_ubi $CI_UBIPART) diff --git a/target/linux/ipq806x/files-4.9/arch/arm/boot/dts/qcom-ipq4019-rt-acrh17.dts b/target/linux/ipq806x/files-4.9/arch/arm/boot/dts/qcom-ipq4019-rt-acrh17.dts index 1eb4b2e6f4..c68cc0e9ea 100644 --- a/target/linux/ipq806x/files-4.9/arch/arm/boot/dts/qcom-ipq4019-rt-acrh17.dts +++ b/target/linux/ipq806x/files-4.9/arch/arm/boot/dts/qcom-ipq4019-rt-acrh17.dts @@ -134,32 +134,32 @@ compatible = "gpio-leds"; power: status { - label = "rt-ac58u:blue:status"; + label = "rt-acrh17:blue:status"; gpios = <&tlmm 3 GPIO_ACTIVE_HIGH>; }; wan { - label = "rt-ac58u:blue:wan"; + label = "rt-acrh17:blue:wan"; gpios = <&tlmm 1 GPIO_ACTIVE_HIGH>; }; wlan2G { - label = "rt-ac58u:blue:wlan2G"; + label = "rt-acrh17:blue:wlan2G"; gpios = <&tlmm 58 GPIO_ACTIVE_HIGH>; }; wan5G { - label = "rt-ac58u:blue:wlan5G"; + label = "rt-acrh17:blue:wlan5G"; gpios = <&tlmm 5 GPIO_ACTIVE_HIGH>; }; usb { - label = "rt-ac58u:blue:usb"; + label = "rt-acrh17:blue:usb"; gpios = <&tlmm 0 GPIO_ACTIVE_HIGH>; }; lan { - label = "rt-ac58u:blue:lan"; + label = "rt-acrh17:blue:lan"; gpios = <&tlmm 2 GPIO_ACTIVE_HIGH>; }; }; diff --git a/target/linux/ipq806x/patches-4.9/0069-arm-boot-add-dts-files.patch b/target/linux/ipq806x/patches-4.9/0069-arm-boot-add-dts-files.patch index bab2808789..ea9e672786 100644 --- a/target/linux/ipq806x/patches-4.9/0069-arm-boot-add-dts-files.patch +++ b/target/linux/ipq806x/patches-4.9/0069-arm-boot-add-dts-files.patch @@ -5,18 +5,19 @@ Subject: [PATCH 69/69] arm: boot: add dts files Signed-off-by: John Crispin --- - arch/arm/boot/dts/Makefile | 8 ++++++++ - 1 file changed, 8 insertions(+) + arch/arm/boot/dts/Makefile | 9 ++++++++ + 1 file changed, 9 insertions(+) --- a/arch/arm/boot/dts/Makefile +++ b/arch/arm/boot/dts/Makefile -@@ -618,7 +618,18 @@ dtb-$(CONFIG_ARCH_QCOM) += \ +@@ -618,7 +618,19 @@ dtb-$(CONFIG_ARCH_QCOM) += \ qcom-apq8084-mtp.dtb \ qcom-ipq4019-ap.dk01.1-c1.dtb \ qcom-ipq4019-ap.dk04.1-c1.dtb \ + qcom-ipq4019-fritz4040.dtb \ + qcom-ipq4019-nbg6617.dtb \ + qcom-ipq4019-rt-ac58u.dtb \ ++ qcom-ipq4019-rt-acrh17.dtb \ qcom-ipq8064-ap148.dtb \ + qcom-ipq8064-c2600.dtb \ + qcom-ipq8064-d7800.dtb \ From a39431b329320520109dc75a48ef44b00c5bb15a Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Wed, 25 Oct 2017 00:40:21 +0800 Subject: [PATCH 07/37] add FPU Emu support in ar71xx both kenerl 4.4 and 4.9 --- target/linux/ar71xx/config-4.4 | 1 + target/linux/ar71xx/config-4.9 | 1 + 2 files changed, 2 insertions(+) diff --git a/target/linux/ar71xx/config-4.4 b/target/linux/ar71xx/config-4.4 index 4793bf4deb..abfb127ff6 100644 --- a/target/linux/ar71xx/config-4.4 +++ b/target/linux/ar71xx/config-4.4 @@ -478,3 +478,4 @@ CONFIG_TICK_CPU_ACCOUNTING=y CONFIG_USB_SUPPORT=y CONFIG_USE_OF=y CONFIG_ZONE_DMA_FLAG=0 +CONFIG_MIPS_FPU_EMULATOR=y diff --git a/target/linux/ar71xx/config-4.9 b/target/linux/ar71xx/config-4.9 index 84b2a0b72b..190d07df26 100644 --- a/target/linux/ar71xx/config-4.9 +++ b/target/linux/ar71xx/config-4.9 @@ -484,3 +484,4 @@ CONFIG_SYS_SUPPORTS_ZBOOT_UART_PROM=y CONFIG_TICK_CPU_ACCOUNTING=y CONFIG_USB_SUPPORT=y CONFIG_USE_OF=y +CONFIG_MIPS_FPU_EMULATOR=y From 791acd01bb132ab6ee538afb22c88d3b3e31c975 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Fri, 27 Oct 2017 11:23:03 +0800 Subject: [PATCH 08/37] hostapd: fix up ubus support --- .../hostapd/patches/600-ubus_support.patch | 62 +++++++++++++------ .../services/hostapd/src/src/ap/ubus.c | 6 +- 2 files changed, 45 insertions(+), 23 deletions(-) diff --git a/package/network/services/hostapd/patches/600-ubus_support.patch b/package/network/services/hostapd/patches/600-ubus_support.patch index 31e3e79995..b63d99a57d 100644 --- a/package/network/services/hostapd/patches/600-ubus_support.patch +++ b/package/network/services/hostapd/patches/600-ubus_support.patch @@ -1,5 +1,7 @@ ---- a/hostapd/Makefile -+++ b/hostapd/Makefile +Index: hostapd-2017-08-24-c2d4f2eb/hostapd/Makefile +=================================================================== +--- hostapd-2017-08-24-c2d4f2eb.orig/hostapd/Makefile ++++ hostapd-2017-08-24-c2d4f2eb/hostapd/Makefile @@ -165,6 +165,11 @@ OBJS += ../src/common/hw_features_common OBJS += ../src/eapol_auth/eapol_auth_sm.o @@ -12,8 +14,10 @@ ifdef CONFIG_CODE_COVERAGE CFLAGS += -O0 -fprofile-arcs -ftest-coverage ---- a/src/ap/hostapd.h -+++ b/src/ap/hostapd.h +Index: hostapd-2017-08-24-c2d4f2eb/src/ap/hostapd.h +=================================================================== +--- hostapd-2017-08-24-c2d4f2eb.orig/src/ap/hostapd.h ++++ hostapd-2017-08-24-c2d4f2eb/src/ap/hostapd.h @@ -13,6 +13,7 @@ #include "utils/list.h" #include "ap_config.h" @@ -39,8 +43,10 @@ enum hostapd_iface_state { HAPD_IFACE_UNINITIALIZED, HAPD_IFACE_DISABLED, ---- a/src/ap/hostapd.c -+++ b/src/ap/hostapd.c +Index: hostapd-2017-08-24-c2d4f2eb/src/ap/hostapd.c +=================================================================== +--- hostapd-2017-08-24-c2d4f2eb.orig/src/ap/hostapd.c ++++ hostapd-2017-08-24-c2d4f2eb/src/ap/hostapd.c @@ -309,6 +309,7 @@ static void hostapd_free_hapd_data(struc hapd->started = 0; @@ -82,8 +88,10 @@ hostapd_interface_deinit(iface); wpa_printf(MSG_DEBUG, "%s: driver=%p drv_priv=%p -> hapd_deinit", __func__, driver, drv_priv); ---- a/src/ap/ieee802_11.c -+++ b/src/ap/ieee802_11.c +Index: hostapd-2017-08-24-c2d4f2eb/src/ap/ieee802_11.c +=================================================================== +--- hostapd-2017-08-24-c2d4f2eb.orig/src/ap/ieee802_11.c ++++ hostapd-2017-08-24-c2d4f2eb/src/ap/ieee802_11.c @@ -1587,7 +1587,8 @@ ieee802_11_set_radius_info(struct hostap @@ -201,8 +209,10 @@ ret = 1; break; case WLAN_FC_STYPE_DISASSOC: ---- a/src/ap/beacon.c -+++ b/src/ap/beacon.c +Index: hostapd-2017-08-24-c2d4f2eb/src/ap/beacon.c +=================================================================== +--- hostapd-2017-08-24-c2d4f2eb.orig/src/ap/beacon.c ++++ hostapd-2017-08-24-c2d4f2eb/src/ap/beacon.c @@ -716,7 +716,7 @@ void sta_track_claim_taxonomy_info(struc void handle_probe_req(struct hostapd_data *hapd, @@ -241,8 +251,10 @@ /* TODO: verify that supp_rates contains at least one matching rate * with AP configuration */ ---- a/src/ap/beacon.h -+++ b/src/ap/beacon.h +Index: hostapd-2017-08-24-c2d4f2eb/src/ap/beacon.h +=================================================================== +--- hostapd-2017-08-24-c2d4f2eb.orig/src/ap/beacon.h ++++ hostapd-2017-08-24-c2d4f2eb/src/ap/beacon.h @@ -14,7 +14,7 @@ struct ieee80211_mgmt; void handle_probe_req(struct hostapd_data *hapd, @@ -252,8 +264,10 @@ int ieee802_11_set_beacon(struct hostapd_data *hapd); int ieee802_11_set_beacons(struct hostapd_iface *iface); int ieee802_11_update_beacons(struct hostapd_iface *iface); ---- a/src/ap/drv_callbacks.c -+++ b/src/ap/drv_callbacks.c +Index: hostapd-2017-08-24-c2d4f2eb/src/ap/drv_callbacks.c +=================================================================== +--- hostapd-2017-08-24-c2d4f2eb.orig/src/ap/drv_callbacks.c ++++ hostapd-2017-08-24-c2d4f2eb/src/ap/drv_callbacks.c @@ -116,6 +116,10 @@ int hostapd_notif_assoc(struct hostapd_d u16 reason = WLAN_REASON_UNSPECIFIED; u16 status = WLAN_STATUS_SUCCESS; @@ -278,8 +292,10 @@ #ifdef CONFIG_P2P if (elems.p2p) { wpabuf_free(sta->p2p_ie); ---- a/src/ap/sta_info.c -+++ b/src/ap/sta_info.c +Index: hostapd-2017-08-24-c2d4f2eb/src/ap/sta_info.c +=================================================================== +--- hostapd-2017-08-24-c2d4f2eb.orig/src/ap/sta_info.c ++++ hostapd-2017-08-24-c2d4f2eb/src/ap/sta_info.c @@ -404,6 +404,7 @@ void ap_handle_timer(void *eloop_ctx, vo HOSTAPD_LEVEL_INFO, "deauthenticated due to " "local deauth request"); @@ -296,8 +312,18 @@ break; } } ---- a/src/ap/wpa_auth_glue.c -+++ b/src/ap/wpa_auth_glue.c +@@ -1212,6 +1214,7 @@ void ap_sta_set_authorized(struct hostap + buf, ip_addr); + } else { + wpa_msg(hapd->msg_ctx, MSG_INFO, AP_STA_DISCONNECTED "%s", buf); ++ hostapd_ubus_notify(hapd, "disassoc", sta->addr); + + if (hapd->msg_ctx_parent && + hapd->msg_ctx_parent != hapd->msg_ctx) +Index: hostapd-2017-08-24-c2d4f2eb/src/ap/wpa_auth_glue.c +=================================================================== +--- hostapd-2017-08-24-c2d4f2eb.orig/src/ap/wpa_auth_glue.c ++++ hostapd-2017-08-24-c2d4f2eb/src/ap/wpa_auth_glue.c @@ -175,6 +175,7 @@ static void hostapd_wpa_auth_psk_failure struct hostapd_data *hapd = ctx; wpa_msg(hapd->msg_ctx, MSG_INFO, AP_STA_POSSIBLE_PSK_MISMATCH MACSTR, diff --git a/package/network/services/hostapd/src/src/ap/ubus.c b/package/network/services/hostapd/src/src/ap/ubus.c index bc773930d4..beb4388f7c 100644 --- a/package/network/services/hostapd/src/src/ap/ubus.c +++ b/package/network/services/hostapd/src/src/ap/ubus.c @@ -743,18 +743,14 @@ int hostapd_ubus_handle_event(struct hostapd_data *hapd, struct hostapd_ubus_req void hostapd_ubus_notify(struct hostapd_data *hapd, const char *type, const u8 *addr) { - char mac[18]; - if (!hapd->ubus.obj.has_subscribers) return; if (!addr) return; - snprintf(mac, sizeof(mac), MACSTR, MAC2STR(addr)); - blob_buf_init(&b, 0); - blobmsg_add_macaddr(&b, "address", mac); + blobmsg_add_macaddr(&b, "address", addr); ubus_notify(ctx, &hapd->ubus.obj, type, b.head, -1); } From 457fcc005a39302178fda8907a8429f326d681bd Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Fri, 27 Oct 2017 11:25:49 +0800 Subject: [PATCH 09/37] mac80211: backport fixes for fix for CVE-2017-13080 --- package/kernel/mac80211/Makefile | 49 +++- .../mac80211/files/lib/wifi/mac80211.sh | 1 + ...key-reinstall-without-changing-anyth.patch | 81 ++++++ ...e-constant-time-comparison-with-keys.patch | 33 +++ ...compare-TKIP-TX-MIC-key-in-reinstall.patch | 73 ++++++ .../mac80211/patches/999-ccmp-crypto.patch | 234 ------------------ 6 files changed, 235 insertions(+), 236 deletions(-) create mode 100644 package/kernel/mac80211/patches/327-mac80211-accept-key-reinstall-without-changing-anyth.patch create mode 100644 package/kernel/mac80211/patches/328-mac80211-use-constant-time-comparison-with-keys.patch create mode 100644 package/kernel/mac80211/patches/329-mac80211-don-t-compare-TKIP-TX-MIC-key-in-reinstall.patch delete mode 100644 package/kernel/mac80211/patches/999-ccmp-crypto.patch diff --git a/package/kernel/mac80211/Makefile b/package/kernel/mac80211/Makefile index 424b2ca509..7e9b5ad618 100644 --- a/package/kernel/mac80211/Makefile +++ b/package/kernel/mac80211/Makefile @@ -24,7 +24,7 @@ PKG_MAINTAINER:=Felix Fietkau PKG_DRIVERS = \ adm8211 \ airo \ - ath ath5k ath9k ath9k-common ath9k-htc ath10k \ + ath ath5k ath6kl ath6kl-sdio ath6kl-usb ath9k ath9k-common ath9k-htc ath10k \ b43 b43legacy \ carl9170 \ hermes hermes-pci hermes-pcmcia hermes-plx\ @@ -217,6 +217,43 @@ define KernelPackage/ath5k/description Atheros 5xxx chipset. endef +define KernelPackage/ath6kl + $(call KernelPackage/mac80211/Default) + TITLE:=Atheros FullMAC wireless devices (common code for ath6kl_sdio and ath6kl_usb) + URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath6kl + HIDDEN:=1 + DEPENDS+= +kmod-ath +@DRIVER_11N_SUPPORT +@KERNEL_RELAY + FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath6kl/ath6kl_core.ko +endef + +define KernelPackage/ath6kl-sdio + $(call KernelPackage/mac80211/Default) + TITLE:=Atheros 802.11n SDIO wireless cards support + URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath6kl + DEPENDS+= +kmod-mmc +kmod-ath6kl + FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath6kl/ath6kl_sdio.ko + AUTOLOAD:=$(call AutoProbe,ath6kl_sdio) +endef + +define KernelPackage/ath6kl-sdio/description +This module adds support for wireless adapters based on +Atheros IEEE 802.11n AR6003 and AR6004 family of chipsets. +endef + +define KernelPackage/ath6kl-usb + $(call KernelPackage/mac80211/Default) + TITLE:=Atheros 802.11n USB wireless cards support + URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath6kl + DEPENDS+= @USB_SUPPORT +kmod-usb-core +kmod-ath6kl + FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath6kl/ath6kl_usb.ko + AUTOLOAD:=$(call AutoProbe,ath6kl_usb) +endef + +define KernelPackage/ath6kl-usb/description +This module adds support for wireless adapters based on the +Atheros IEEE 802.11n AR6004 chipset. +endef + define KernelPackage/ath9k-common $(call KernelPackage/mac80211/Default) TITLE:=Atheros 802.11n wireless devices (common code for ath9k and ath9k_htc) @@ -1513,7 +1550,8 @@ ifdef CONFIG_PACKAGE_MAC80211_DEBUGFS ATH9K_HTC_DEBUGFS \ ATH10K_DEBUGFS \ CARL9170_DEBUGFS \ - ATH5K_DEBUG + ATH5K_DEBUG \ + ATH6KL_DEBUG endif ifdef CONFIG_PACKAGE_MAC80211_TRACING @@ -1554,6 +1592,10 @@ else config-y += ATH5K_PCI endif +config-$(call config_package,ath6kl) += ATH6KL +config-$(call config_package,ath6kl-sdio) += ATH6KL_SDIO +config-$(call config_package,ath6kl-usb) += ATH6KL_USB + config-$(call config_package,carl9170) += CARL9170 config-$(call config_package,b43) += B43 @@ -1795,6 +1837,9 @@ $(eval $(call KernelPackage,airo)) $(eval $(call KernelPackage,ath)) $(eval $(call KernelPackage,ath10k)) $(eval $(call KernelPackage,ath5k)) +$(eval $(call KernelPackage,ath6kl)) +$(eval $(call KernelPackage,ath6kl-sdio)) +$(eval $(call KernelPackage,ath6kl-usb)) $(eval $(call KernelPackage,ath9k)) $(eval $(call KernelPackage,ath9k-common)) $(eval $(call KernelPackage,ath9k-htc)) diff --git a/package/kernel/mac80211/files/lib/wifi/mac80211.sh b/package/kernel/mac80211/files/lib/wifi/mac80211.sh index ad2af3b293..467392f75c 100644 --- a/package/kernel/mac80211/files/lib/wifi/mac80211.sh +++ b/package/kernel/mac80211/files/lib/wifi/mac80211.sh @@ -116,6 +116,7 @@ detect_mac80211() { set wireless.radio${devidx}.hwmode=11${mode_band} ${dev_id} ${ht_capab} + set wireless.radio${devidx}.disabled=0 set wireless.default_radio${devidx}=wifi-iface set wireless.default_radio${devidx}.device=radio${devidx} diff --git a/package/kernel/mac80211/patches/327-mac80211-accept-key-reinstall-without-changing-anyth.patch b/package/kernel/mac80211/patches/327-mac80211-accept-key-reinstall-without-changing-anyth.patch new file mode 100644 index 0000000000..7d0be0395b --- /dev/null +++ b/package/kernel/mac80211/patches/327-mac80211-accept-key-reinstall-without-changing-anyth.patch @@ -0,0 +1,81 @@ +From fdf7cb4185b60c68e1a75e61691c4afdc15dea0e Mon Sep 17 00:00:00 2001 +From: Johannes Berg +Date: Tue, 5 Sep 2017 14:54:54 +0200 +Subject: [PATCH] mac80211: accept key reinstall without changing anything + +When a key is reinstalled we can reset the replay counters +etc. which can lead to nonce reuse and/or replay detection +being impossible, breaking security properties, as described +in the "KRACK attacks". + +In particular, CVE-2017-13080 applies to GTK rekeying that +happened in firmware while the host is in D3, with the second +part of the attack being done after the host wakes up. In +this case, the wpa_supplicant mitigation isn't sufficient +since wpa_supplicant doesn't know the GTK material. + +In case this happens, simply silently accept the new key +coming from userspace but don't take any action on it since +it's the same key; this keeps the PN replay counters intact. + +Signed-off-by: Johannes Berg +--- + net/mac80211/key.c | 21 +++++++++++++++++---- + 1 file changed, 17 insertions(+), 4 deletions(-) + +diff --git a/net/mac80211/key.c b/net/mac80211/key.c +index a98fc2b5e0dc..ae995c8480db 100644 +--- a/net/mac80211/key.c ++++ b/net/mac80211/key.c +@@ -4,7 +4,7 @@ + * Copyright 2006-2007 Jiri Benc + * Copyright 2007-2008 Johannes Berg + * Copyright 2013-2014 Intel Mobile Communications GmbH +- * Copyright 2015 Intel Deutschland GmbH ++ * Copyright 2015-2017 Intel Deutschland GmbH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as +@@ -620,9 +620,6 @@ int ieee80211_key_link(struct ieee80211_key *key, + + pairwise = key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE; + idx = key->conf.keyidx; +- key->local = sdata->local; +- key->sdata = sdata; +- key->sta = sta; + + mutex_lock(&sdata->local->key_mtx); + +@@ -633,6 +630,21 @@ int ieee80211_key_link(struct ieee80211_key *key, + else + old_key = key_mtx_dereference(sdata->local, sdata->keys[idx]); + ++ /* ++ * Silently accept key re-installation without really installing the ++ * new version of the key to avoid nonce reuse or replay issues. ++ */ ++ if (old_key && key->conf.keylen == old_key->conf.keylen && ++ !memcmp(key->conf.key, old_key->conf.key, key->conf.keylen)) { ++ ieee80211_key_free_unused(key); ++ ret = 0; ++ goto out; ++ } ++ ++ key->local = sdata->local; ++ key->sdata = sdata; ++ key->sta = sta; ++ + increment_tailroom_need_count(sdata); + + ieee80211_key_replace(sdata, sta, pairwise, old_key, key); +@@ -648,6 +660,7 @@ int ieee80211_key_link(struct ieee80211_key *key, + ret = 0; + } + ++ out: + mutex_unlock(&sdata->local->key_mtx); + + return ret; +-- +2.13.6 + diff --git a/package/kernel/mac80211/patches/328-mac80211-use-constant-time-comparison-with-keys.patch b/package/kernel/mac80211/patches/328-mac80211-use-constant-time-comparison-with-keys.patch new file mode 100644 index 0000000000..03e8201902 --- /dev/null +++ b/package/kernel/mac80211/patches/328-mac80211-use-constant-time-comparison-with-keys.patch @@ -0,0 +1,33 @@ +From 2bdd713b92a9cade239d3c7d15205a09f556624d Mon Sep 17 00:00:00 2001 +From: "Jason A. Donenfeld" +Date: Tue, 17 Oct 2017 20:32:07 +0200 +Subject: [PATCH] mac80211: use constant time comparison with keys + +Otherwise we risk leaking information via timing side channel. + +Fixes: fdf7cb4185b6 ("mac80211: accept key reinstall without changing anything") +Signed-off-by: Jason A. Donenfeld +Signed-off-by: Johannes Berg +--- + net/mac80211/key.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/net/mac80211/key.c ++++ b/net/mac80211/key.c +@@ -19,6 +19,7 @@ + #include + #include + #include ++#include + #include + #include "ieee80211_i.h" + #include "driver-ops.h" +@@ -635,7 +636,7 @@ int ieee80211_key_link(struct ieee80211_ + * new version of the key to avoid nonce reuse or replay issues. + */ + if (old_key && key->conf.keylen == old_key->conf.keylen && +- !memcmp(key->conf.key, old_key->conf.key, key->conf.keylen)) { ++ !crypto_memneq(key->conf.key, old_key->conf.key, key->conf.keylen)) { + ieee80211_key_free_unused(key); + ret = 0; + goto out; diff --git a/package/kernel/mac80211/patches/329-mac80211-don-t-compare-TKIP-TX-MIC-key-in-reinstall.patch b/package/kernel/mac80211/patches/329-mac80211-don-t-compare-TKIP-TX-MIC-key-in-reinstall.patch new file mode 100644 index 0000000000..1eaf51de72 --- /dev/null +++ b/package/kernel/mac80211/patches/329-mac80211-don-t-compare-TKIP-TX-MIC-key-in-reinstall.patch @@ -0,0 +1,73 @@ +From cfbb0d90a7abb289edc91833d0905931f8805f12 Mon Sep 17 00:00:00 2001 +From: Johannes Berg +Date: Tue, 24 Oct 2017 21:12:13 +0200 +Subject: [PATCH] mac80211: don't compare TKIP TX MIC key in reinstall prevention + +For the reinstall prevention, the code I had added compares the +whole key. It turns out though that iwlwifi firmware doesn't +provide the TKIP TX MIC key as it's not needed in client mode, +and thus the comparison will always return false. + +For client mode, thus always zero out the TX MIC key part before +doing the comparison in order to avoid accepting the reinstall +of the key with identical encryption and RX MIC key, but not the +same TX MIC key (since the supplicant provides the real one.) + +Fixes: fdf7cb4185b6 ("mac80211: accept key reinstall without changing anything") +Signed-off-by: Johannes Berg +--- + net/mac80211/key.c | 36 ++++++++++++++++++++++++++++++++++-- + 1 file changed, 34 insertions(+), 2 deletions(-) + +--- a/net/mac80211/key.c ++++ b/net/mac80211/key.c +@@ -610,6 +610,39 @@ void ieee80211_key_free_unused(struct ie + ieee80211_key_free_common(key); + } + ++static bool ieee80211_key_identical(struct ieee80211_sub_if_data *sdata, ++ struct ieee80211_key *old, ++ struct ieee80211_key *new) ++{ ++ u8 tkip_old[WLAN_KEY_LEN_TKIP], tkip_new[WLAN_KEY_LEN_TKIP]; ++ u8 *tk_old, *tk_new; ++ ++ if (!old || new->conf.keylen != old->conf.keylen) ++ return false; ++ ++ tk_old = old->conf.key; ++ tk_new = new->conf.key; ++ ++ /* ++ * In station mode, don't compare the TX MIC key, as it's never used ++ * and offloaded rekeying may not care to send it to the host. This ++ * is the case in iwlwifi, for example. ++ */ ++ if (sdata->vif.type == NL80211_IFTYPE_STATION && ++ new->conf.cipher == WLAN_CIPHER_SUITE_TKIP && ++ new->conf.keylen == WLAN_KEY_LEN_TKIP && ++ !(new->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE)) { ++ memcpy(tkip_old, tk_old, WLAN_KEY_LEN_TKIP); ++ memcpy(tkip_new, tk_new, WLAN_KEY_LEN_TKIP); ++ memset(tkip_old + NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY, 0, 8); ++ memset(tkip_new + NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY, 0, 8); ++ tk_old = tkip_old; ++ tk_new = tkip_new; ++ } ++ ++ return !crypto_memneq(tk_old, tk_new, new->conf.keylen); ++} ++ + int ieee80211_key_link(struct ieee80211_key *key, + struct ieee80211_sub_if_data *sdata, + struct sta_info *sta) +@@ -635,8 +668,7 @@ int ieee80211_key_link(struct ieee80211_ + * Silently accept key re-installation without really installing the + * new version of the key to avoid nonce reuse or replay issues. + */ +- if (old_key && key->conf.keylen == old_key->conf.keylen && +- !crypto_memneq(key->conf.key, old_key->conf.key, key->conf.keylen)) { ++ if (ieee80211_key_identical(sdata, old_key, key)) { + ieee80211_key_free_unused(key); + ret = 0; + goto out; diff --git a/package/kernel/mac80211/patches/999-ccmp-crypto.patch b/package/kernel/mac80211/patches/999-ccmp-crypto.patch deleted file mode 100644 index db2379b0d3..0000000000 --- a/package/kernel/mac80211/patches/999-ccmp-crypto.patch +++ /dev/null @@ -1,234 +0,0 @@ -From patchwork Mon Sep 25 22:29:41 2017 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Subject: [v2] ath10k: add new cipher suite support -From: Rajkumar Manoharan -X-Patchwork-Id: 9970615 -Message-Id: <1506378581-13598-1-git-send-email-rmanohar@qti.qualcomm.com> -To: -Cc: Jouni Malinen , linux-wireless@vger.kernel.org, - Rajkumar Manoharan , rmanohar@codeaurora.org -Date: Mon, 25 Sep 2017 15:29:41 -0700 - -QCA99x0 and QCA4019 family chips support CCMP-256, GCMP-128, and -GCMP-256 ciphers in hardware, so advertise support for these. As -firmware does not support group management frame ciphers (BIP), -handle them in software (mac80211). - -Reviewed-by: Sebastian Gottschall -Cc: Jouni Malinen -Signed-off-by: Rajkumar Manoharan ---- -v2: fix a bug in assigning n_cipher_suites. fill hw_param n_cipher_suites - for all chips. - - drivers/net/wireless/ath/ath10k/core.c | 12 ++++++++++ - drivers/net/wireless/ath/ath10k/hw.h | 3 +++ - drivers/net/wireless/ath/ath10k/mac.c | 43 ++++++++++++++++++++++++++++++++-- - drivers/net/wireless/ath/ath10k/wmi.h | 1 + - 4 files changed, 57 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c -index a4f635820f35..71de3a28b59c 100644 ---- a/drivers/net/wireless/ath/ath10k/core.c -+++ b/drivers/net/wireless/ath/ath10k/core.c -@@ -74,6 +74,7 @@ - .spectral_bin_discard = 0, - .vht160_mcs_rx_highest = 0, - .vht160_mcs_tx_highest = 0, -+ .n_cipher_suites = 8, - }, - { - .id = QCA9887_HW_1_0_VERSION, -@@ -97,6 +98,7 @@ - .spectral_bin_discard = 0, - .vht160_mcs_rx_highest = 0, - .vht160_mcs_tx_highest = 0, -+ .n_cipher_suites = 8, - }, - { - .id = QCA6174_HW_2_1_VERSION, -@@ -119,6 +121,7 @@ - .spectral_bin_discard = 0, - .vht160_mcs_rx_highest = 0, - .vht160_mcs_tx_highest = 0, -+ .n_cipher_suites = 8, - }, - { - .id = QCA6174_HW_2_1_VERSION, -@@ -141,6 +144,7 @@ - .spectral_bin_discard = 0, - .vht160_mcs_rx_highest = 0, - .vht160_mcs_tx_highest = 0, -+ .n_cipher_suites = 8, - }, - { - .id = QCA6174_HW_3_0_VERSION, -@@ -163,6 +167,7 @@ - .spectral_bin_discard = 0, - .vht160_mcs_rx_highest = 0, - .vht160_mcs_tx_highest = 0, -+ .n_cipher_suites = 8, - }, - { - .id = QCA6174_HW_3_2_VERSION, -@@ -188,6 +193,7 @@ - .spectral_bin_discard = 0, - .vht160_mcs_rx_highest = 0, - .vht160_mcs_tx_highest = 0, -+ .n_cipher_suites = 8, - }, - { - .id = QCA99X0_HW_2_0_DEV_VERSION, -@@ -216,6 +222,7 @@ - .spectral_bin_discard = 4, - .vht160_mcs_rx_highest = 0, - .vht160_mcs_tx_highest = 0, -+ .n_cipher_suites = 11, - }, - { - .id = QCA9984_HW_1_0_DEV_VERSION, -@@ -249,6 +256,7 @@ - */ - .vht160_mcs_rx_highest = 1560, - .vht160_mcs_tx_highest = 1560, -+ .n_cipher_suites = 11, - }, - { - .id = QCA9888_HW_2_0_DEV_VERSION, -@@ -281,6 +289,7 @@ - */ - .vht160_mcs_rx_highest = 780, - .vht160_mcs_tx_highest = 780, -+ .n_cipher_suites = 11, - }, - { - .id = QCA9377_HW_1_0_DEV_VERSION, -@@ -303,6 +312,7 @@ - .spectral_bin_discard = 0, - .vht160_mcs_rx_highest = 0, - .vht160_mcs_tx_highest = 0, -+ .n_cipher_suites = 8, - }, - { - .id = QCA9377_HW_1_1_DEV_VERSION, -@@ -327,6 +337,7 @@ - .spectral_bin_discard = 0, - .vht160_mcs_rx_highest = 0, - .vht160_mcs_tx_highest = 0, -+ .n_cipher_suites = 8, - }, - { - .id = QCA4019_HW_1_0_DEV_VERSION, -@@ -356,6 +367,7 @@ - .spectral_bin_discard = 4, - .vht160_mcs_rx_highest = 0, - .vht160_mcs_tx_highest = 0, -+ .n_cipher_suites = 11, - }, - }; - -diff --git a/drivers/net/wireless/ath/ath10k/hw.h b/drivers/net/wireless/ath/ath10k/hw.h -index 0c089f6dd3d9..ed30d5b6cd0e 100644 ---- a/drivers/net/wireless/ath/ath10k/hw.h -+++ b/drivers/net/wireless/ath/ath10k/hw.h -@@ -550,6 +550,9 @@ struct ath10k_hw_params { - */ - int vht160_mcs_rx_highest; - int vht160_mcs_tx_highest; -+ -+ /* Number of ciphers supported (i.e First N) in cipher_suites array */ -+ int n_cipher_suites; - }; - - struct htt_rx_desc; -diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c -index 5683f1a5330e..89455231754c 100644 ---- a/drivers/net/wireless/ath/ath10k/mac.c -+++ b/drivers/net/wireless/ath/ath10k/mac.c -@@ -242,6 +242,16 @@ static int ath10k_send_key(struct ath10k_vif *arvif, - case WLAN_CIPHER_SUITE_WEP104: - arg.key_cipher = WMI_CIPHER_WEP; - break; -+ case WLAN_CIPHER_SUITE_CCMP_256: -+ arg.key_cipher = WMI_CIPHER_AES_CCM; -+ break; -+ case WLAN_CIPHER_SUITE_GCMP: -+ case WLAN_CIPHER_SUITE_GCMP_256: -+ arg.key_cipher = WMI_CIPHER_AES_GCM; -+ break; -+ case WLAN_CIPHER_SUITE_BIP_GMAC_128: -+ case WLAN_CIPHER_SUITE_BIP_GMAC_256: -+ case WLAN_CIPHER_SUITE_BIP_CMAC_256: - case WLAN_CIPHER_SUITE_AES_CMAC: - WARN_ON(1); - return -EINVAL; -@@ -5723,7 +5733,10 @@ static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, - u32 flags2; - - /* this one needs to be done in software */ -- if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC) -+ if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC || -+ key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 || -+ key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 || -+ key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256) - return 1; - - if (arvif->nohwcrypt) -@@ -8074,7 +8087,22 @@ int ath10k_mac_register(struct ath10k *ar) - WLAN_CIPHER_SUITE_WEP104, - WLAN_CIPHER_SUITE_TKIP, - WLAN_CIPHER_SUITE_CCMP, -+ -+ /* Do not add hardware supported ciphers before this line. -+ * Allow software encryption for all chips. Don't forget to -+ * update n_cipher_suites below. -+ */ - WLAN_CIPHER_SUITE_AES_CMAC, -+ WLAN_CIPHER_SUITE_BIP_CMAC_256, -+ WLAN_CIPHER_SUITE_BIP_GMAC_128, -+ WLAN_CIPHER_SUITE_BIP_GMAC_256, -+ -+ /* Only QCA99x0 and QCA4019 varients support GCMP-128, GCMP-256 -+ * and CCMP-256 in hardware. -+ */ -+ WLAN_CIPHER_SUITE_GCMP, -+ WLAN_CIPHER_SUITE_GCMP_256, -+ WLAN_CIPHER_SUITE_CCMP_256, - }; - struct ieee80211_supported_band *band; - void *channels; -@@ -8313,7 +8341,18 @@ int ath10k_mac_register(struct ath10k *ar) - } - - ar->hw->wiphy->cipher_suites = cipher_suites; -- ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites); -+ -+ /* QCA988x and QCA6174 family chips do not support CCMP-256, GCMP-128 -+ * and GCMP-256 ciphers in hardware. Fetch number of ciphers supported -+ * from chip specific hw_param table. -+ */ -+ if (!ar->hw_params.n_cipher_suites || -+ ar->hw_params.n_cipher_suites > ARRAY_SIZE(cipher_suites)) { -+ ath10k_err(ar, "invalid hw_params.n_cipher_suites %d\n", -+ ar->hw_params.n_cipher_suites); -+ ar->hw_params.n_cipher_suites = 8; -+ } -+ ar->hw->wiphy->n_cipher_suites = ar->hw_params.n_cipher_suites; - - wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); - -diff --git a/drivers/net/wireless/ath/ath10k/wmi.h b/drivers/net/wireless/ath/ath10k/wmi.h -index 7a3606dde227..c02b21cff38d 100644 ---- a/drivers/net/wireless/ath/ath10k/wmi.h -+++ b/drivers/net/wireless/ath/ath10k/wmi.h -@@ -4751,6 +4751,7 @@ struct wmi_key_seq_counter { - #define WMI_CIPHER_WAPI 0x5 - #define WMI_CIPHER_CKIP 0x6 - #define WMI_CIPHER_AES_CMAC 0x7 -+#define WMI_CIPHER_AES_GCM 0x8 - - struct wmi_vdev_install_key_cmd { - __le32 vdev_id; - From f364ed43600092202bd19d883b8b502de8e6fbfa Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Fri, 27 Oct 2017 11:32:38 +0800 Subject: [PATCH 10/37] netfilter match bypass default check: fix in kernel 3.18 4.4 4.9 --- ...etfilter_match_bypass_default_checks.patch | 25 ++++++++++++++++--- ...etfilter_match_bypass_default_checks.patch | 25 ++++++++++++++++--- ...etfilter_match_bypass_default_checks.patch | 25 ++++++++++++++++--- 3 files changed, 63 insertions(+), 12 deletions(-) diff --git a/target/linux/generic/pending-3.18/610-netfilter_match_bypass_default_checks.patch b/target/linux/generic/pending-3.18/610-netfilter_match_bypass_default_checks.patch index 74be425049..e5c7a77b46 100644 --- a/target/linux/generic/pending-3.18/610-netfilter_match_bypass_default_checks.patch +++ b/target/linux/generic/pending-3.18/610-netfilter_match_bypass_default_checks.patch @@ -67,11 +67,10 @@ counters = alloc_counters(table); if (IS_ERR(counters)) -@@ -972,6 +1001,14 @@ copy_entries_to_user(unsigned int total_ - ret = -EFAULT; +@@ -973,6 +1002,14 @@ copy_entries_to_user(unsigned int total_ goto free_counters; } -+ + + flags = e->ip.flags & IPT_F_MASK; + if (copy_to_user(userptr + off + + offsetof(struct ipt_entry, ip.flags), @@ -79,6 +78,24 @@ + ret = -EFAULT; + goto free_counters; + } - ++ for (i = sizeof(struct ipt_entry); i < e->target_offset; + i += m->u.match_size) { +@@ -1379,12 +1416,15 @@ compat_copy_entry_to_user(struct ipt_ent + compat_uint_t origsize; + const struct xt_entry_match *ematch; + int ret = 0; ++ u8 flags = e->ip.flags & IPT_F_MASK; + + origsize = *size; + ce = (struct compat_ipt_entry __user *)*dstptr; + if (copy_to_user(ce, e, sizeof(struct ipt_entry)) != 0 || + copy_to_user(&ce->counters, &counters[i], +- sizeof(counters[i])) != 0) ++ sizeof(counters[i])) != 0 || ++ copy_to_user(&ce->ip.flags, &flags, ++ sizeof(flags)) != 0) + return -EFAULT; + + *dstptr += sizeof(struct compat_ipt_entry); diff --git a/target/linux/generic/pending-4.4/610-netfilter_match_bypass_default_checks.patch b/target/linux/generic/pending-4.4/610-netfilter_match_bypass_default_checks.patch index ea9558fccf..8b96639c7f 100644 --- a/target/linux/generic/pending-4.4/610-netfilter_match_bypass_default_checks.patch +++ b/target/linux/generic/pending-4.4/610-netfilter_match_bypass_default_checks.patch @@ -67,11 +67,10 @@ counters = alloc_counters(table); if (IS_ERR(counters)) -@@ -974,6 +1003,14 @@ copy_entries_to_user(unsigned int total_ - ret = -EFAULT; +@@ -975,6 +1004,14 @@ copy_entries_to_user(unsigned int total_ goto free_counters; } -+ + + flags = e->ip.flags & IPT_F_MASK; + if (copy_to_user(userptr + off + + offsetof(struct ipt_entry, ip.flags), @@ -79,6 +78,24 @@ + ret = -EFAULT; + goto free_counters; + } - ++ for (i = sizeof(struct ipt_entry); i < e->target_offset; + i += m->u.match_size) { +@@ -1380,12 +1417,15 @@ compat_copy_entry_to_user(struct ipt_ent + compat_uint_t origsize; + const struct xt_entry_match *ematch; + int ret = 0; ++ u8 flags = e->ip.flags & IPT_F_MASK; + + origsize = *size; + ce = (struct compat_ipt_entry __user *)*dstptr; + if (copy_to_user(ce, e, sizeof(struct ipt_entry)) != 0 || + copy_to_user(&ce->counters, &counters[i], +- sizeof(counters[i])) != 0) ++ sizeof(counters[i])) != 0 || ++ copy_to_user(&ce->ip.flags, &flags, ++ sizeof(flags)) != 0) + return -EFAULT; + + *dstptr += sizeof(struct compat_ipt_entry); diff --git a/target/linux/generic/pending-4.9/610-netfilter_match_bypass_default_checks.patch b/target/linux/generic/pending-4.9/610-netfilter_match_bypass_default_checks.patch index de17074019..6e653ef881 100644 --- a/target/linux/generic/pending-4.9/610-netfilter_match_bypass_default_checks.patch +++ b/target/linux/generic/pending-4.9/610-netfilter_match_bypass_default_checks.patch @@ -76,11 +76,10 @@ Signed-off-by: Felix Fietkau counters = alloc_counters(table); if (IS_ERR(counters)) -@@ -850,6 +879,14 @@ copy_entries_to_user(unsigned int total_ - ret = -EFAULT; +@@ -851,6 +880,14 @@ copy_entries_to_user(unsigned int total_ goto free_counters; } -+ + + flags = e->ip.flags & IPT_F_MASK; + if (copy_to_user(userptr + off + + offsetof(struct ipt_entry, ip.flags), @@ -88,6 +87,24 @@ Signed-off-by: Felix Fietkau + ret = -EFAULT; + goto free_counters; + } - ++ for (i = sizeof(struct ipt_entry); i < e->target_offset; + i += m->u.match_size) { +@@ -1240,12 +1277,15 @@ compat_copy_entry_to_user(struct ipt_ent + compat_uint_t origsize; + const struct xt_entry_match *ematch; + int ret = 0; ++ u8 flags = e->ip.flags & IPT_F_MASK; + + origsize = *size; + ce = (struct compat_ipt_entry __user *)*dstptr; + if (copy_to_user(ce, e, sizeof(struct ipt_entry)) != 0 || + copy_to_user(&ce->counters, &counters[i], +- sizeof(counters[i])) != 0) ++ sizeof(counters[i])) != 0 || ++ copy_to_user(&ce->ip.flags, &flags, ++ sizeof(flags)) != 0) + return -EFAULT; + + *dstptr += sizeof(struct compat_ipt_entry); From d27dad8d2b7c71cf580baf42a00565d8f2294996 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Fri, 27 Oct 2017 11:47:42 +0800 Subject: [PATCH 11/37] add lucii-app-oscam and oscam for SATV --- package/lean/luci-app-oscam/Makefile | 19 ++ .../luasrc/controller/admin/sattv.lua | 16 ++ .../luasrc/model/cbi/sattv/epg.lua | 50 +++++ .../luasrc/model/cbi/sattv/oscam.lua | 67 ++++++ .../lean/luci-app-oscam/root/etc/config/epg | 13 ++ .../lean/luci-app-oscam/root/etc/config/oscam | 4 + .../lean/luci-app-oscam/root/etc/init.d/epg | 23 ++ .../lean/luci-app-oscam/root/etc/init.d/oscam | 70 ++++++ .../luci-app-oscam/root/etc/oscam/oscam.conf | 39 ++++ .../root/etc/oscam/oscam.server | 28 +++ .../luci-app-oscam/root/etc/oscam/oscam.user | 6 + .../root/etc/uci-defaults/luci-sattv | 14 ++ package/lean/luci-app-oscam/root/usr/bin/epg | 199 ++++++++++++++++++ .../luci-app-oscam/root/usr/oscam/oscam.conf | 37 ++++ package/lean/oscam/Makefile | 71 +++++++ 15 files changed, 656 insertions(+) create mode 100644 package/lean/luci-app-oscam/Makefile create mode 100644 package/lean/luci-app-oscam/luasrc/controller/admin/sattv.lua create mode 100644 package/lean/luci-app-oscam/luasrc/model/cbi/sattv/epg.lua create mode 100644 package/lean/luci-app-oscam/luasrc/model/cbi/sattv/oscam.lua create mode 100644 package/lean/luci-app-oscam/root/etc/config/epg create mode 100644 package/lean/luci-app-oscam/root/etc/config/oscam create mode 100755 package/lean/luci-app-oscam/root/etc/init.d/epg create mode 100755 package/lean/luci-app-oscam/root/etc/init.d/oscam create mode 100644 package/lean/luci-app-oscam/root/etc/oscam/oscam.conf create mode 100644 package/lean/luci-app-oscam/root/etc/oscam/oscam.server create mode 100644 package/lean/luci-app-oscam/root/etc/oscam/oscam.user create mode 100644 package/lean/luci-app-oscam/root/etc/uci-defaults/luci-sattv create mode 100755 package/lean/luci-app-oscam/root/usr/bin/epg create mode 100644 package/lean/luci-app-oscam/root/usr/oscam/oscam.conf create mode 100644 package/lean/oscam/Makefile diff --git a/package/lean/luci-app-oscam/Makefile b/package/lean/luci-app-oscam/Makefile new file mode 100644 index 0000000000..70a12e865a --- /dev/null +++ b/package/lean/luci-app-oscam/Makefile @@ -0,0 +1,19 @@ +# +# Copyright (C) 2008-2014 The LuCI Team +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=LuCI for OSCAM +LUCI_DEPENDS:=+oscam +LUCI_PKGARCH:=all +PKG_VERSION:=1.0 +PKG_RELEASE:=1 + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature + + diff --git a/package/lean/luci-app-oscam/luasrc/controller/admin/sattv.lua b/package/lean/luci-app-oscam/luasrc/controller/admin/sattv.lua new file mode 100644 index 0000000000..03f2b172fb --- /dev/null +++ b/package/lean/luci-app-oscam/luasrc/controller/admin/sattv.lua @@ -0,0 +1,16 @@ +module("luci.controller.admin.sattv", package.seeall) + +function index() + +-- entry({"admin", "Others"}, cbi("sattv/epg"), i18n("Others"), 70) + + if nixio.fs.access("/etc/config/epg") then + entry({"admin", "Others"}, cbi("sattv/epg"), _("sattv"), 66).index = true + entry({"admin", "Others", "epg"}, cbi("sattv/epg"), _("EPG"), 1).i18n = "diskapply" + end + + if nixio.fs.access("/etc/config/oscam") then + entry({"admin", "Others", "oscam"}, cbi("sattv/oscam"), _("OSCAM"), 12).i18n = "diskapply" + end + +end diff --git a/package/lean/luci-app-oscam/luasrc/model/cbi/sattv/epg.lua b/package/lean/luci-app-oscam/luasrc/model/cbi/sattv/epg.lua new file mode 100644 index 0000000000..da46cad90f --- /dev/null +++ b/package/lean/luci-app-oscam/luasrc/model/cbi/sattv/epg.lua @@ -0,0 +1,50 @@ +require("luci.tools.webadmin") + +--[[ +config epg_set + option enable 1 + option time 30 + option src_url http://dm.epg.net.cn/a/epg.xml + option src_url1 http://dm1.epg.net.cn/a/epg.xml + option src_url2 http://epg.xltvrobbs.net/atmosphere/epg/epg.xml + option src_url3 http://epg1.xltvrobbs.net/atmosphere/epg/epg.xml + +]]-- + + +m = Map("epg", translate("epg_title","Set epg download address"),translate("epg_desc", +"Set epg auto download for dm500 atmosphere")) + +s = m:section(TypedSection, "epg_set", translate("epgset","settings")) +s.anonymous = true +s.addremove = false + +enable = s:option(Flag, "enable", translate("enable", "enable")) +enable.default = false +enable.optional = false +enable.rmempty = false + +interval = s:option(Value, "interval", translate("interval","interval")) +interval.default = 30 +interval.optional = false +interval.rmempty = false + + +s = m:section(TypedSection, "downaddress", translate("downaddress","downaddress")) +s.template = "cbi/tblsection" +s.anonymous = false +s.addremove = true + +enable = s:option(Flag, "addr_enable", translate("enable", "enable")) +enable.default = false +enable.optional = false +enable.rmempty = false + + +url = s:option(Value, "address", translate("dowload address","dowload address")) +url.optional = false +url.rmempty = false + + +return m + diff --git a/package/lean/luci-app-oscam/luasrc/model/cbi/sattv/oscam.lua b/package/lean/luci-app-oscam/luasrc/model/cbi/sattv/oscam.lua new file mode 100644 index 0000000000..44a19fcfd4 --- /dev/null +++ b/package/lean/luci-app-oscam/luasrc/model/cbi/sattv/oscam.lua @@ -0,0 +1,67 @@ +--[[ +LuCI - Lua Configuration Interface + +Copyright 2011 flyzjhz + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +]]-- + + +local fs = require "nixio.fs" +local uci = require "luci.model.uci".cursor() +local lanipaddr = uci:get("network", "lan", "ipaddr") or "192.168.1.1" +--- Retrieves the output of the "get_oscam_port" command. +-- @return String containing the current get_oscam_port +function get_oscam_port() + + local oscam_conf= fs.readfile("/usr/oscam/oscam.conf") + local oscam_conf_port = tonumber(oscam_conf:match("[Hh]ttppor[Tt].-= ([^\n]+)")) or "8899" + return oscam_conf_port +end + +local oscamport = get_oscam_port() + +m = Map("oscam", translate("OSCAM","OSCAM"),translate("oscam desc", +"oscam for openwrt")) + +s = m:section(TypedSection, "setting", translate("set","settings")) +s.anonymous = true +s.addremove = false + +enable = s:option(Flag, "enable", translate("enable", "enable")) +enable.default = false +enable.optional = false +enable.rmempty = false + +interval = s:option(Value, "interval", translate("interval","interval"), +translate("interval_desc","interval_desc")) +interval.optional = false +interval.rmempty = false +interval.default = 30 + +s:option(DummyValue,"oscamweb" ,translate("OSCAM Web Intelface "),translate("Open the oscam Web")) + +tmpl = s:option(Value, "_tmpl", + translate("Edit oscam configuration."), + translate("This is the content of the file '/usr/oscam/oscam.conf'")) + +tmpl.template = "cbi/tvalue" +tmpl.rows = 20 + +function tmpl.cfgvalue(self, section) + return nixio.fs.readfile("/usr/oscam/oscam.conf") +end + +function tmpl.write(self, section, value) + value = value:gsub("\r\n?", "\n") + nixio.fs.writefile("//usr/oscam/oscam.conf", value) +end + +return m + + diff --git a/package/lean/luci-app-oscam/root/etc/config/epg b/package/lean/luci-app-oscam/root/etc/config/epg new file mode 100644 index 0000000000..9c2791f687 --- /dev/null +++ b/package/lean/luci-app-oscam/root/etc/config/epg @@ -0,0 +1,13 @@ + +config 'epg_set' + option 'enable' '0' + option 'interval' '30' + +config 'downaddress' 'epg1' + option 'addr_enable' '1' + option 'address' 'http://dm.epg.net.cn/a/epg.xml' + +config 'downaddress' 'epg2' + option 'addr_enable' '1' + option 'address' 'http://epg.xltvrobbs.net/atmosphere/epg/epg.xml' + diff --git a/package/lean/luci-app-oscam/root/etc/config/oscam b/package/lean/luci-app-oscam/root/etc/config/oscam new file mode 100644 index 0000000000..795ea4e3c5 --- /dev/null +++ b/package/lean/luci-app-oscam/root/etc/config/oscam @@ -0,0 +1,4 @@ + +config 'setting' + option 'enable' '0' + diff --git a/package/lean/luci-app-oscam/root/etc/init.d/epg b/package/lean/luci-app-oscam/root/etc/init.d/epg new file mode 100755 index 0000000000..9b9014cddb --- /dev/null +++ b/package/lean/luci-app-oscam/root/etc/init.d/epg @@ -0,0 +1,23 @@ +#!/bin/sh /etc/rc.common +# copyrights +# (1)epg dowload Script VER 0.10for openwrt by zjhzzyf + + + +START=96 + + + +start(){ + + + /usr/bin/epg start +} + +stop() { + echo "not implemented yet!" +} + +restart() { + start +} \ No newline at end of file diff --git a/package/lean/luci-app-oscam/root/etc/init.d/oscam b/package/lean/luci-app-oscam/root/etc/init.d/oscam new file mode 100755 index 0000000000..ca40a36089 --- /dev/null +++ b/package/lean/luci-app-oscam/root/etc/init.d/oscam @@ -0,0 +1,70 @@ +#!/bin/sh /etc/rc.common +# oscam Script VER 0.10 for openwrt by zjhzzyf + +START=94 + +. /etc/functions.sh +path="/usr/oscam/" + + +kill_oscam() +{ +local otherpids +local execute +otherpids=$(ps -a 2>&1 | grep "/usr/bin/oscam" | grep -v $$ | awk -F " " '{print $1}') +echo "$otherpids" | while read execute +do +kill -9 ${execute} +done +} + + + +oscam_start() +{ + + /usr/bin/oscam -b -c $path + echo "readdy go....." + +} + + + +start(){ +echo "game start....." + enable=$(uci get oscam.@setting[0].enable) + if [ "$enable" == "" ];then + enable=0 + fi + + [ "$enable" == "1" ]&&oscam_start + +interval=$(uci get oscam.@setting[0].interval) +oscam_cron=`cat /etc/crontabs/root | grep "/etc/init.d/oscam restart"` +if [ "$enable" == "1" -a "$interval" != "0" ]; then + oscam_new="*/${interval} * * * * /etc/init.d/oscam restart" + if [ "z${oscam_cron}" != "z${oscam_new}" ] ; then + cat /etc/crontabs/root | grep -v "/etc/init.d/oscam restart" > /tmp/crontabs_oscam + echo "" >> /tmp/crontabs_oscam + echo "*/${interval} * * * * /etc/init.d/oscam restart" >> /tmp/crontabs_oscam + cat /tmp/crontabs_oscam | grep -v ^$ > /etc/crontabs/root + /etc/init.d/cron restart + fi +else + if [ "z${oscam_cron}" != "z" ] ; then + cat /etc/crontabs/root | grep -v "/etc/init.d/oscam restart" > /tmp/crontabs_oscam + cat /tmp/crontabs_oscam | grep -v ^$ > /etc/crontabs/root + /etc/init.d/cron restart + fi + +fi +rm -f /tmp/crontabs_oscam + +} + +stop() { + kill_oscam + echo "oscam stopped" +} + + diff --git a/package/lean/luci-app-oscam/root/etc/oscam/oscam.conf b/package/lean/luci-app-oscam/root/etc/oscam/oscam.conf new file mode 100644 index 0000000000..51abc783f8 --- /dev/null +++ b/package/lean/luci-app-oscam/root/etc/oscam/oscam.conf @@ -0,0 +1,39 @@ +# oscam.conf generated automatically by Streamboard OSCAM 1.00-unstable_svn build #r4503 +# Read more: http://streamboard.gmc.to/oscam/browser/trunk/Distribution/doc/txt/oscam.conf.txt + +[global] +logfile = /dev/shm/oscam.log +disablelog = 1 +clientmaxidle = 36000 +bindwait = 5 +netprio = 9 +nice = 9 +waitforcards = 0 +lb_mode = 1 + +[monitor] +port = 9988 +nocrypt = +aulow = 120 +hideclient_to = 0 +monlevel = 255 +appendchaninfo = 0 + +[dvbapi] +enabled = 1 +au = 1 +boxtype = none +user = user1 +pmt_mode = 0 +request_mode = 0 + +[webif] +httpport = 8899 +httpuser = oscam +httppwd = oscam +httprefresh = 0 +httpallowed = 1.0.0.0-255.255.0.0 +httphideidleclients = 0 +httpreadonly = 0 +httpsavefullcfg = 0 + diff --git a/package/lean/luci-app-oscam/root/etc/oscam/oscam.server b/package/lean/luci-app-oscam/root/etc/oscam/oscam.server new file mode 100644 index 0000000000..876103ba03 --- /dev/null +++ b/package/lean/luci-app-oscam/root/etc/oscam/oscam.server @@ -0,0 +1,28 @@ +# oscam.server generated automatically by Streamboard OSCAM 1.00-unstable_svn build #r4503 +# Read more: http://streamboard.gmc.to/oscam/browser/trunk/Distribution/doc/txt/oscam.server.txt + +[reader] +label = reshare1 +enable = 0 +protocol = cccam +device = oscam.3322.org,13111 +user = test01 +password = test01 +inactivitytimeout = 1 +reconnecttimeout = 3 +group = 1 +blockemm-unknown = 1 +blockemm-u = 1 +blockemm-s = 1 +blockemm-g = 1 +lb_weight = 100 +cccversion = 2.1.2 +cccmaxhops = 12 +ccckeepalive = 1 +audisabled = 1 +cccdisableautoblock = 1 + + + + + diff --git a/package/lean/luci-app-oscam/root/etc/oscam/oscam.user b/package/lean/luci-app-oscam/root/etc/oscam/oscam.user new file mode 100644 index 0000000000..f02c1bc848 --- /dev/null +++ b/package/lean/luci-app-oscam/root/etc/oscam/oscam.user @@ -0,0 +1,6 @@ +[account] +user = 001 +pwd = 001 +group = 1 +keepalive = 1 +uniq = 0 diff --git a/package/lean/luci-app-oscam/root/etc/uci-defaults/luci-sattv b/package/lean/luci-app-oscam/root/etc/uci-defaults/luci-sattv new file mode 100644 index 0000000000..a9e7595807 --- /dev/null +++ b/package/lean/luci-app-oscam/root/etc/uci-defaults/luci-sattv @@ -0,0 +1,14 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@epg[-1] + add ucitrack epg + set ucitrack.@epg[-1].init=epg + delete ucitrack.@oscam[-1] + add ucitrack oscam + set ucitrack.@oscam[-1].init=oscam + add_list ucitrack.@oscam[-1].affects=cron + commit ucitrack +EOF +rm -f /tmp/luci-indexcache +exit 0 diff --git a/package/lean/luci-app-oscam/root/usr/bin/epg b/package/lean/luci-app-oscam/root/usr/bin/epg new file mode 100755 index 0000000000..e51b91fc40 --- /dev/null +++ b/package/lean/luci-app-oscam/root/usr/bin/epg @@ -0,0 +1,199 @@ +#!/bin/sh +# copyrights +# (1)epg dowload Script VER 0.10for openwrt by zjhzzyf + + +. /lib/functions.sh + + +epg_down() +{ + bsuc=1 + echo "File Path:"$path + filename="epg.xml" + echo "Setup FileName:"$filename + sfullfilename=`echo $path$filename` + echo "sFullFileName:"$sfullfilename + + index=0 + echo "Try Times Max:"$trytimes + while [ "$index" -lt "$trytimes" ] + do + echo "Try Times:"$index + if wget -qO- -t3 $url > $sfullfilename;then + break + fi + index=`expr $index + 1` + done + if [ "$index" -eq "$trytimes" ]; then + ErrMsg=`date` + ErrMsg=$ErrMsg" 下载配置文件失败" + bsuc=0 + return + fi + echo "down $filename completed" +mfullfilename=`echo ${path}store/${filename}.md5` + echo "MD5 File Name:"$mfullfilename + md5old=`cat $mfullfilename` + md5old=`echo $md5old|awk '{print $1}'|tr "[a-z]" "[A-Z]"` + echo "Old File MD5:"$md5old + md5new=`/usr/bin/md5sum $sfullfilename` + md5new=`echo $md5new|awk '{print $1}'|tr "[a-z]" "[A-Z]"` + echo "New File MD5:"$md5new + if [ "$md5old" = "$md5new" ]; then + ErrMsg=`date` + ErrMsg=$ErrMsg" 数据不需要更新" + bsuc=1 + return + else + + counttimes=0 + suctimes=0 + counttimes=`expr $counttimes + 1` + url=$(grep -m 1 "URL" $sfullfilename |awk -F "" '{print $2}'|awk -F "" '{print $1}') + echo "Down Data URL:" $url + +filename=`echo ${url##*/}` + echo "Down File Name:"$filename + + echo "=====" +echo $url + replaces=`echo ${url%/*}` + +replaces=`echo ${replaces#*//}` + + echo replaces: $replaces + echo -e `sed -e "s#$replaces#$replaced#g" $sfullfilename` > `echo $sfullfilename` + echo "=====" + + dfullfilename=`echo $path$filename` + echo "Down Data Save File Name:"$dfullfilename + + index=0 + while [ "$index" -lt "$trytimes" ] + do + echo "Try Times:"$index + if wget -t3 -T120 -qO- $url > $dfullfilename;then + suctimes=`expr $suctimes + 1` + + break + fi + index=`expr $index + 1` + + done + + if [ "$index" -eq "$trytimes" ]; then + bsuc=0 + ErrMsg=`date` + ErrMsg=$ErrMsg" 下载"$url"失败" + + fi + + + if [ "$counttimes" -eq "$suctimes" ]; then + echo $md5new > `echo $mfullfilename` + +mount -o bind /tmp/epg/ /www/atmosphere + rm -rf ${path}/epg/* + +cp ${path}$filename ${path}/epg +cp ${path}epg.xml ${path}/epg + rm -rf ${path}$filename + rm -rf ${path}epg.xml + ErrMsg=`date` + ErrMsg=$ErrMsg" 下载EPG数据成功" + echo $ErrMsg + exit 0 + else + ErrMsg=`date` + ErrMsg= $ErrMsg " 未知原因失败" + fi + fi +} + + +epg_start() { + +config_get enable $1 enable +config_get interval $1 interval +[ "$enable" = "" ]&&enable=0 + +#make scheduler + +epg_cron=`cat /etc/crontabs/root | grep "/usr/bin/epg scheduler"` +if [ "$enable" == "1" -a "${interval}" != "0" ]; then + mkdir -p /tmp/epg/ + mkdir -p /tmp/epg/store + mkdir -p /tmp/epg/epg + mkdir -p /www/atmosphere + epg_new="*/${interval} * * * * /usr/bin/epg scheduler" + if [ "z${epg_cron}" != "z${epg_new}" ] ; then + cat /etc/crontabs/root | grep -v "/etc/init.d/epg scheduler" > /tmp/crontabs_epg + echo "*/${interval} * * * * /etc/init.d/epg scheduler" >> /tmp/crontabs_epg + echo "" >> /tmp/crontabs_epg + cat /tmp/crontabs_epg | grep -v ^$ > /etc/crontabs/root + /etc/init.d/cron restart + fi +else + if [ "z${epg_cron}" != "z" ] ; then + cat /etc/crontabs/root | grep -v "/etc/init.d/epg scheduler" > /tmp/crontabs_epg + cat /tmp/crontabs_epg | grep -v ^$ > /etc/crontabs/root + /etc/init.d/cron restart + fi +rm -f /tmp/crontabs_epg + +fi + +/etc/init.d/cron restart + +} + + +con_get_addr(){ + + config_get addr_enable $1 addr_enable + config_get address $1 address + +[ "$addr_enable" == "1" ]&&{ +url=$address +echo $url +ErrMsg=`date` +ErrMsg=$ErrMsg" 开始从"$url"下载" +echo $ErrMsg >> `echo /tmp/epglog.txt` +rm `echo $path"*"` +epg_down +echo $ErrMsg >> `echo /tmp/epglog.txt` +echo $bsuc +echo "******************************************************************" >> `echo /tmp/epglog.txt` +} +} + + + +epg_scheduler(){ + +path="/tmp/epg/" +trytimes=3 +bsuc=1 +ErrMsg="" +lan_ipaddr=$(uci get network.lan.ipaddr) +replaced="${lan_ipaddr}/atmosphere/epg" + + +} + + +config_load epg +case "$1" in + start) + config_foreach epg_start epg_set + ;; + stop) + echo "stop test " + ;; + scheduler) + epg_scheduler + config_foreach con_get_addr downaddress +;; +esac + diff --git a/package/lean/luci-app-oscam/root/usr/oscam/oscam.conf b/package/lean/luci-app-oscam/root/usr/oscam/oscam.conf new file mode 100644 index 0000000000..a552326fe3 --- /dev/null +++ b/package/lean/luci-app-oscam/root/usr/oscam/oscam.conf @@ -0,0 +1,37 @@ +[global] +# Prozess +nice = -10 +pidfile = /tmp/oscam.pid +# Logging +logfile = /tmp/oscam.log +disablelog = 0 +maxlogsize = 256 +usrfile = /tmp/oscam_user.log +disableuserfile = 0 +usrfileflag = 1 +# Timeouts - If you have problems adjust or remove rows! +clienttimeout = 2000 +fallbacktimeout = 1000 +serialreadertimeout = 800 +# Sonstiges +clientdyndns = 0 +unlockparental = 1 +saveinithistory = 1 + +[monitor] +port = 15990 +nocrypt = 127.0.0.1,192.168.1.1-192.168.1.255 # "No entry for other IP's!" +aulow = 30 +hideclient_to = 0 +monlevel = 4 +appendchaninfo = 0 + +[camd35] +port = 15991 + +[webif] +httpport = 16000 +httprefresh = 0 +httpallowed = 127.0.0.1,192.168.1.1-192.168.1.255 # "No entry for other IP's!" +httphideidleclients = 0 +httpreadonly = 0 diff --git a/package/lean/oscam/Makefile b/package/lean/oscam/Makefile new file mode 100644 index 0000000000..6a1d1c44c6 --- /dev/null +++ b/package/lean/oscam/Makefile @@ -0,0 +1,71 @@ +# +# Copyright (C) 2010 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# +# maz-1 + +include $(TOPDIR)/rules.mk + +PKG_BRANCH:=trunk +PKG_SOURCE_URL:=http://www.streamboard.tv/svn/oscam/trunk +#PKG_REV:=$(shell LC_ALL=C svn info ${PKG_SOURCE_URL} | sed -ne's/^Last Changed Rev: //p') +PKG_REV:=10777 + +PKG_NAME:=oscam +PKG_VERSION:=svn$(PKG_REV) +PKG_RELEASE:=1 + +PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) +PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.gz +PKG_SOURCE_PROTO:=svn +PKG_SOURCE_VERSION:=$(PKG_REV) + +PKG_BUILD_DEPENDS:= + +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) +PKG_INSTALL_DIR:=$(PKG_BUILD_DIR) + + + +include $(INCLUDE_DIR)/package.mk + +define Package/oscam + DEPENDS:=+libopenssl +libpthread +libusb-1.0 + TITLE:=Open Source Conditional Access Module software + URL:=http://streamboard.gmc.to/oscam/ + SUBMENU:= +endef + +define Package/oscam/description + An Open Source Conditional Access Module software, +based on the very good MpCS version 0.9d created by dukat. +endef + +CONFIGURE_ARGS += --with-ssl=openssl + +define Build/Prepare + $(call Build/Prepare/Default) + mkdir -p $(PKG_BUILD_DIR)/build + cd $(PKG_BUILD_DIR)/build; +endef + +define Package/oscam/conffiles +endef + +define Build/Compile + echo 'set (OSCAM_SYSTEM_NAME wrt350nv2)' > $(PKG_BUILD_DIR)/toolchain.cmake + echo 'set (CMAKE_SYSTEM_NAME Linux)' >> $(PKG_BUILD_DIR)/toolchain.cmake + echo 'set (CMAKE_C_COMPILER $(TARGET_CROSS)gcc)' >> $(PKG_BUILD_DIR)/toolchain.cmake + echo 'set (CMAKE_SYSTEM_PROCESSOR $(ARCH))' >> $(PKG_BUILD_DIR)/toolchain.cmake + cd $(PKG_BUILD_DIR)/build;cmake -DCMAKE_TOOLCHAIN_FILE=$(PKG_BUILD_DIR)/toolchain.cmake ..;make +endef + + +define Package/oscam/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/build/oscam $(1)/usr/bin/ +endef + +$(eval $(call BuildPackage,oscam)) From 73db9ba2f8ba1e27a0233a707a7f1b24cf7ab7d8 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Fri, 27 Oct 2017 12:05:15 +0800 Subject: [PATCH 12/37] add luci-app-dogcom --- package/lean/luci-app-dogcom/LICENSE | 661 ++++++++++++++++++ package/lean/luci-app-dogcom/Makefile | 68 ++ package/lean/luci-app-dogcom/README.md | 2 + .../files/luci/controller/dogcom.lua | 14 + .../files/luci/i18n/dogcom_zh-cn.lmo | Bin 0 -> 500 bytes .../files/luci/i18n/dogcom_zh-cn.po | 46 ++ .../files/luci/model/cbi/dogcom.lua | 72 ++ .../files/luci/view/dogcom/auto_configure.htm | 167 +++++ .../files/root/etc/config/dogcom | 3 + .../files/root/etc/init.d/dogcom | 34 + .../root/etc/uci-defaults/40_luci-dogcom | 11 + 11 files changed, 1078 insertions(+) create mode 100644 package/lean/luci-app-dogcom/LICENSE create mode 100644 package/lean/luci-app-dogcom/Makefile create mode 100644 package/lean/luci-app-dogcom/README.md create mode 100644 package/lean/luci-app-dogcom/files/luci/controller/dogcom.lua create mode 100644 package/lean/luci-app-dogcom/files/luci/i18n/dogcom_zh-cn.lmo create mode 100644 package/lean/luci-app-dogcom/files/luci/i18n/dogcom_zh-cn.po create mode 100644 package/lean/luci-app-dogcom/files/luci/model/cbi/dogcom.lua create mode 100644 package/lean/luci-app-dogcom/files/luci/view/dogcom/auto_configure.htm create mode 100644 package/lean/luci-app-dogcom/files/root/etc/config/dogcom create mode 100644 package/lean/luci-app-dogcom/files/root/etc/init.d/dogcom create mode 100644 package/lean/luci-app-dogcom/files/root/etc/uci-defaults/40_luci-dogcom diff --git a/package/lean/luci-app-dogcom/LICENSE b/package/lean/luci-app-dogcom/LICENSE new file mode 100644 index 0000000000..dbbe355815 --- /dev/null +++ b/package/lean/luci-app-dogcom/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/package/lean/luci-app-dogcom/Makefile b/package/lean/luci-app-dogcom/Makefile new file mode 100644 index 0000000000..a75234392f --- /dev/null +++ b/package/lean/luci-app-dogcom/Makefile @@ -0,0 +1,68 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-dogcom +PKG_VERSION:=1.0.2 +PKG_RELEASE:=1 + +PKG_MAINTAINER:=fuyumi <280604399@qq.com> +PKG_LICENSE:=AGPLv3 +PKG_LICENSE_FILES:=LICENSE + +PKG_SOURCE_SUBDIR:=$(PKG_NAME) +PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.gz +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_SUBDIR) +PKG_BUILD_PARALLEL:=1 + +include $(INCLUDE_DIR)/package.mk + +define Package/luci-app-dogcom + SECTION:=luci + CATEGORY:=LuCI + SUBMENU:=3. Applications + TITLE:=LuCI app for openwrt-dogcom + DEPENDS:=+dogcom + PKGARCH:=all + MAINTAINER:=fuyumi +endef + +define Package/luci-app-dogcom/description + This package contains LuCI configuration pages for openwrt-dogcom. +endef + +define Build/Prepare +endef + +define Build/Configure +endef + +define Build/Compile +endef + +define Package/luci-app-dogcom/postinst +#!/bin/sh +if [ -z "$${IPKG_INSTROOT}" ]; then + ( . /etc/uci-defaults/luci-app-dogcom ) && rm -f /etc/uci-defaults/luci-app-dogcom + rm -f /tmp/luci-indexcache +fi +exit 0 +endef + +define Package/luci-app-dogcom/install + $(INSTALL_DIR) $(1)/etc/uci-defaults + $(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller + $(INSTALL_DIR) $(1)/usr/lib/lua/luci/model/cbi + $(INSTALL_DIR) $(1)/usr/lib/lua/luci/view/dogcom + $(INSTALL_DIR) $(1)/usr/lib/lua/luci/i18n + $(INSTALL_DIR) $(1)/etc/config + $(INSTALL_DIR) $(1)/etc/init.d + + $(INSTALL_BIN) ./files/root/etc/uci-defaults/40_luci-dogcom $(1)/etc/uci-defaults/luci-app-dogcom + $(INSTALL_DATA) ./files/luci/controller/dogcom.lua $(1)/usr/lib/lua/luci/controller/dogcom.lua + $(INSTALL_DATA) ./files/luci/model/cbi/dogcom.lua $(1)/usr/lib/lua/luci/model/cbi/dogcom.lua + $(INSTALL_DATA) ./files/luci/view/dogcom/auto_configure.htm $(1)/usr/lib/lua/luci/view/dogcom/auto_configure.htm + $(INSTALL_DATA) ./files/luci/i18n/dogcom_zh-cn.lmo $(1)/usr/lib/lua/luci/i18n/dogcom.zh-cn.lmo + $(INSTALL_CONF) ./files/root/etc/config/dogcom $(1)/etc/config/dogcom + $(INSTALL_BIN) ./files/root/etc/init.d/dogcom $(1)/etc/init.d/dogcom +endef + +$(eval $(call BuildPackage,luci-app-dogcom)) diff --git a/package/lean/luci-app-dogcom/README.md b/package/lean/luci-app-dogcom/README.md new file mode 100644 index 0000000000..3ae6ffae9c --- /dev/null +++ b/package/lean/luci-app-dogcom/README.md @@ -0,0 +1,2 @@ +# luci-app-dogcom +LuCI app for [openwrt-dogcom](https://github.com/mchome/openwrt-dogcom "") \ No newline at end of file diff --git a/package/lean/luci-app-dogcom/files/luci/controller/dogcom.lua b/package/lean/luci-app-dogcom/files/luci/controller/dogcom.lua new file mode 100644 index 0000000000..397101118c --- /dev/null +++ b/package/lean/luci-app-dogcom/files/luci/controller/dogcom.lua @@ -0,0 +1,14 @@ +-- Copyright (C) 2017 fuyumi <280604399@qq.com> +-- Licensed to the public under the GNU Affero General Public License v3. + +module("luci.controller.dogcom", package.seeall) + +function index() + if not nixio.fs.access("/etc/config/dogcom") then + return + end + local page + page = entry({"admin", "network", "dogcom"}, cbi("dogcom"), _("dogcom"), 100) + page.i18n = "dogcom" + page.dependent = true +end \ No newline at end of file diff --git a/package/lean/luci-app-dogcom/files/luci/i18n/dogcom_zh-cn.lmo b/package/lean/luci-app-dogcom/files/luci/i18n/dogcom_zh-cn.lmo new file mode 100644 index 0000000000000000000000000000000000000000..0b5549bb8b5254b5e5c8eed2288ec87d0103ad83 GIT binary patch literal 500 zcmZ?CPfyOzRd}&(-}Ale7#J8_p#1$4UM%c+vSaPzh9;QUvpK6?fQ3O~Pv`G?HfIe) z+tUf_pHErA!0^1Y11QG8kdl#H@P1E+3y}YQPbULIK|w)&Do`K*DgdHi>|OI@XXn$k z)1R+d_G01ECp#J$7+$va0v+*eTKkjT+g|LS`DDi`2>aQL_4=tL$@(c^x9KJ4=cR$1 z!0>#^{AV2#Ai7?x-~MDr*ONU9p6p%ld{)b|sT-d4u6x?k`hHK(^OkK-C-gnpzwX(T zoln=dJzvoHbmz9GOM0JnYd>AiD&J#eyns+P*C+3jnfvfS9NB*o>yrP5CE)><}R4t2iVOy_a3Z z4#;)^VzxRqlf&Ciy4nEQ7C_9?;jt{;MY4bm$Oh>NpT%yIcgt$7J&^4K#B7VYPSvgq z;kyQ8s{pa^q9fL^rmJ_H1G4u3G0)b*3$o_HvsVGxAU6v?eG((pv}VP7AR7dD85kH9 E09~i&l>h($ literal 0 HcmV?d00001 diff --git a/package/lean/luci-app-dogcom/files/luci/i18n/dogcom_zh-cn.po b/package/lean/luci-app-dogcom/files/luci/i18n/dogcom_zh-cn.po new file mode 100644 index 0000000000..29fde2647f --- /dev/null +++ b/package/lean/luci-app-dogcom/files/luci/i18n/dogcom_zh-cn.po @@ -0,0 +1,46 @@ +msgid "" +msgstr "" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Dogcom config" +msgstr "Dogcom 设置" + +msgid "Dogcom is running." +msgstr "Dogcom 运行中。" + +msgid "Dogcom is not running." +msgstr "Dogcom 未运行。" + +msgid "Basic Settings" +msgstr "基本设置" + +msgid "Enable" +msgstr "启用" + +msgid "Version" +msgstr "版本" + +msgid "dhcp" +msgstr "dhcp(D版)" + +msgid "pppoe" +msgstr "pppoe(P版)" + +msgid "Patch the escape problem" +msgstr "P版转义字符补丁" + +msgid "configfile" +msgstr "配置文件" + +msgid "This file is /etc/dogcom.conf." +msgstr "这个文件是/etc/dogcom.conf。" + +msgid "Generate Configuration" +msgstr "生成配置" + +msgid "Please upload your packet file. Then change password and copy to basic settings." +msgstr "请上传你的数据包,然后修改密码并复制到基本设置配置文件中。" \ No newline at end of file diff --git a/package/lean/luci-app-dogcom/files/luci/model/cbi/dogcom.lua b/package/lean/luci-app-dogcom/files/luci/model/cbi/dogcom.lua new file mode 100644 index 0000000000..002fa2cd23 --- /dev/null +++ b/package/lean/luci-app-dogcom/files/luci/model/cbi/dogcom.lua @@ -0,0 +1,72 @@ +-- Copyright (C) 2017 fuyumi <280604399@qq.com> +-- Licensed to the public under the GNU Affero General Public License v3. + +local m, s + +local running = (luci.sys.call("pidof dogcom > /dev/null") == 0) +if running then + m = Map("dogcom", translate("Dogcom config"), translate("Dogcom is running.")) +else + m = Map("dogcom", translate("Dogcom config"), translate("Dogcom is not running.")) +end + +s = m:section(TypedSection, "dogcom", "") +s.addremove = false +s.anonymous = true + +-- Basic Settings -- +s:tab("basic", translate("Basic Settings")) + +enable = s:taboption("basic", Flag, "enabled", translate("Enable")) +enable.rmempty = false +function enable.cfgvalue(self, section) + return luci.sys.init.enabled("dogcom") and self.enabled or self.disabled +end + +version = s:taboption("basic", ListValue, "version", translate("Version")) +version:value("dhcp", translate("dhcp")) +version:value("pppoe", translate("pppoe")) +version.value = "dhcp" + +escpatch = s:taboption("basic", Button, "esc", translate("Patch the escape problem")) +function escpatch.write() + luci.sys.call("sed -i '/proto_run_command/i username=`echo -e \"$username\"`' /lib/netifd/proto/ppp.sh") + luci.sys.call("sed -i '/proto_run_command/i password=`echo -e \"$password\"`' /lib/netifd/proto/ppp.sh") +end + +config = s:taboption("basic", Value, "config", translate("configfile"), translate("This file is /etc/dogcom.conf."), "") +config.template = "cbi/tvalue" +config.rows = 15 +config.wrap = "off" + +function config.cfgvalue(self, section) + return nixio.fs.readfile("/etc/dogcom.conf") +end + +function config.write(self, section, value) + value = value:gsub("\r\n?", "\n") + nixio.fs.writefile("/etc/dogcom.conf", value) +end + +-- Generate Configuration -- +s:tab("generator", translate("Generate Configuration")) + +msg = s:taboption("generator", DummyValue, "", translate(""), +translate("Please upload your packet file. Then change password and copy to basic settings.")) + +autoconfig = s:taboption("generator", DummyValue, "autoconfig") +autoconfig.template = "dogcom/auto_configure" + +-- Save Configuration -- +function enable.write(self, section, value) + if value == "1" then + luci.sys.call("/etc/init.d/dogcom enable >/dev/null") + luci.sys.call("/etc/init.d/dogcom start >/dev/null") + else + luci.sys.call("/etc/init.d/dogcom stop >/dev/null") + luci.sys.call("/etc/init.d/dogcom disable >/dev/null") + end + Flag.write(self, section, value) +end + +return m \ No newline at end of file diff --git a/package/lean/luci-app-dogcom/files/luci/view/dogcom/auto_configure.htm b/package/lean/luci-app-dogcom/files/luci/view/dogcom/auto_configure.htm new file mode 100644 index 0000000000..f02995f371 --- /dev/null +++ b/package/lean/luci-app-dogcom/files/luci/view/dogcom/auto_configure.htm @@ -0,0 +1,167 @@ +<%# +Copyright (C) 2017 fuyumi <280604399@qq.com> +Licensed to the public under the GNU Affero General Public License v3. +%> + +<%+cbi/valueheader%> + + +
+ + + +
+ + + +<%+cbi/valuefooter%> diff --git a/package/lean/luci-app-dogcom/files/root/etc/config/dogcom b/package/lean/luci-app-dogcom/files/root/etc/config/dogcom new file mode 100644 index 0000000000..6630300cc4 --- /dev/null +++ b/package/lean/luci-app-dogcom/files/root/etc/config/dogcom @@ -0,0 +1,3 @@ +config dogcom 'config' + option enabled '0' + option version 'dhcp' \ No newline at end of file diff --git a/package/lean/luci-app-dogcom/files/root/etc/init.d/dogcom b/package/lean/luci-app-dogcom/files/root/etc/init.d/dogcom new file mode 100644 index 0000000000..8a32d48ebe --- /dev/null +++ b/package/lean/luci-app-dogcom/files/root/etc/init.d/dogcom @@ -0,0 +1,34 @@ +#!/bin/sh /etc/rc.common +# Copyright (c) 2011-2017 OpenWrt.org + +START=90 + +start(){ + config_load dogcom + config_get version config version + if [ "$version" == "dhcp" ]; then + /usr/bin/dogcom -m dhcp -c /etc/dogcom.conf -d -e + echo "Dogcom version dhcp has been started." + else + /usr/bin/dogcom -m pppoe -c /etc/dogcom.conf -d -e + echo "Dogcom version pppoe has been started." + fi +} + +stop(){ + if [ ! -f "/tmp/dogcom.pid" ]; then + echo "Dogcom is not running." + else + pid=`cat /tmp/dogcom.pid` + kill $pid + rm -f /tmp/dogcom.pid + echo "Dogcom has been stopped." + fi +} + +restart(){ + stop + sleep 1 + start + echo "Dogcom has been restarted." +} diff --git a/package/lean/luci-app-dogcom/files/root/etc/uci-defaults/40_luci-dogcom b/package/lean/luci-app-dogcom/files/root/etc/uci-defaults/40_luci-dogcom new file mode 100644 index 0000000000..ca9b75b1db --- /dev/null +++ b/package/lean/luci-app-dogcom/files/root/etc/uci-defaults/40_luci-dogcom @@ -0,0 +1,11 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@dogcom[-1] + add ucitrack dogcom + set ucitrack.@dogcom[-1].init=dogcom + commit ucitrack +EOF + +rm -f /tmp/luci-indexcache +exit 0 \ No newline at end of file From 0c8f0c8cb3535974132c9cac18c5f5792c8db841 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Fri, 27 Oct 2017 12:45:45 +0800 Subject: [PATCH 13/37] disable KERNEL_KALLSYMS to reduce kernel size to fit DW33D --- config/Config-kernel.in | 2 +- target/linux/ar71xx/config-4.9 | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/config/Config-kernel.in b/config/Config-kernel.in index 3468899adc..d7cb2d9fcb 100644 --- a/config/Config-kernel.in +++ b/config/Config-kernel.in @@ -62,7 +62,7 @@ config KERNEL_PROFILING config KERNEL_KALLSYMS bool "Compile the kernel with symbol table information" - default y if !SMALL_FLASH + default n help This will give you more information in stack traces from kernel oopses. diff --git a/target/linux/ar71xx/config-4.9 b/target/linux/ar71xx/config-4.9 index 190d07df26..6359b3ca2c 100644 --- a/target/linux/ar71xx/config-4.9 +++ b/target/linux/ar71xx/config-4.9 @@ -221,8 +221,8 @@ CONFIG_ATH79_MACH_UBNT=y CONFIG_ATH79_MACH_UBNT_UNIFIAC=y CONFIG_ATH79_MACH_UBNT_XM=y CONFIG_ATH79_MACH_WEIO=y -# CONFIG_ATH79_MACH_WI2A_AC200I is not set CONFIG_ATH79_MACH_WHR_HP_G300N=y +# CONFIG_ATH79_MACH_WI2A_AC200I is not set CONFIG_ATH79_MACH_WLAE_AG300N=y CONFIG_ATH79_MACH_WLR8100=y CONFIG_ATH79_MACH_WNDAP360=y @@ -362,6 +362,7 @@ CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_FORCED_THREADING=y CONFIG_IRQ_MIPS_CPU=y CONFIG_IRQ_WORK=y +# CONFIG_KERNEL_KALLSYMS is not set CONFIG_LEDS_GPIO=y # CONFIG_LEDS_WNDR3700_USB is not set CONFIG_LIBFDT=y @@ -379,6 +380,7 @@ CONFIG_MIPS_CLOCK_VSYSCALL=y CONFIG_MIPS_CMDLINE_FROM_BOOTLOADER=y # CONFIG_MIPS_CMDLINE_FROM_DTB is not set # CONFIG_MIPS_ELF_APPENDED_DTB is not set +CONFIG_MIPS_FPU_EMULATOR=y # CONFIG_MIPS_HUGE_TLB_SUPPORT is not set CONFIG_MIPS_L1_CACHE_SHIFT=5 CONFIG_MIPS_MACHINE=y @@ -484,4 +486,3 @@ CONFIG_SYS_SUPPORTS_ZBOOT_UART_PROM=y CONFIG_TICK_CPU_ACCOUNTING=y CONFIG_USB_SUPPORT=y CONFIG_USE_OF=y -CONFIG_MIPS_FPU_EMULATOR=y From 769f5163dba244989aa1e26d23bd94472b1acc82 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Sun, 29 Oct 2017 10:44:17 +0800 Subject: [PATCH 14/37] add MMC/SDIO/SDHC support for x86/x64 EFI boot --- target/linux/x86/config-4.9 | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/target/linux/x86/config-4.9 b/target/linux/x86/config-4.9 index 5fe8a64003..7cca9ade79 100644 --- a/target/linux/x86/config-4.9 +++ b/target/linux/x86/config-4.9 @@ -302,7 +302,8 @@ CONFIG_INTEL_MEI_WDT=y # CONFIG_INTEL_SOC_DTS_THERMAL is not set CONFIG_IOMMU_HELPER=y # CONFIG_IOMMU_STRESS is not set -# CONFIG_IOSF_MBI is not set +CONFIG_IOSF_MBI=y +# CONFIG_IOSF_MBI_DEBUG is not set CONFIG_IO_DELAY_0X80=y # CONFIG_IO_DELAY_0XED is not set # CONFIG_IO_DELAY_NONE is not set @@ -349,6 +350,15 @@ CONFIG_M586MMX=y # CONFIG_MK6 is not set # CONFIG_MK7 is not set # CONFIG_MK8 is not set +CONFIG_MMC=y +CONFIG_MMC_BLOCK=y +CONFIG_MMC_RICOH_MMC=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_ACPI=y +CONFIG_MMC_SDHCI_PCI=y +CONFIG_MMC_SDHCI_PLTFM=y +# CONFIG_MMC_TIFM_SD is not set +# CONFIG_MMC_WBSD is not set # CONFIG_MODIFY_LDT_SYSCALL is not set CONFIG_MODULES_TREE_LOOKUP=y CONFIG_MODULES_USE_ELF_REL=y @@ -461,6 +471,7 @@ CONFIG_SCx200=y CONFIG_SCx200HR_TIMER=y # CONFIG_SCx200_GPIO is not set # CONFIG_SCx200_WDT is not set +CONFIG_SDIO_UART=y CONFIG_SENSORS_CORETEMP=y CONFIG_SENSORS_FAM15H_POWER=y CONFIG_SENSORS_K10TEMP=y From 2f1ab8245312c0bb81ee761210a7dc8c9d0730e1 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Sun, 29 Oct 2017 11:00:48 +0800 Subject: [PATCH 15/37] add usb net for x86 by default --- target/linux/x86/Makefile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/target/linux/x86/Makefile b/target/linux/x86/Makefile index 1af29cfdbc..058edd1a31 100644 --- a/target/linux/x86/Makefile +++ b/target/linux/x86/Makefile @@ -19,10 +19,11 @@ KERNELNAME:=bzImage include $(INCLUDE_DIR)/target.mk -DEFAULT_PACKAGES += partx-utils mkf2fs fdisk e2fsprogs wpad kmod-usb-hid kmod-usb-net-asix kmod-usb-net-asix-ax88179 \ +DEFAULT_PACKAGES += partx-utils mkf2fs fdisk e2fsprogs wpad kmod-usb-hid \ kmod-ath5k kmod-ath9k kmod-ath10k kmod-rt2800-usb kmod-e1000e kmod-igb kmod-igbvf kmod-ixgbe kmod-vmxnet3 htop lm-sensors \ autocore automount autosamba ath10k-firmware-qca988x brcmfmac-firmware-43602a1-pcie \ -alsa-utils kmod-ac97 kmod-sound-hda-core kmod-sound-hda-codec-realtek kmod-sound-hda-intel kmod-sound-hda-codec-via kmod-sound-via82xx kmod-usb-audio +alsa-utils kmod-ac97 kmod-sound-hda-core kmod-sound-hda-codec-realtek kmod-sound-hda-intel kmod-sound-hda-codec-via kmod-sound-via82xx kmod-usb-audio \ +kmod-usb-net kmod-usb-net-asix kmod-usb-net-asix-ax88179 kmod-usb-net-rtl8150 kmod-usb-net-rtl8152 $(eval $(call BuildTarget)) From e028790b060d2c12d0c092db24b379916607be4a Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Sun, 29 Oct 2017 11:11:58 +0800 Subject: [PATCH 16/37] add power idle driver for Intel Atom Z SOC --- target/linux/x86/config-4.9 | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/target/linux/x86/config-4.9 b/target/linux/x86/config-4.9 index 7cca9ade79..1c10e57f69 100644 --- a/target/linux/x86/config-4.9 +++ b/target/linux/x86/config-4.9 @@ -298,8 +298,9 @@ CONFIG_INTEL_MEI_WDT=y # CONFIG_INTEL_MENLOW is not set # CONFIG_INTEL_PCH_THERMAL is not set # CONFIG_INTEL_PMC_IPC is not set -# CONFIG_INTEL_POWERCLAMP is not set -# CONFIG_INTEL_SOC_DTS_THERMAL is not set +CONFIG_INTEL_POWERCLAMP=y +CONFIG_INTEL_SOC_DTS_IOSF_CORE=y +CONFIG_INTEL_SOC_DTS_THERMAL=y CONFIG_IOMMU_HELPER=y # CONFIG_IOMMU_STRESS is not set CONFIG_IOSF_MBI=y @@ -528,7 +529,9 @@ CONFIG_SYSCTL_EXCEPTION_TRACE=y # CONFIG_TELCLOCK is not set CONFIG_THERMAL=y CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y +CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y CONFIG_THERMAL_GOV_STEP_WISE=y +CONFIG_THERMAL_WRITABLE_TRIPS=y CONFIG_THREAD_INFO_IN_TASK=y CONFIG_TICK_CPU_ACCOUNTING=y # CONFIG_TOSHIBA is not set From 3645684b8c8cb44a1f4c086c80addf755cb4fcba Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Mon, 30 Oct 2017 00:45:26 +0800 Subject: [PATCH 17/37] update oscam support for API/CardReaders,change source to git --- package/lean/oscam/Config.in | 240 ++++++++++++++++++++++++++++ package/lean/oscam/Makefile | 217 ++++++++++++++++++++----- package/lean/oscam/files/oscam.init | 12 ++ 3 files changed, 427 insertions(+), 42 deletions(-) create mode 100644 package/lean/oscam/Config.in create mode 100644 package/lean/oscam/files/oscam.init diff --git a/package/lean/oscam/Config.in b/package/lean/oscam/Config.in new file mode 100644 index 0000000000..2a23f71c65 --- /dev/null +++ b/package/lean/oscam/Config.in @@ -0,0 +1,240 @@ +menu "OSCam build options" + depends on PACKAGE_oscam + + +config OSCAM_USE_LIBCRYPTO + bool "Build with OpenSSL libcrypto" + help + "Use OpenSSL libcrypto instead of OSCam internal crypto functions" + default n + +config OSCAM_USE_LIBUSB + bool "Build with libusb" + default n + + + menu "Protocols" + depends on PACKAGE_oscam + + config OSCAM_MODULE_CAMD33 + bool "camd 3.3" + default n + + config OSCAM_MODULE_CAMD35 + bool "camd 3.5 UDP" + default n + + config OSCAM_MODULE_CAMD35_TCP + bool "camd 3.5 TCP" + default n + + config OSCAM_MODULE_NEWCAMD + bool "newcamd" + default n + + config OSCAM_MODULE_CCCAM + bool "CCcam" + default n + + config OSCAM_MODULE_CCCSHARE + bool "CCcam share" + default n + + config OSCAM_MODULE_GBOX + bool "gbox" + default n + + config OSCAM_MODULE_RADEGAST + bool "radegast" + default n + + config OSCAM_MODULE_SERIAL + bool "Serial" + default n + + config OSCAM_MODULE_CONSTCW + bool "constant CW" + default n + + config OSCAM_MODULE_PANDORA + bool "Pandora" + default n + + config OSCAM_MODULE_GHTTP + bool "Ghttp" + default n + + config OSCAM_MODULE_SCAM + bool "scam" + default n + + endmenu + + menu "Readers" + depends on PACKAGE_oscam + + config OSCAM_READER_NAGRA + bool "Nagravision" + default n + + config OSCAM_READER_IRDETO + bool "Irdeto" + default n + + config OSCAM_READER_CONAX + bool "Conax" + default n + + config OSCAM_READER_CRYPTOWORKS + bool "Cryptoworks" + default n + + config OSCAM_READER_SECA + bool "Seca" + default n + + config OSCAM_READER_VIACCESS + bool "Viaccess" + default n + + config OSCAM_READER_VIDEOGUARD + bool "NDS Videoguard" + default n + + config OSCAM_READER_DRE + bool "DRE Crypt" + default n + + config OSCAM_READER_TONGFANG + bool "Tongfang" + default n + + config OSCAM_READER_BULCRYPT + bool "Bulcrypt" + default n + + config OSCAM_READER_GRIFFIN + bool "Griffin" + default n + + config OSCAM_READER_DGCRYPT + bool "DGCrypt" + default n + + endmenu + + menu "Card readers" + depends on PACKAGE_oscam + + config OSCAM_USE_PCSC + bool "PCSC" + select OSCAM_USE_LIBUSB + default n + + config OSCAM_CARDREADER_PHOENIX + bool "Phoenix/mouse" + select OSCAM_USE_LIBUSB + default n + + config OSCAM_CARDREADER_SC8IN1 + bool "SC8in1" + select OSCAM_USE_LIBUSB + default n + + config OSCAM_CARDREADER_MP35 + bool "AD-Teknik MP 3.6/USB Phoenix" + select OSCAM_USE_LIBUSB + default n + + config OSCAM_CARDREADER_SMARGO + bool "Argolis Smargo Smartreader" + select OSCAM_USE_LIBUSB + default n + + config OSCAM_CARDREADER_STINGER + bool "STINGER" + select OSCAM_USE_LIBUSB + default n + + endmenu + +comment "Addons" +config OSCAM_HAVE_DVBAPI + bool "DVB API" + default y + +config OSCAM_READ_SDT_CHARSETS + bool "DVB API read-sdt charsets" + default y + +config OSCAM_IRDETO_GUESSING + bool "Irdeto guessing" + default n + +config OSCAM_CS_ANTICASC + bool "Anti cascading" + default y + +config OSCAM_WITH_DEBUG + bool "Debug messages" + default n + +config OSCAM_MODULE_MONITOR + bool "Monitor" + default n + +config OSCAM_WITH_LB + bool "Loadbalancing" + default y + +config OSCAM_S_CACHEEX + bool "Cache exchange" + default y + +config OSCAM_CW_CYCLE_CHECK + bool "CW Cycle Check" + default y + +config OSCAM_LCDSUPPORT + bool "LCD support" + default n + +config OSCAM_LEDSUPPORT + bool "LED support" + default n + +config OSCAM_CLOCKFIX + bool "Clockfix (disable on old systems!)" + default y + +config OSCAM_IPV6SUPPORT + bool "IPv6 support (experimental)" + default n + + +config OSCAM_WEBIF + bool "Web Interface" + default n + + config OSCAM_WEBIF_LIVELOG + bool "LiveLog" + depends on OSCAM_WEBIF + default n + + config OSCAM_WEBIF_JQUERY + bool "Jquery onboard (if disabled webload)" + depends on OSCAM_WEBIF + default n + + config OSCAM_TOUCH + bool "Touch Web Interface" + depends on OSCAM_WEBIF + default n + + config OSCAM_WITH_SSL + bool "SSL support" + depends on OSCAM_WEBIF + select OSCAM_USE_LIBCRYPTO + default n + +endmenu diff --git a/package/lean/oscam/Makefile b/package/lean/oscam/Makefile index 6a1d1c44c6..15b7952446 100644 --- a/package/lean/oscam/Makefile +++ b/package/lean/oscam/Makefile @@ -1,71 +1,204 @@ -# -# Copyright (C) 2010 OpenWrt.org +# +# Copyright (C) 2016 OpenWrt.org # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # -# maz-1 +# $Id$ include $(TOPDIR)/rules.mk -PKG_BRANCH:=trunk -PKG_SOURCE_URL:=http://www.streamboard.tv/svn/oscam/trunk -#PKG_REV:=$(shell LC_ALL=C svn info ${PKG_SOURCE_URL} | sed -ne's/^Last Changed Rev: //p') -PKG_REV:=10777 - PKG_NAME:=oscam -PKG_VERSION:=svn$(PKG_REV) +PKG_VERSION:=1.20-$(PKG_REV) PKG_RELEASE:=1 +PKG_REV:=2780c48789c8e1427df4078ea9b06e0b51594bbc -PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) -PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.gz -PKG_SOURCE_PROTO:=svn + +PKG_SOURCE_PROTO:=git PKG_SOURCE_VERSION:=$(PKG_REV) - -PKG_BUILD_DEPENDS:= - +PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) +PKG_SOURCE_URL:=https://github.com/coolsnowwolf/oscam.git +PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.bz2 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) -PKG_INSTALL_DIR:=$(PKG_BUILD_DIR) +PKG_LICENSE:=GPLv3 +PKG_LICENSE_FILES:=COPYING +PKG_MAINTAINER:=tmn505 +PKG_CONFIG_DEPENDS := \ + OSCAM_USE_LIBCRYPTO \ + OSCAM_USE_LIBUSB \ + OSCAM_USE_PCSC \ + OSCAM_WEBIF \ + OSCAM_WEBIF_LIVELOG \ + OSCAM_WEBIF_JQUERY \ + OSCAM_TOUCH \ + OSCAM_WITH_SSL \ + OSCAM_HAVE_DVBAPI \ + OSCAM_READ_SDT_CHARSETS \ + OSCAM_IRDETO_GUESSING \ + OSCAM_CS_ANTICASC \ + OSCAM_WITH_DEBUG \ + OSCAM_MODULE_MONITOR \ + OSCAM_WITH_LB \ + OSCAM_CS_CACHEEX \ + OSCAM_CW_CYCLE_CHECK \ + OSCAM_LCDSUPPORT \ + OSCAM_LEDSUPPORT \ + OSCAM_CLOCKFIX \ + OSCAM_IPV6SUPPORT \ + OSCAM_MODULE_CAMD33 \ + OSCAM_MODULE_CAMD35 \ + OSCAM_MODULE_CAMD35_TCP \ + OSCAM_MODULE_NEWCAMD \ + OSCAM_MODULE_CCCAM \ + OSCAM_MODULE_CCCSHARE \ + OSCAM_MODULE_GBOX \ + OSCAM_MODULE_RADEGAST \ + OSCAM_MODULE_SCAM \ + OSCAM_MODULE_SERIAL \ + OSCAM_MODULE_CONSTCW \ + OSCAM_MODULE_PANDORA \ + OSCAM_MODULE_GHTTP \ + OSCAM_READER_NAGRA \ + OSCAM_READER_IRDETO \ + OSCAM_READER_CONAX \ + OSCAM_READER_CRYPTOWORKS \ + OSCAM_READER_SECA \ + OSCAM_READER_VIACCESS \ + OSCAM_READER_VIDEOGUARD \ + OSCAM_READER_DRE \ + OSCAM_READER_TONGFANG \ + OSCAM_READER_BULCRYPT \ + OSCAM_READER_GRIFFIN \ + OSCAM_READER_DGCRYPT \ + OSCAM_CARDREADER_PHOENIX \ + OSCAM_CARDREADER_SC8IN1 \ + OSCAM_CARDREADER_MP35 \ + OSCAM_CARDREADER_SMARGO \ + OSCAM_CARDREADER_STINGER include $(INCLUDE_DIR)/package.mk -define Package/oscam - DEPENDS:=+libopenssl +libpthread +libusb-1.0 - TITLE:=Open Source Conditional Access Module software - URL:=http://streamboard.gmc.to/oscam/ - SUBMENU:= +define Package/oscam/config + source "$(SOURCE)/Config.in" endef -define Package/oscam/description - An Open Source Conditional Access Module software, -based on the very good MpCS version 0.9d created by dukat. -endef - -CONFIGURE_ARGS += --with-ssl=openssl - -define Build/Prepare - $(call Build/Prepare/Default) - mkdir -p $(PKG_BUILD_DIR)/build - cd $(PKG_BUILD_DIR)/build; -endef +config_files=oscam.ac oscam.cacheex oscam.cert oscam.conf oscam.dvbapi oscam.guess oscam.ird oscam.provid oscam.server oscam.services oscam.srvid oscam.tiers oscam.user oscam.whitelist define Package/oscam/conffiles +/etc/oscam/ endef -define Build/Compile - echo 'set (OSCAM_SYSTEM_NAME wrt350nv2)' > $(PKG_BUILD_DIR)/toolchain.cmake - echo 'set (CMAKE_SYSTEM_NAME Linux)' >> $(PKG_BUILD_DIR)/toolchain.cmake - echo 'set (CMAKE_C_COMPILER $(TARGET_CROSS)gcc)' >> $(PKG_BUILD_DIR)/toolchain.cmake - echo 'set (CMAKE_SYSTEM_PROCESSOR $(ARCH))' >> $(PKG_BUILD_DIR)/toolchain.cmake - cd $(PKG_BUILD_DIR)/build;cmake -DCMAKE_TOOLCHAIN_FILE=$(PKG_BUILD_DIR)/toolchain.cmake ..;make +define Package/oscam + SECTION:=net + CATEGORY:=Network + TITLE:=Open Source Conditional Access Modul + URL:=http://www.streamboard.tv/oscam + DEPENDS:=+OSCAM_USE_LIBCRYPTO:libopenssl +OSCAM_USE_LIBUSB:libusb-1.0 +OSCAM_USE_PCSC:pcscd endef +define Package/list-smargo + $(call Package/oscam) + TITLE:=List smargo readers + DEPENDS:=oscam +endef + +CONFIGURE_CMD = ./config.sh +CONFIGURE_ARGS = \ + --restore \ + $(if $(CONFIG_OSCAM_WEBIF),--enable,--disable) WEBIF \ + $(if $(CONFIG_OSCAM_WEBIF_LIVELOG),--enable,--disable) WEBIF_LIVELOG \ + $(if $(CONFIG_OSCAM_WEBIF_JQUERY),--enable,--disable) WEBIF_JQUERY \ + $(if $(CONFIG_OSCAM_TOUCH),--enable,--disable) TOUCH \ + $(if $(CONFIG_OSCAM_WITH_SSL),--enable,--disable) WITH_SSL \ + $(if $(CONFIG_OSCAM_HAVE_DVBAPI),--enable,--disable) HAVE_DVBAPI \ + $(if $(CONFIG_OSCAM_READ_SDT_CHARSETS),--enable,--disable) READ_SDT_CHARSETS \ + $(if $(CONFIG_OSCAM_IRDETO_GUESSING),--enable,--disable) IRDETO_GUESSING \ + $(if $(CONFIG_OSCAM_CS_ANTICASC),--enable,--disable) CS_ANTICASC \ + $(if $(CONFIG_OSCAM_WITH_DEBUG),--enable,--disable) WITH_DEBUG \ + $(if $(CONFIG_OSCAM_MODULE_MONITOR),--enable,--disable) MODULE_MONITOR \ + $(if $(CONFIG_OSCAM_WITH_LB),--enable,--disable) WITH_LB \ + $(if $(CONFIG_OSCAM_CS_CACHEEX),--enable,--disable) CS_CACHEEX \ + $(if $(CONFIG_OSCAM_CW_CYCLE_CHECK),--enable,--disable) CW_CYCLE_CHECK \ + $(if $(CONFIG_OSCAM_LCDSUPPORT),--enable,--disable) LCDSUPPORT \ + $(if $(CONFIG_OSCAM_LEDSUPPORT),--enable,--disable) LEDSUPPORT \ + $(if $(CONFIG_OSCAM_CLOCKFIX),--enable,--disable) CLOCKFIX \ + $(if $(CONFIG_OSCAM_IPV6SUPPORT),--enable,--disable) IPV6SUPPORT \ + $(if $(CONFIG_OSCAM_MODULE_CAMD33),--enable,--disable) MODULE_CAMD33 \ + $(if $(CONFIG_OSCAM_MODULE_CAMD35),--enable,--disable) MODULE_CAMD35 \ + $(if $(CONFIG_OSCAM_MODULE_CAMD35_TCP),--enable,--disable) MODULE_CAMD35_TCP \ + $(if $(CONFIG_OSCAM_MODULE_NEWCAMD),--enable,--disable) MODULE_NEWCAMD \ + $(if $(CONFIG_OSCAM_MODULE_CCCAM),--enable,--disable) MODULE_CCCAM \ + $(if $(CONFIG_OSCAM_MODULE_CCCSHARE),--enable,--disable) MODULE_CCCSHARE \ + $(if $(CONFIG_OSCAM_MODULE_GBOX),--enable,--disable) MODULE_GBOX \ + $(if $(CONFIG_OSCAM_MODULE_RADEGAST),--enable,--disable) MODULE_RADEGAST \ + $(if $(CONFIG_OSCAM_MODULE_SCAM),--enable,--disable) MODULE_SCAM \ + $(if $(CONFIG_OSCAM_MODULE_SERIAL),--enable,--disable) MODULE_SERIAL \ + $(if $(CONFIG_OSCAM_MODULE_CONSTCW),--enable,--disable) MODULE_CONSTCW \ + $(if $(CONFIG_OSCAM_MODULE_PANDORA),--enable,--disable) MODULE_PANDORA \ + $(if $(CONFIG_OSCAM_MODULE_GHTTP),--enable,--disable) MODULE_GHTTP \ + $(if $(CONFIG_OSCAM_READER_NAGRA),--enable,--disable) READER_NAGRA \ + $(if $(CONFIG_OSCAM_READER_IRDETO),--enable,--disable) READER_IRDETO \ + $(if $(CONFIG_OSCAM_READER_CONAX),--enable,--disable) READER_CONAX \ + $(if $(CONFIG_OSCAM_READER_CRYPTOWORKS),--enable,--disable) READER_CRYPTOWORKS \ + $(if $(CONFIG_OSCAM_READER_SECA),--enable,--disable) READER_SECA \ + $(if $(CONFIG_OSCAM_READER_VIACCESS),--enable,--disable) READER_VIACCESS \ + $(if $(CONFIG_OSCAM_READER_VIDEOGUARD),--enable,--disable) READER_VIDEOGUARD \ + $(if $(CONFIG_OSCAM_READER_DRE),--enable,--disable) READER_DRE \ + $(if $(CONFIG_OSCAM_READER_TONGFANG),--enable,--disable) READER_TONGFANG \ + $(if $(CONFIG_OSCAM_READER_BULCRYPT),--enable,--disable) READER_BULCRYPT \ + $(if $(CONFIG_OSCAM_READER_GRIFFIN),--enable,--disable) READER_GRIFFIN \ + $(if $(CONFIG_OSCAM_READER_DGCRYPT),--enable,--disable) READER_DGCRYPT \ + $(if $(CONFIG_OSCAM_CARDREADER_PHOENIX),--enable,--disable) CARDREADER_PHOENIX \ + $(if $(CONFIG_OSCAM_CARDREADER_SC8IN1),--enable,--disable) CARDREADER_SC8IN1 \ + $(if $(CONFIG_OSCAM_CARDREADER_MP35),--enable,--disable) CARDREADER_MP35 \ + $(if $(CONFIG_OSCAM_CARDREADER_SMARGO),--enable,--disable) CARDREADER_SMARGO \ + $(if $(CONFIG_OSCAM_CARDREADER_STINGER),--enable,--disable) CARDREADER_STINGER \ + --disable CARDREADER_INTERNAL_AZBOX \ + --disable CARDREADER_INTERNAL_COOLAPI \ + --disable CARDREADER_INTERNAL_COOLAPI2 \ + --disable CARDREADER_INTERNAL_SCI \ + --disable CARDREADER_DB2COM \ + --disable CARDREADER_STAPI \ + --disable CARDREADER_STAPI5 + +MAKE_FLAGS += + +ifeq ($(CONFIG_OSCAM_USE_LIBUSB),y) + MAKE_FLAGS += USE_LIBUSB=1 +endif + +ifeq ($(CONFIG_OSCAM_USE_PCSC),y) + MAKE_FLAGS += USE_PCSC=1 +endif + +ifeq ($(CONFIG_OSCAM_USE_LIBCRYPTO),y) + MAKE_FLAGS += USE_LIBCRYPTO=1 +endif + +ifeq ($(CONFIG_OSCAM_WITH_SSL),y) + MAKE_FLAGS += USE_SSL=1 +endif + +MAKE_FLAGS += CONF_DIR=/etc/oscam +MAKE_FLAGS += OSCAM_BIN=Distribution/oscam +MAKE_FLAGS += LIST_SMARGO_BIN=Distribution/list-smargo + define Package/oscam/install - $(INSTALL_DIR) $(1)/usr/bin - $(INSTALL_BIN) $(PKG_BUILD_DIR)/build/oscam $(1)/usr/bin/ + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/Distribution/oscam $(1)/usr/sbin/oscam + $(INSTALL_DIR) $(1)/etc/oscam + $(INSTALL_DATA) $(addprefix $(PKG_BUILD_DIR)/Distribution/doc/example/,$(config_files)) $(1)/etc/oscam/ + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_BIN) ./files/oscam.init $(1)/etc/init.d/oscam endef -$(eval $(call BuildPackage,oscam)) +define Package/list-smargo/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/Distribution/list-smargo $(1)/usr/bin/list-smargo +endef + +$(eval $(call BuildPackage,oscam)) +$(eval $(call BuildPackage,list-smargo)) diff --git a/package/lean/oscam/files/oscam.init b/package/lean/oscam/files/oscam.init new file mode 100644 index 0000000000..b0bf41dc51 --- /dev/null +++ b/package/lean/oscam/files/oscam.init @@ -0,0 +1,12 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2016 OpenWrt.org + +START=50 +USE_PROCD=1 + +start_service() { + procd_open_instance + procd_set_param command /usr/sbin/oscam + procd_set_param respawn + procd_close_instance +} From 1c205c086690f036ea6eb19ef40868567be367a6 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Mon, 30 Oct 2017 00:47:16 +0800 Subject: [PATCH 18/37] revert busybox ip command support for MWAN3 --- package/utils/busybox/Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/package/utils/busybox/Makefile b/package/utils/busybox/Makefile index 35f63d9a79..941e828354 100644 --- a/package/utils/busybox/Makefile +++ b/package/utils/busybox/Makefile @@ -47,7 +47,6 @@ define Package/busybox URL:=http://busybox.net/ DEPENDS:=+BUSYBOX_USE_LIBRPC:librpc +BUSYBOX_CONFIG_PAM:libpam +BUSYBOX_CONFIG_NTPD:jsonfilter MENU:=1 - PROVIDES:=ip ALTERNATIVES:=\ $(call BUSYBOX_IF_ENABLED,KILL, 100:/bin/kill:/bin/busybox) \ $(call BUSYBOX_IF_ENABLED,PS, 100:/bin/ps:/bin/busybox) \ From 1b64bd2477ab98b2b53469d7788a801404d962f5 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Mon, 30 Oct 2017 01:31:21 +0800 Subject: [PATCH 19/37] fix luci-app-haproxy-tcp running issue --- .../lean/luci-app-haproxy-tcp/files/etc/haproxy_init.sh | 4 ++-- .../files/etc/uci-defaults/z99-haproxy | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100755 package/lean/luci-app-haproxy-tcp/files/etc/uci-defaults/z99-haproxy diff --git a/package/lean/luci-app-haproxy-tcp/files/etc/haproxy_init.sh b/package/lean/luci-app-haproxy-tcp/files/etc/haproxy_init.sh index d40e52da5e..cab4d1f826 100755 --- a/package/lean/luci-app-haproxy-tcp/files/etc/haproxy_init.sh +++ b/package/lean/luci-app-haproxy-tcp/files/etc/haproxy_init.sh @@ -16,7 +16,7 @@ stop(){ } start(){ echo "starting haproxy" - logger -t alex restarting haproxy + logger -t restarting haproxy echo global > $CFG_FILE cat >> $CFG_FILE </dev/null` - logger -t alex !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!haproxy is initializing enabled is $vt_enabled + logger -t haproxy is initializing enabled is $vt_enabled echo $vt_enabled if [ "$vt_enabled" = 1 ]; then [ -f /etc/haproxy_backup ] && { diff --git a/package/lean/luci-app-haproxy-tcp/files/etc/uci-defaults/z99-haproxy b/package/lean/luci-app-haproxy-tcp/files/etc/uci-defaults/z99-haproxy new file mode 100755 index 0000000000..72913f935b --- /dev/null +++ b/package/lean/luci-app-haproxy-tcp/files/etc/uci-defaults/z99-haproxy @@ -0,0 +1,7 @@ +#!/bin/sh + +/etc/init.d/haproxy disable +/etc/init.d/haproxy stop + +rm -f /tmp/luci-indexcache +exit 0 From 506faec99a6a3d77e1d1a34d4f0ffb2d68d0cc02 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Tue, 31 Oct 2017 15:23:13 +0800 Subject: [PATCH 20/37] openssl: Enable assembler optimizations for x64/arm8 --- package/libs/openssl/Makefile | 4 +++- package/libs/openssl/patches/110-optimize-for-size.patch | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/package/libs/openssl/Makefile b/package/libs/openssl/Makefile index 8303bc0fb8..37dae96fe5 100644 --- a/package/libs/openssl/Makefile +++ b/package/libs/openssl/Makefile @@ -11,7 +11,7 @@ PKG_NAME:=openssl PKG_BASE:=1.0.2 PKG_BUGFIX:=l PKG_VERSION:=$(PKG_BASE)$(PKG_BUGFIX) -PKG_RELEASE:=1 +PKG_RELEASE:=2 PKG_USE_MIPS16:=0 PKG_BUILD_PARALLEL:=0 @@ -168,6 +168,8 @@ else OPENSSL_OPTIONS+=no-sse2 ifeq ($(CONFIG_mips)$(CONFIG_mipsel),y) OPENSSL_TARGET:=linux-mips-openwrt + else ifeq ($(CONFIG_aarch64),y) + OPENSSL_TARGET:=linux-aarch64-openwrt else ifeq ($(CONFIG_arm)$(CONFIG_armeb),y) OPENSSL_TARGET:=linux-armv4-openwrt else diff --git a/package/libs/openssl/patches/110-optimize-for-size.patch b/package/libs/openssl/patches/110-optimize-for-size.patch index 0f174a3469..d6d4a21111 100644 --- a/package/libs/openssl/patches/110-optimize-for-size.patch +++ b/package/libs/openssl/patches/110-optimize-for-size.patch @@ -1,11 +1,12 @@ --- a/Configure +++ b/Configure -@@ -470,6 +470,12 @@ my %table=( +@@ -470,6 +470,13 @@ my %table=( "linux-alpha-ccc","ccc:-fast -readonly_strings -DL_ENDIAN::-D_REENTRANT:::SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_PTR DES_RISC1 DES_UNROLL:${alpha_asm}", "linux-alpha+bwx-ccc","ccc:-fast -readonly_strings -DL_ENDIAN::-D_REENTRANT:::SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_INT DES_PTR DES_RISC1 DES_UNROLL:${alpha_asm}", +# OpenWrt targets +"linux-armv4-openwrt","gcc:-DTERMIOS \$(OPENWRT_OPTIMIZATION_FLAGS) -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${armv4_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-aarch64-openwrt","gcc:-DTERMIOS \$(OPENWRT_OPTIMIZATION_FLAGS) -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${aarch64_asm}:linux64:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", +"linux-x86_64-openwrt", "gcc:-m64 -DL_ENDIAN -DTERMIOS \$(OPENWRT_OPTIMIZATION_FLAGS) -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::64", +"linux-mips-openwrt","gcc:-DTERMIOS \$(OPENWRT_OPTIMIZATION_FLAGS) -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${mips32_asm}:o32:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", +"linux-generic-openwrt","gcc:-DTERMIOS \$(OPENWRT_OPTIMIZATION_FLAGS) -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", From 0e5bebdfd86ea3d9b05ca0858b5851c5d65b2517 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Thu, 2 Nov 2017 21:38:33 +0800 Subject: [PATCH 21/37] min fix update script error in adbyby plus --- package/lean/luci-app-adbyby-plus/Makefile | 2 +- package/lean/luci-app-adbyby-plus/root/etc/config/adbyby | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/package/lean/luci-app-adbyby-plus/Makefile b/package/lean/luci-app-adbyby-plus/Makefile index 3a3b78b2fd..e9047bab34 100644 --- a/package/lean/luci-app-adbyby-plus/Makefile +++ b/package/lean/luci-app-adbyby-plus/Makefile @@ -10,7 +10,7 @@ LUCI_DEPENDS:=+adbyby +wget +ipset +coreutils +coreutils-nohup +dnsmasq-full LUCI_PKGARCH:=all PKG_NAME:=luci-app-adbyby-plus PKG_VERSION:=2.0 -PKG_RELEASE:=23 +PKG_RELEASE:=24 include $(TOPDIR)/feeds/luci/luci.mk diff --git a/package/lean/luci-app-adbyby-plus/root/etc/config/adbyby b/package/lean/luci-app-adbyby-plus/root/etc/config/adbyby index c928a7577f..7a11e0d770 100644 --- a/package/lean/luci-app-adbyby-plus/root/etc/config/adbyby +++ b/package/lean/luci-app-adbyby-plus/root/etc/config/adbyby @@ -7,4 +7,5 @@ config adbyby option enable '1' option wan_mode '1' option mem_mode '1' + option update_source '0' From 80fa1493bf766f3914ebdb9caa43ea9d2e742e13 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Thu, 2 Nov 2017 22:07:40 +0800 Subject: [PATCH 22/37] fix web flash for RT-ACRH17 --- target/linux/ipq806x/image/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/target/linux/ipq806x/image/Makefile b/target/linux/ipq806x/image/Makefile index 09ce82b933..c79afb9d7e 100644 --- a/target/linux/ipq806x/image/Makefile +++ b/target/linux/ipq806x/image/Makefile @@ -263,7 +263,7 @@ define Device/RT-ACRH17 DEVICE_TITLE := Asus RT-ACRH17 IMAGE_SIZE := 20439364 FILESYSTEMS := squashfs - UIMAGE_NAME:=$(shell echo -e '\03\01\01\01RT-ACRH17') + UIMAGE_NAME:=$(shell echo -e '\03\01\01\01RT-AC82U') IMAGES = sysupgrade.tar flash-factory.trx IMAGE/flash-factory.trx := copy-file $(KDIR)/tmp/$$(KERNEL_INITRAMFS_IMAGE) | uImage none IMAGE/sysupgrade.tar := sysupgrade-tar | append-metadata From 2e9fd90a1c81e389834d319982da54bce4178d23 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Fri, 3 Nov 2017 00:59:34 +0800 Subject: [PATCH 23/37] default update adbyby from mirror --- package/lean/luci-app-adbyby-plus/Makefile | 2 +- .../root/usr/share/adbyby/adupdate.sh | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/package/lean/luci-app-adbyby-plus/Makefile b/package/lean/luci-app-adbyby-plus/Makefile index e9047bab34..9670bf3078 100644 --- a/package/lean/luci-app-adbyby-plus/Makefile +++ b/package/lean/luci-app-adbyby-plus/Makefile @@ -10,7 +10,7 @@ LUCI_DEPENDS:=+adbyby +wget +ipset +coreutils +coreutils-nohup +dnsmasq-full LUCI_PKGARCH:=all PKG_NAME:=luci-app-adbyby-plus PKG_VERSION:=2.0 -PKG_RELEASE:=24 +PKG_RELEASE:=25 include $(TOPDIR)/feeds/luci/luci.mk diff --git a/package/lean/luci-app-adbyby-plus/root/usr/share/adbyby/adupdate.sh b/package/lean/luci-app-adbyby-plus/root/usr/share/adbyby/adupdate.sh index c9030aea7a..f14364e45b 100755 --- a/package/lean/luci-app-adbyby-plus/root/usr/share/adbyby/adupdate.sh +++ b/package/lean/luci-app-adbyby-plus/root/usr/share/adbyby/adupdate.sh @@ -5,9 +5,12 @@ update_source=$(uci get adbyby.@adbyby[0].update_source 2>/dev/null) rm -f /usr/share/adbyby/data/*.bak if [ $update_source -eq 1 ]; then - wget-ssl -t 1 -T 10 -O /tmp/lazy.txt http://update.adbyby.com/rule3/lazy.jpg - wget-ssl -t 1 -T 10 -O /tmp/video.txt http://update.adbyby.com/rule3/video.jpg - wget-ssl -t 1 -T 10 -O /tmp/user.action http://update.adbyby.com/rule3/user.action + #wget-ssl -t 1 -T 10 -O /tmp/lazy.txt http://update.adbyby.com/rule3/lazy.jpg + #wget-ssl -t 1 -T 10 -O /tmp/video.txt http://update.adbyby.com/rule3/video.jpg + #wget-ssl -t 1 -T 10 -O /tmp/user.action http://update.adbyby.com/rule3/user.action + wget-ssl -t 1 -T 10 -O /tmp/lazy.txt http://opt.cn2qq.com/opt-file/lazy.txt + wget-ssl -t 1 -T 10 -O /tmp/video.txt http://opt.cn2qq.com/opt-file/video.txt + fi [ ! -s "/tmp/lazy.txt" ] && wget-ssl --no-check-certificate -O /tmp/lazy.txt https://raw.githubusercontent.com/adbyby/xwhyc-rules/master/lazy.txt From 9cf4daca931342851711751aadb8dd877ba6d743 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Fri, 3 Nov 2017 13:06:57 +0800 Subject: [PATCH 24/37] sync wireless drivers with LEDE 17.01.4 stable --- package/firmware/linux-firmware/Makefile | 6 +- package/firmware/linux-firmware/intel.mk | 273 ++- package/firmware/linux-firmware/qca.mk | 10 - package/firmware/linux-firmware/realtek.mk | 8 - package/kernel/mac80211/Makefile | 119 +- .../files/lib/netifd/wireless/mac80211.sh | 38 +- .../mac80211/patches/001-fix_build.patch | 10 +- .../patches/004-kconfig_backport_fix.patch | 2 +- .../patches/005-revert-devcoredump.patch | 143 +- .../patches/006-revert-ktime-changes.patch | 20 + .../007-revert-genetlink-changes.patch | 266 +++ .../008-revert-ndo_stats64-cleanup.patch | 20 + .../patches/009-revert-mtu-changes.patch | 338 +++ .../mac80211/patches/010-disable_rfkill.patch | 2 +- .../patches/011-backport_strscpy.patch | 43 + .../patches/012-kernel_build_check.patch | 11 - .../mac80211/patches/015-ipw200-mtu.patch | 34 - ...roducing-a-USB-dependency-in-the-rt2.patch | 85 + ...x00usb-do-not-anchor-rx-and-tx-urb-s.patch | 61 + ...-rt2x00usb-fix-anchor-initialization.patch | 75 + .../020-04-rt61pci-use-entry-directly.patch | 28 + ...-entry-directly-in-rt2x00_dump_frame.patch | 181 ++ ...2x00-remove-queue_entry-from-skbdesc.patch | 59 + ...n-t-mark-register-accesses-as-inline.patch | 84 + ...-move-rt2800_drv_data-declaration-in.patch | 94 + ...dentify-station-based-on-status-WCID.patch | 94 + ...illing-tx-status-from-rt2x00lib_txdo.patch | 178 ++ ...clearing-entry-from-rt2x00lib_txdone.patch | 88 + ...2-rt2x00-add-txdone-nomatch-function.patch | 92 + ...ixup-fill_tx_status-for-nomatch-case.patch | 54 + ...2x00-use-txdone_nomatch-on-rt2800usb.patch | 191 ++ ...us-based-rate-flags-for-nomatch-case.patch | 88 + ...00-use-TXOP_BACKOFF-for-probe-frames.patch | 43 + ...0-fix-rt2x00debug_dump_frame-comment.patch | 28 + ...fix-TX_PWR_CFG_4-register-definition.patch | 37 + ...020-19-rt2x00-add-support-for-MT7620.patch | 2077 +++++++++++++++++ ...0-fix-LNA-gain-assignment-for-MT7620.patch | 54 + ...CO-calibration-after-programming-ALC.patch | 34 + ...fix-mt7620-vco-calibration-registers.patch | 50 + ...2800-fix-mt7620-E2-channel-registers.patch | 41 + .../patches/060-no_local_ssb_bcma.patch | 22 +- .../patches/080-ath10k_thermal_config.patch | 2 +- .../mac80211/patches/090-remove-cred.patch | 15 + .../100-remove-cryptoapi-dependencies.patch | 146 +- .../110-mac80211_keep_keys_on_stop_ap.patch | 2 +- .../mac80211/patches/130-disable-fils.patch | 32 - .../130-mac80211-hwsim-hrtimer-clock.patch | 11 + ...aes-cmac-switch-to-shash-CMAC-driver.patch | 198 -- .../132-mac80211-remove-cmac-dependency.patch | 10 - .../patches/150-disable_addr_notifier.patch | 10 +- .../kernel/mac80211/patches/210-ap_scan.patch | 2 +- ..._hw-issue-external-reset-for-QCA955x.patch | 51 +- ...h9k-force-rx_clear-when-disabling-rx.patch | 2 +- ...etries-for-powersave-response-frames.patch | 12 +- ...erpret-requested-txpower-in-EIRP-dom.patch | 4 +- ...0211-add-hdrlen-to-ieee80211_tx_data.patch | 30 +- ...80211-add-NEED_ALIGNED4_SKBS-hw-flag.patch | 32 +- ...l-Enable-STBC-and-LDPC-for-VHT-Rates.patch | 2 +- ...ata-bit-in-PS-buffered-frame-release.patch | 6 +- ...ntially-stale-EOSP-status-bit-in-int.patch | 2 +- ...fix-block-ack-window-tracking-issues.patch | 6 +- ...me-tx_complete_work-to-hw_check_work.patch | 175 ++ ...power-reduction-for-US-regulatory-do.patch | 24 - ...-check-if-the-chip-failed-to-wake-up.patch | 30 + ...ata-flag-for-buffered-multicast-pack.patch | 41 - ...condition-in-enabling-disabling-IRQs.patch | 197 ++ ...sable-wake_tx_queue-for-older-device.patch | 27 - ...rcmf_bus_get_memdump-result-for-erro.patch | 52 + ...re-verbose-when-PSM-s-watchdog-fires.patch | 38 + ...hy_read_of_freq_limits-to-respect-li.patch | 44 + ...-merge-two-brcmf_err-macros-into-one.patch | 43 + ...to-C-function-__brcmf_err-for-printi.patch | 69 + ...merge-two-remaining-brcmf_err-macros.patch | 46 + ...lean-up-and-fix-ath_tx_count_airtime.patch | 107 + .../321-mac80211-fix-CSA-in-IBSS-mode.patch | 34 + ...andle-filtered-frames-within-a-BA-se.patch | 28 + ...ix-channel-maximum-power-level-test.patch} | 0 ...tionally-start-new-netdev-queues-wit.patch | 29 + ...gth-check-in-brcmf_cfg80211_escan_ha.patch | 63 + ...e-constant-time-comparison-with-keys.patch | 33 - ...compare-TKIP-TX-MIC-key-in-reinstall.patch | 73 - .../patches/402-ath_regd_optional.patch | 18 +- .../patches/404-regd_no_assoc_hints.patch | 4 +- .../patches/406-ath_relax_default_regd.patch | 2 +- .../440-ath5k_channel_bw_debugfs.patch | 2 +- .../patches/500-ath9k_eeprom_debugfs.patch | 4 +- .../mac80211/patches/501-ath9k_ahb_init.patch | 2 +- .../patches/512-ath9k_channelbw_debugfs.patch | 10 +- .../patches/513-ath9k_add_pci_ids.patch | 2 +- .../522-mac80211_configure_antenna_gain.patch | 38 +- .../patches/530-ath9k_extra_leds.patch | 18 +- .../531-ath9k_extra_platform_leds.patch | 21 +- .../patches/542-ath9k_debugfs_diag.patch | 10 +- .../patches/543-ath9k_entropy_from_adc.patch | 10 +- .../patches/546-ath9k_platform_led_name.patch | 39 + .../patches/548-ath9k_enable_gpio_chip.patch | 33 +- .../549-ath9k_enable_gpio_buttons.patch | 23 +- .../patches/551-ath9k_ubnt_uap_plus_hsr.patch | 8 +- ...-rt2800lib-enable-support-for-RT3883.patch | 2 +- ...x00-rt2800lib-add-rf_vals-for-RF3853.patch | 6 +- ...ib-enable-VCO-calibration-for-RF3853.patch | 4 +- ...-add-channel-configuration-function-.patch | 22 +- ...2x00-rt2800lib-enable-RF3853-support.patch | 2 +- ...-add-MAC-register-initialization-for.patch | 6 +- ...-add-BBP-register-initialization-for.patch | 4 +- ...-add-RFCSR-initialization-for-RT3883.patch | 16 +- ...-use-the-extended-EEPROM-map-for-RT3.patch | 2 +- ...ib-force-rf-type-to-RF3853-on-RT3883.patch | 4 +- ...-add-channel-configuration-code-for-.patch | 12 +- ...-fix-txpower_to_dev-function-for-RT3.patch | 2 +- ...-use-correct-txpower-calculation-fun.patch | 2 +- ...-hardcode-txmixer-gain-values-to-zer.patch | 8 +- ...b-use-correct-RT-XWI-size-for-RT3883.patch | 2 +- ...-fix-antenna-configuration-for-RT388.patch | 2 +- ...-fix-LNA-gain-configuration-for-RT38.patch | 10 +- ...0-rt2800lib-fix-VGC-setup-for-RT3883.patch | 6 +- ...-fix-EEPROM-LNA-validation-for-RT388.patch | 12 +- ...-fix-txpower-compensation-for-RT3883.patch | 2 +- ...o-add-a-workaround-for-spurious-TX_F.patch | 14 +- .../602-rt2x00-introduce-rt2x00eeprom.patch | 16 +- ...isabling_bands_through_platform_data.patch | 2 +- ...07-rt2x00-add_platform_data_mac_addr.patch | 2 +- ...00-allow_disabling_bands_through_dts.patch | 2 +- ...0-rt2x00-change-led-polarity-from-OF.patch | 2 +- .../611-rt2x00-add-AP+STA-support.patch | 2 +- ...dd-support-for-external-PA-on-MT7620.patch | 118 - .../651-rt2x00-remove-unneccesary-code.patch | 132 -- ...nitial-code-to-detect-8188eu-devices.patch | 2 +- ...not-set-auto-rate-fallback-on-8188eu.patch | 2 +- ...xu-Add-rtl8188etv-to-USB-device-list.patch | 2 +- ...dd-sitecom-dongle-to-USB-device-list.patch | 2 +- ...8188eu-USB-ID-for-D-Link-USB-GO-N150.patch | 2 +- .../801-libertas-configure-sysfs-links.patch | 6 +- .../802-libertas-set-wireless-macaddr.patch | 2 +- .../810-b43-gpio-mask-module-option.patch | 6 +- .../mac80211/patches/811-b43_no_pio.patch | 2 +- .../patches/812-b43-add-antenna-control.patch | 18 +- .../814-b43-only-use-gpio-0-1-for-led.patch | 2 +- ...815-b43-always-take-overlapping-devs.patch | 2 +- ...-register-wiphy-s-during-module_init.patch | 27 +- ...und-bug-with-some-inconsistent-BSSes.patch | 4 +- ...62-brcmfmac-Disable-power-management.patch | 2 +- ...21-ath10k_init_devices_synchronously.patch | 2 +- .../930-ath10k_add_tpt_led_trigger.patch | 8 +- .../936-ath10k-fix-otp-failure-result.patch | 11 - .../patches/936-ath10k_skip_otp_check.patch | 51 + ...940-mwl8k_init_devices_synchronously.patch | 4 +- ...0-0010-ath10k-limit-htt-rx-ring-size.patch | 11 - ...60-0011-ath10k-limit-pci-buffer-size.patch | 38 - .../files/include/linux/ath9k_platform.h | 1 + 150 files changed, 6320 insertions(+), 1456 deletions(-) create mode 100644 package/kernel/mac80211/patches/006-revert-ktime-changes.patch create mode 100644 package/kernel/mac80211/patches/007-revert-genetlink-changes.patch create mode 100644 package/kernel/mac80211/patches/008-revert-ndo_stats64-cleanup.patch create mode 100644 package/kernel/mac80211/patches/009-revert-mtu-changes.patch create mode 100644 package/kernel/mac80211/patches/011-backport_strscpy.patch delete mode 100644 package/kernel/mac80211/patches/012-kernel_build_check.patch delete mode 100644 package/kernel/mac80211/patches/015-ipw200-mtu.patch create mode 100644 package/kernel/mac80211/patches/020-01-rt2x00-avoid-introducing-a-USB-dependency-in-the-rt2.patch create mode 100644 package/kernel/mac80211/patches/020-02-rt2x00usb-do-not-anchor-rx-and-tx-urb-s.patch create mode 100644 package/kernel/mac80211/patches/020-03-rt2x00usb-fix-anchor-initialization.patch create mode 100644 package/kernel/mac80211/patches/020-04-rt61pci-use-entry-directly.patch create mode 100644 package/kernel/mac80211/patches/020-05-rt2x00-call-entry-directly-in-rt2x00_dump_frame.patch create mode 100644 package/kernel/mac80211/patches/020-06-rt2x00-remove-queue_entry-from-skbdesc.patch create mode 100644 package/kernel/mac80211/patches/020-07-rt2500usb-don-t-mark-register-accesses-as-inline.patch create mode 100644 package/kernel/mac80211/patches/020-08-rt2x00-rt2800lib-move-rt2800_drv_data-declaration-in.patch create mode 100644 package/kernel/mac80211/patches/020-09-rt2800-identify-station-based-on-status-WCID.patch create mode 100644 package/kernel/mac80211/patches/020-10-rt2x00-separte-filling-tx-status-from-rt2x00lib_txdo.patch create mode 100644 package/kernel/mac80211/patches/020-11-rt2x00-separte-clearing-entry-from-rt2x00lib_txdone.patch create mode 100644 package/kernel/mac80211/patches/020-12-rt2x00-add-txdone-nomatch-function.patch create mode 100644 package/kernel/mac80211/patches/020-13-rt2x00-fixup-fill_tx_status-for-nomatch-case.patch create mode 100644 package/kernel/mac80211/patches/020-14-rt2x00-use-txdone_nomatch-on-rt2800usb.patch create mode 100644 package/kernel/mac80211/patches/020-15-rt2800-status-based-rate-flags-for-nomatch-case.patch create mode 100644 package/kernel/mac80211/patches/020-16-rt2800-use-TXOP_BACKOFF-for-probe-frames.patch create mode 100644 package/kernel/mac80211/patches/020-17-rt2x00-fix-rt2x00debug_dump_frame-comment.patch create mode 100644 package/kernel/mac80211/patches/020-18-rt2x00-fix-TX_PWR_CFG_4-register-definition.patch create mode 100644 package/kernel/mac80211/patches/020-19-rt2x00-add-support-for-MT7620.patch create mode 100644 package/kernel/mac80211/patches/021-01-rt2800-fix-LNA-gain-assignment-for-MT7620.patch create mode 100644 package/kernel/mac80211/patches/021-02-rt2800-do-VCO-calibration-after-programming-ALC.patch create mode 100644 package/kernel/mac80211/patches/021-03-rt2800-fix-mt7620-vco-calibration-registers.patch create mode 100644 package/kernel/mac80211/patches/021-04-rt2800-fix-mt7620-E2-channel-registers.patch create mode 100644 package/kernel/mac80211/patches/090-remove-cred.patch delete mode 100644 package/kernel/mac80211/patches/130-disable-fils.patch create mode 100644 package/kernel/mac80211/patches/130-mac80211-hwsim-hrtimer-clock.patch delete mode 100644 package/kernel/mac80211/patches/131-Revert-mac80211-aes-cmac-switch-to-shash-CMAC-driver.patch delete mode 100644 package/kernel/mac80211/patches/132-mac80211-remove-cmac-dependency.patch create mode 100644 package/kernel/mac80211/patches/314-ath9k-rename-tx_complete_work-to-hw_check_work.patch delete mode 100644 package/kernel/mac80211/patches/315-ath9k-adjust-tx-power-reduction-for-US-regulatory-do.patch create mode 100644 package/kernel/mac80211/patches/315-ath9k_hw-check-if-the-chip-failed-to-wake-up.patch delete mode 100644 package/kernel/mac80211/patches/316-ath9k-fix-more-data-flag-for-buffered-multicast-pack.patch create mode 100644 package/kernel/mac80211/patches/316-ath9k-fix-race-condition-in-enabling-disabling-IRQs.patch delete mode 100644 package/kernel/mac80211/patches/317-Revert-ath10k-disable-wake_tx_queue-for-older-device.patch create mode 100644 package/kernel/mac80211/patches/318-0001-brcmfmac-check-brcmf_bus_get_memdump-result-for-erro.patch create mode 100644 package/kernel/mac80211/patches/319-0002-brcmfmac-be-more-verbose-when-PSM-s-watchdog-fires.patch create mode 100644 package/kernel/mac80211/patches/319-0003-brcmfmac-use-wiphy_read_of_freq_limits-to-respect-li.patch create mode 100644 package/kernel/mac80211/patches/319-0004-brcmfmac-merge-two-brcmf_err-macros-into-one.patch create mode 100644 package/kernel/mac80211/patches/319-0005-brcmfmac-switch-to-C-function-__brcmf_err-for-printi.patch create mode 100644 package/kernel/mac80211/patches/319-0006-brcmfmac-merge-two-remaining-brcmf_err-macros.patch create mode 100644 package/kernel/mac80211/patches/320-ath9k-clean-up-and-fix-ath_tx_count_airtime.patch create mode 100644 package/kernel/mac80211/patches/321-mac80211-fix-CSA-in-IBSS-mode.patch create mode 100644 package/kernel/mac80211/patches/322-mac80211-don-t-handle-filtered-frames-within-a-BA-se.patch rename package/kernel/mac80211/patches/{314-ath9k_hw-fix-channel-maximum-power-level-test.patch => 324-ath9k_hw-fix-channel-maximum-power-level-test.patch} (100%) create mode 100644 package/kernel/mac80211/patches/325-mac80211-unconditionally-start-new-netdev-queues-wit.patch create mode 100644 package/kernel/mac80211/patches/326-brcmfmac-add-length-check-in-brcmf_cfg80211_escan_ha.patch delete mode 100644 package/kernel/mac80211/patches/328-mac80211-use-constant-time-comparison-with-keys.patch delete mode 100644 package/kernel/mac80211/patches/329-mac80211-don-t-compare-TKIP-TX-MIC-key-in-reinstall.patch create mode 100644 package/kernel/mac80211/patches/546-ath9k_platform_led_name.patch delete mode 100644 package/kernel/mac80211/patches/650-rt2x00-add-support-for-external-PA-on-MT7620.patch delete mode 100644 package/kernel/mac80211/patches/651-rt2x00-remove-unneccesary-code.patch delete mode 100644 package/kernel/mac80211/patches/936-ath10k-fix-otp-failure-result.patch create mode 100644 package/kernel/mac80211/patches/936-ath10k_skip_otp_check.patch delete mode 100644 package/kernel/mac80211/patches/960-0010-ath10k-limit-htt-rx-ring-size.patch delete mode 100644 package/kernel/mac80211/patches/960-0011-ath10k-limit-pci-buffer-size.patch diff --git a/package/firmware/linux-firmware/Makefile b/package/firmware/linux-firmware/Makefile index e42874af76..fc7ef5b12d 100644 --- a/package/firmware/linux-firmware/Makefile +++ b/package/firmware/linux-firmware/Makefile @@ -12,9 +12,9 @@ PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git -PKG_SOURCE_DATE:=2017-09-06 -PKG_SOURCE_VERSION:=a61ac5cf8374edbfe692d12f805a1b194f7fead2 -PKG_MIRROR_HASH:=b827bf760de57b907df159c8d38d7c3fb5b4a691781114c47739e20bffb3a312 +PKG_SOURCE_DATE:=2016-09-21 +PKG_SOURCE_VERSION:=42ad5367dd38371b2a1bb263b6efa85f9b92fc93 +PKG_MIRROR_HASH:=d77e7e2e7cb655870a78c2650d90ed994b053b0c3b75abf8c62c94dc2ce82e77 PKG_MAINTAINER:=Felix Fietkau diff --git a/package/firmware/linux-firmware/intel.mk b/package/firmware/linux-firmware/intel.mk index 0330335bfb..f5adfaf86c 100644 --- a/package/firmware/linux-firmware/intel.mk +++ b/package/firmware/linux-firmware/intel.mk @@ -21,135 +21,172 @@ define Package/iwl4965-firmware/install endef $(eval $(call BuildPackage,iwl4965-firmware)) -Package/iwlwifi-firmware-iwl100 = $(call Package/firmware-default,Intel Centrino Wireless-N 100 firmware) -define Package/iwlwifi-firmware-iwl100/install +Package/iwlwifi-firmware = $(call Package/firmware-default,Intel wireless firmware) +define Package/iwlwifi-firmware/config + if PACKAGE_iwlwifi-firmware + config IWL100_FW + bool "Intel 100 Firmware" + default y + help + Download and install firmware for: + Intel Centrino Wireless-N 100 + + config IWL1000_FW + bool "Intel 1000 Firmware" + default y + help + Download and install firmware for: + Intel Centrino Wireless-N 1000 + + config IWL105_FW + bool "Intel 105 Firmware" + default y + help + Download and install firmware for: + Intel Centrino Wireless-N 105 + + config IWL135_FW + bool "Intel 135 Firmware" + default y + help + Download and install firmware for: + Intel Centrino Wireless-N 135 + + config IWL2000_FW + bool "Intel 2000 Firmware" + default y + help + Download and install firmware for: + Intel Centrino Wireless-N 2200 + + config IWL2030_FW + bool "Intel 2030 Firmware" + default y + help + Download and install firmware for: + Intel Centrino Wireless-N 2230 + + config IWL3160_FW + bool "Intel 3160 Firmware" + default y + help + Download and install firmware for: + Intel Wireless WiFi 3160 + + config IWL5000_FW + bool "Intel 5000 Firmware" + default y + help + Download and install firmware for: + Intel Wireless WiFi 5100AGN, 5300AGN, and 5350AGN + + config IWL5150_FW + bool "Intel 5150 Firmware" + default y + help + Download and install firmware for: + Intel Wireless WiFi 5150AGN + + config IWL6000_FW + bool "Intel 6000 Firmware" + default y + help + Download and install firmware for: + Intel Centrino Ultimate-N 6300 and Advanced-N 6200 + + config IWL6005_FW + bool "Intel 6005 Firmware" + default y + help + Download and install firmware for: + Intel Centrino Advanced-N 6205 + + config IWL6030_FW + bool "Intel 6030 Firmware" + default y + help + Download and install firmware for: + Intel Centrino Advanced-N 6230, Wireless-N 1030, Wireless-N 130 and Advanced-N 6235 + + config IWL6050_FW + bool "Intel 6050 Firmware" + default y + help + Download and install firmware for: + Intel Centrino Advanced-N + WiMAX 6250 and Wireless-N + WiMAX 6150 + + config IWL7260_FW + bool "Intel 7260 Firmware" + default y + help + Download and install firmware for: + Intel Dual Band Wireless-N 7260 and Intel Dual Band Wireless-AC 7260 + + config IWL7265_FW + bool "Intel 7265 Firmware" + default y + help + Download and install firmware for: + Intel Wireless 7265, 7265D, 3165 + + config IWL8000_FW + bool "Intel 8000 Series Firmware" + default y + help + Download and install firmware for: + Intel Wireless Series 8260, 4165 + endif +endef +define Package/iwlwifi-firmware/install $(INSTALL_DIR) $(1)/lib/firmware +ifneq ($(CONFIG_IWL100_FW),) $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-100-5.ucode $(1)/lib/firmware -endef -$(eval $(call BuildPackage,iwlwifi-firmware-iwl100)) - -Package/iwlwifi-firmware-iwl1000 = $(call Package/firmware-default,Intel Centrino Wireless-N 1000 firmware) -define Package/iwlwifi-firmware-iwl1000/install - $(INSTALL_DIR) $(1)/lib/firmware +endif +ifneq ($(CONFIG_IWL1000_FW),) $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-1000-5.ucode $(1)/lib/firmware -endef -$(eval $(call BuildPackage,iwlwifi-firmware-iwl1000)) - -Package/iwlwifi-firmware-iwl105 = $(call Package/firmware-default,Intel Centrino Wireless-N 105 firmware) -define Package/iwlwifi-firmware-iwl105/install - $(INSTALL_DIR) $(1)/lib/firmware +endif +ifneq ($(CONFIG_IWL105_FW),) $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-105-6.ucode $(1)/lib/firmware -endef -$(eval $(call BuildPackage,iwlwifi-firmware-iwl105)) - -Package/iwlwifi-firmware-iwl135 = $(call Package/firmware-default,Intel Centrino Wireless-N 135 firmware) -define Package/iwlwifi-firmware-iwl135/install - $(INSTALL_DIR) $(1)/lib/firmware +endif +ifneq ($(CONFIG_IWL135_FW),) $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-135-6.ucode $(1)/lib/firmware -endef -$(eval $(call BuildPackage,iwlwifi-firmware-iwl135)) - -Package/iwlwifi-firmware-iwl2000 = $(call Package/firmware-default,Intel Centrino Wireless-N 2200 firmware) -define Package/iwlwifi-firmware-iwl2000/install - $(INSTALL_DIR) $(1)/lib/firmware +endif +ifneq ($(CONFIG_IWL2000_FW),) $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-2000-6.ucode $(1)/lib/firmware -endef -$(eval $(call BuildPackage,iwlwifi-firmware-iwl2000)) - -Package/iwlwifi-firmware-iwl2030 = $(call Package/firmware-default,Intel Centrino Wireless-N 2230 firmware) -define Package/iwlwifi-firmware-iwl2030/install - $(INSTALL_DIR) $(1)/lib/firmware +endif +ifneq ($(CONFIG_IWL2030_FW),) $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-2030-6.ucode $(1)/lib/firmware -endef -$(eval $(call BuildPackage,iwlwifi-firmware-iwl2030)) - -Package/iwlwifi-firmware-iwl3160 = $(call Package/firmware-default,Intel Wireless 3160 firmware) -define Package/iwlwifi-firmware-iwl3160/install - $(INSTALL_DIR) $(1)/lib/firmware - $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-3160-17.ucode $(1)/lib/firmware -endef -$(eval $(call BuildPackage,iwlwifi-firmware-iwl3160)) - -Package/iwlwifi-firmware-iwl3168 = $(call Package/firmware-default,Intel Wireless 3168 firmware) -define Package/iwlwifi-firmware-iwl3168/install - $(INSTALL_DIR) $(1)/lib/firmware - $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-3168-27.ucode $(1)/lib/firmware -endef -$(eval $(call BuildPackage,iwlwifi-firmware-iwl3168)) - -Package/iwlwifi-firmware-iwl5000 = $(call Package/firmware-default,Intel Wireless 5100AGN 5300AGN and 5350AGN firmware) -define Package/iwlwifi-firmware-iwl5000/install - $(INSTALL_DIR) $(1)/lib/firmware +endif +ifneq ($(CONFIG_IWL3160_FW),) + $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-3160-16.ucode $(1)/lib/firmware +endif +ifneq ($(CONFIG_IWL5000_FW),) $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-5000-5.ucode $(1)/lib/firmware -endef -$(eval $(call BuildPackage,iwlwifi-firmware-iwl5000)) - -Package/iwlwifi-firmware-iwl5150 = $(call Package/firmware-default,Intel Wireless Wi-Fi 5150AGN firmware) -define Package/iwlwifi-firmware-iwl5150/install - $(INSTALL_DIR) $(1)/lib/firmware +endif +ifneq ($(CONFIG_IWL5150_FW),) $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-5150-2.ucode $(1)/lib/firmware -endef -$(eval $(call BuildPackage,iwlwifi-firmware-iwl5150)) - -Package/iwlwifi-firmware-iwl6000g2 = $(call Package/firmware-default,Intel Centrino 6300 and 6200 firmware) -define Package/iwlwifi-firmware-iwl6000g2/install - $(INSTALL_DIR) $(1)/lib/firmware +endif +ifneq ($(CONFIG_IWL6000_FW),) $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-6000-4.ucode $(1)/lib/firmware -endef -$(eval $(call BuildPackage,iwlwifi-firmware-iwl6000g2)) - -Package/iwlwifi-firmware-iwl6000g2a = $(call Package/firmware-default,Intel Centrino 6205 firmware) -define Package/iwlwifi-firmware-iwl6000g2a/install - $(INSTALL_DIR) $(1)/lib/firmware +endif +ifneq ($(CONFIG_IWL6005_FW),) $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-6000g2a-6.ucode $(1)/lib/firmware -endef -$(eval $(call BuildPackage,iwlwifi-firmware-iwl6000g2a)) - -Package/iwlwifi-firmware-iwl6000g2b = $(call Package/firmware-default,Intel Centrino 6230 1030 130 and 6235 firmware) -define Package/iwlwifi-firmware-iwl6000g2b/install - $(INSTALL_DIR) $(1)/lib/firmware +endif +ifneq ($(CONFIG_IWL6030_FW),) $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-6000g2b-6.ucode $(1)/lib/firmware -endef -$(eval $(call BuildPackage,iwlwifi-firmware-iwl6000g2b)) - -Package/iwlwifi-firmware-iwl6050 = $(call Package/firmware-default,Intel Centrino 6150 and 6250 firmware) -define Package/iwlwifi-firmware-iwl6050/install - $(INSTALL_DIR) $(1)/lib/firmware +endif +ifneq ($(CONFIG_IWL6050_FW),) $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-6050-5.ucode $(1)/lib/firmware +endif +ifneq ($(CONFIG_IWL7260_FW),) + $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-7260-16.ucode $(1)/lib/firmware +endif +ifneq ($(CONFIG_IWL7265_FW),) + $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-7265-16.ucode $(1)/lib/firmware + $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-7265D-16.ucode $(1)/lib/firmware +endif +ifneq ($(CONFIG_IWL8000_FW),) + $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-8000C-16.ucode $(1)/lib/firmware +endif endef -$(eval $(call BuildPackage,iwlwifi-firmware-iwl6050)) - -Package/iwlwifi-firmware-iwl7260 = $(call Package/firmware-default,Intel Wireless 7260 firmware) -define Package/iwlwifi-firmware-iwl7260/install - $(INSTALL_DIR) $(1)/lib/firmware - $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-7260-17.ucode $(1)/lib/firmware -endef -$(eval $(call BuildPackage,iwlwifi-firmware-iwl7260)) - -Package/iwlwifi-firmware-iwl7265 = $(call Package/firmware-default,Intel Wireless 7265 firmware) -define Package/iwlwifi-firmware-iwl7265/install - $(INSTALL_DIR) $(1)/lib/firmware - $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-7265-17.ucode $(1)/lib/firmware -endef -$(eval $(call BuildPackage,iwlwifi-firmware-iwl7265)) - -Package/iwlwifi-firmware-iwl7265d = $(call Package/firmware-default,Intel Wireless 7265D and 3165 firmware) -define Package/iwlwifi-firmware-iwl7265d/install - $(INSTALL_DIR) $(1)/lib/firmware - $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-7265D-27.ucode $(1)/lib/firmware -endef -$(eval $(call BuildPackage,iwlwifi-firmware-iwl7265d)) - -Package/iwlwifi-firmware-iwl8260c = $(call Package/firmware-default,Intel Wireless 8260 and 4165 firmware) -define Package/iwlwifi-firmware-iwl8260c/install - $(INSTALL_DIR) $(1)/lib/firmware - $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-8000C-27.ucode $(1)/lib/firmware -endef -$(eval $(call BuildPackage,iwlwifi-firmware-iwl8260c)) - -Package/iwlwifi-firmware-iwl8265 = $(call Package/firmware-default,Intel Wireless 8265 firmware) -define Package/iwlwifi-firmware-iwl8265/install - $(INSTALL_DIR) $(1)/lib/firmware - $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-8265-27.ucode $(1)/lib/firmware -endef -$(eval $(call BuildPackage,iwlwifi-firmware-iwl8265)) +$(eval $(call BuildPackage,iwlwifi-firmware)) diff --git a/package/firmware/linux-firmware/qca.mk b/package/firmware/linux-firmware/qca.mk index 0a809d1a21..7ad27ef388 100644 --- a/package/firmware/linux-firmware/qca.mk +++ b/package/firmware/linux-firmware/qca.mk @@ -7,16 +7,6 @@ define Package/ar3k-firmware/install endef $(eval $(call BuildPackage,ar3k-firmware)) - -Package/ath6k-firmware = $(call Package/firmware-default,AR600X firmware) -define Package/ath6k-firmware/install - $(INSTALL_DIR) $(1)/lib/firmware/ath6k - $(CP) \ - $(PKG_BUILD_DIR)/ath6k/* \ - $(1)/lib/firmware/ath6k -endef -$(eval $(call BuildPackage,ath6k-firmware)) - Package/ath9k-htc-firmware = $(call Package/firmware-default,AR9271/AR7010 firmware) define Package/ath9k-htc-firmware/install $(INSTALL_DIR) $(1)/lib/firmware/ath9k_htc diff --git a/package/firmware/linux-firmware/realtek.mk b/package/firmware/linux-firmware/realtek.mk index fdd92c9a42..8c3770eeea 100644 --- a/package/firmware/linux-firmware/realtek.mk +++ b/package/firmware/linux-firmware/realtek.mk @@ -55,11 +55,3 @@ define Package/rtl8192su-firmware/install $(INSTALL_DATA) $(PKG_BUILD_DIR)/rtlwifi/rtl8712u.bin $(1)/lib/firmware/rtlwifi endef $(eval $(call BuildPackage,rtl8192su-firmware)) - -Package/rtl8821ae-firmware = $(call Package/firmware-default,RealTek RTL8821AE firmware) -define Package/rtl8821ae-firmware/install - $(INSTALL_DIR) $(1)/lib/firmware/rtlwifi - $(INSTALL_DATA) $(PKG_BUILD_DIR)/rtlwifi/rtl8821aefw.bin $(1)/lib/firmware/rtlwifi - $(INSTALL_DATA) $(PKG_BUILD_DIR)/rtlwifi/rtl8821aefw_wowlan.bin $(1)/lib/firmware/rtlwifi -endef -$(eval $(call BuildPackage,rtl8821ae-firmware)) diff --git a/package/kernel/mac80211/Makefile b/package/kernel/mac80211/Makefile index 7e9b5ad618..3a96472b88 100644 --- a/package/kernel/mac80211/Makefile +++ b/package/kernel/mac80211/Makefile @@ -10,13 +10,14 @@ include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=mac80211 -PKG_VERSION:=2017-10-06 -PKG_RELEASE:=1 +PKG_VERSION:=2017-01-31 +PKG_RELEASE:=3 PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources -PKG_HASH:=194786b7635f36b9ce280fd2319f6a4feeff209175e330ddbcbe789a3b4540a5 +PKG_BACKPORT_VERSION:= +PKG_HASH:=75e6d39e34cf156212a2509172a4a62b673b69eb4a1d9aaa565f7fa719fa2317 -PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz -PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/backports-$(PKG_VERSION) +PKG_SOURCE:=compat-wireless-$(PKG_VERSION)$(PKG_BACKPORT_VERSION).tar.xz +PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION) PKG_BUILD_PARALLEL:=1 PKG_MAINTAINER:=Felix Fietkau @@ -24,7 +25,7 @@ PKG_MAINTAINER:=Felix Fietkau PKG_DRIVERS = \ adm8211 \ airo \ - ath ath5k ath6kl ath6kl-sdio ath6kl-usb ath9k ath9k-common ath9k-htc ath10k \ + ath ath5k ath9k ath9k-common ath9k-htc ath10k \ b43 b43legacy \ carl9170 \ hermes hermes-pci hermes-pcmcia hermes-plx\ @@ -41,8 +42,8 @@ PKG_DRIVERS = \ rt2800-lib rt2800-mmio rt2800-pci rt2800-soc rt2800-usb \ rt61-pci rt73-usb \ rtl8180 rtl8187 \ - rtlwifi rtlwifi-pci rtlwifi-btcoexist rtlwifi-usb rtl8192c-common \ - rtl8192ce rtl8192se rtl8192de rtl8192cu rtl8821ae \ + rtlwifi rtlwifi-pci rtlwifi-usb rtl8192c-common rtl8192ce rtl8192se \ + rtl8192de rtl8192cu \ rtl8xxxu \ wlcore wl12xx wl18xx \ zd1211rw @@ -100,7 +101,6 @@ endef define KernelPackage/mac80211 $(call KernelPackage/mac80211/Default) TITLE:=Linux 802.11 Wireless Networking Stack - # +kmod-crypto-cmac is a runtime only dependency of net/mac80211/aes_cmac.c DEPENDS+= +kmod-cfg80211 +hostapd-common KCONFIG:=\ CONFIG_AVERAGE=y @@ -217,43 +217,6 @@ define KernelPackage/ath5k/description Atheros 5xxx chipset. endef -define KernelPackage/ath6kl - $(call KernelPackage/mac80211/Default) - TITLE:=Atheros FullMAC wireless devices (common code for ath6kl_sdio and ath6kl_usb) - URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath6kl - HIDDEN:=1 - DEPENDS+= +kmod-ath +@DRIVER_11N_SUPPORT +@KERNEL_RELAY - FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath6kl/ath6kl_core.ko -endef - -define KernelPackage/ath6kl-sdio - $(call KernelPackage/mac80211/Default) - TITLE:=Atheros 802.11n SDIO wireless cards support - URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath6kl - DEPENDS+= +kmod-mmc +kmod-ath6kl - FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath6kl/ath6kl_sdio.ko - AUTOLOAD:=$(call AutoProbe,ath6kl_sdio) -endef - -define KernelPackage/ath6kl-sdio/description -This module adds support for wireless adapters based on -Atheros IEEE 802.11n AR6003 and AR6004 family of chipsets. -endef - -define KernelPackage/ath6kl-usb - $(call KernelPackage/mac80211/Default) - TITLE:=Atheros 802.11n USB wireless cards support - URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath6kl - DEPENDS+= @USB_SUPPORT +kmod-usb-core +kmod-ath6kl - FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath6kl/ath6kl_usb.ko - AUTOLOAD:=$(call AutoProbe,ath6kl_usb) -endef - -define KernelPackage/ath6kl-usb/description -This module adds support for wireless adapters based on the -Atheros IEEE 802.11n AR6004 chipset. -endef - define KernelPackage/ath9k-common $(call KernelPackage/mac80211/Default) TITLE:=Atheros 802.11n wireless devices (common code for ath9k and ath9k_htc) @@ -315,7 +278,7 @@ endef define KernelPackage/ath10k $(call KernelPackage/mac80211/Default) TITLE:=Atheros 802.11ac wireless cards support - URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath10k + URL:=https://wireless.wiki.kernel.org/en/users/Drivers/ath10k DEPENDS+= @PCI_SUPPORT +kmod-ath +@DRIVER_11N_SUPPORT +@DRIVER_11AC_SUPPORT +@DRIVER_11W_SUPPORT +@KERNEL_RELAY FILES:= \ $(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath10k/ath10k_core.ko \ @@ -726,7 +689,7 @@ define KernelPackage/brcmfmac TITLE:=Broadcom IEEE802.11n USB FullMAC WLAN driver URL:=https://wireless.wiki.kernel.org/en/users/drivers/brcm80211 DEPENDS+= @USB_SUPPORT +kmod-cfg80211 +@DRIVER_11N_SUPPORT +@DRIVER_11AC_SUPPORT +kmod-brcmutil \ - +BRCMFMAC_SDIO:kmod-mmc @!TARGET_uml \ + +BRCMFMAC_SDIO:kmod-mmc \ +BRCMFMAC_USB:kmod-usb-core +BRCMFMAC_USB:brcmfmac-firmware-usb FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko AUTOLOAD:=$(call AutoProbe,brcmfmac) @@ -830,7 +793,7 @@ endef define KernelPackage/iwlwifi $(call KernelPackage/mac80211/Default) - DEPENDS:= +kmod-mac80211 @PCI_SUPPORT +@DRIVER_11N_SUPPORT +@DRIVER_11AC_SUPPORT @!LINUX_3_18 + DEPENDS:= +kmod-mac80211 @PCI_SUPPORT +@DRIVER_11N_SUPPORT +iwlwifi-firmware @!LINUX_3_18 TITLE:=Intel AGN Wireless support FILES:= \ $(PKG_BUILD_DIR)/drivers/net/wireless/intel/iwlwifi/iwlwifi.ko \ @@ -966,7 +929,7 @@ endef define KernelPackage/libipw $(call KernelPackage/mac80211/Default) TITLE:=libipw for ipw2100 and ipw2200 - DEPENDS:=@PCI_SUPPORT +kmod-crypto-michael-mic +kmod-crypto-ecb +kmod-lib80211 +kmod-cfg80211 +@DRIVER_WEXT_SUPPORT @!BIG_ENDIAN @!LINUX_3_18 + DEPENDS:=@PCI_SUPPORT +kmod-crypto-michael-mic +kmod-lib80211 +kmod-cfg80211 +@DRIVER_WEXT_SUPPORT @!BIG_ENDIAN FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intel/ipw2x00/libipw.ko AUTOLOAD:=$(call AutoProbe,libipw) endef @@ -1026,7 +989,7 @@ endef define KernelPackage/libertas-usb $(call KernelPackage/mac80211/Default) - DEPENDS+= @USB_SUPPORT +kmod-cfg80211 +kmod-usb-core +kmod-lib80211 +@DRIVER_WEXT_SUPPORT +libertas-usb-firmware @!LINUX_3_18 + DEPENDS+= @USB_SUPPORT +kmod-cfg80211 +kmod-usb-core +kmod-lib80211 +@DRIVER_WEXT_SUPPORT +libertas-usb-firmware TITLE:=Marvell 88W8015 Wireless Driver FILES:= \ $(PKG_BUILD_DIR)/drivers/net/wireless/marvell/libertas/libertas.ko \ @@ -1036,7 +999,7 @@ endef define KernelPackage/libertas-sdio $(call KernelPackage/mac80211/Default) - DEPENDS+= +kmod-cfg80211 +kmod-lib80211 +kmod-mmc +@DRIVER_WEXT_SUPPORT @!TARGET_uml +libertas-sdio-firmware @!LINUX_3_18 + DEPENDS+= +kmod-cfg80211 +kmod-lib80211 +kmod-mmc +@DRIVER_WEXT_SUPPORT @!TARGET_uml +libertas-sdio-firmware TITLE:=Marvell 88W8686 Wireless Driver FILES:= \ $(PKG_BUILD_DIR)/drivers/net/wireless/marvell/libertas/libertas.ko \ @@ -1047,7 +1010,7 @@ endef define KernelPackage/libertas-spi $(call KernelPackage/mac80211/Default) SUBMENU:=Wireless Drivers - DEPENDS+= +kmod-cfg80211 +kmod-lib80211 +@DRIVER_WEXT_SUPPORT @!TARGET_uml +libertas-spi-firmware @!LINUX_3_18 + DEPENDS+= +kmod-cfg80211 +kmod-lib80211 +@DRIVER_WEXT_SUPPORT @!TARGET_uml +libertas-spi-firmware KCONFIG := \ CONFIG_SPI=y \ CONFIG_SPI_MASTER=y @@ -1079,7 +1042,7 @@ endef define KernelPackage/mwl8k $(call KernelPackage/mac80211/Default) TITLE:=Driver for Marvell TOPDOG 802.11 Wireless cards - URL:=https://wireless.wiki.kernel.org/en/users/drivers/mwl8k + URL:=http://wireless.kernel.org/en/users/Drivers/mwl8k DEPENDS+= @PCI_SUPPORT +kmod-mac80211 +@DRIVER_11N_SUPPORT +mwl8k-firmware FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/marvell/mwl8k.ko AUTOLOAD:=$(call AutoProbe,mwl8k) @@ -1093,7 +1056,7 @@ endef define KernelPackage/mwifiex-pcie $(call KernelPackage/mac80211/Default) TITLE:=Driver for Marvell 802.11n/802.11ac PCIe Wireless cards - URL:=https://wireless.wiki.kernel.org/en/users/drivers/mwifiex + URL:=http://wireless.kernel.org/en/users/Drivers/mwifiex DEPENDS+= @PCI_SUPPORT +kmod-mac80211 +@DRIVER_11N_SUPPORT +@DRIVER_11AC_SUPPORT +mwifiex-pcie-firmware FILES:= \ $(PKG_BUILD_DIR)/drivers/net/wireless/marvell/mwifiex/mwifiex.ko \ @@ -1108,7 +1071,7 @@ endef define KernelPackage/mwifiex-sdio $(call KernelPackage/mac80211/Default) TITLE:=Driver for Marvell 802.11n/802.11ac SDIO Wireless cards - URL:=https://wireless.wiki.kernel.org/en/users/drivers/mwifiex + URL:=http://wireless.kernel.org/en/users/Drivers/mwifiex DEPENDS+= +kmod-mmc +kmod-mac80211 +@DRIVER_11N_SUPPORT +@DRIVER_11AC_SUPPORT +mwifiex-sdio-firmware FILES:= \ $(PKG_BUILD_DIR)/drivers/net/wireless/marvell/mwifiex/mwifiex.ko \ @@ -1305,7 +1268,7 @@ endef define KernelPackage/rtl818x/Default $(call KernelPackage/mac80211/Default) TITLE:=Realtek Drivers for RTL818x devices - URL:=https://wireless.wiki.kernel.org/en/users/drivers/rtl8187 + URL:=http://wireless.kernel.org/en/users/Drivers/rtl8187 DEPENDS+= +kmod-eeprom-93cx6 +kmod-mac80211 endef @@ -1351,15 +1314,6 @@ define KernelPackage/rtlwifi-pci HIDDEN:=1 endef -define KernelPackage/rtlwifi-btcoexist - $(call KernelPackage/mac80211/Default) - TITLE:=Realtek BT coexist support - DEPENDS+= +kmod-rtlwifi - FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtlwifi/btcoexist/btcoexist.ko - AUTOLOAD:=$(call AutoProbe,btcoexist) - HIDDEN:=1 -endef - define KernelPackage/rtlwifi-usb $(call KernelPackage/mac80211/Default) TITLE:=Realtek common driver part (USB support) @@ -1409,13 +1363,6 @@ define KernelPackage/rtl8192cu AUTOLOAD:=$(call AutoProbe,rtl8192cu) endef -define KernelPackage/rtl8821ae - $(call KernelPackage/mac80211/Default) - TITLE:=Realtek RTL8821AE support - DEPENDS+= +kmod-rtlwifi-btcoexist +kmod-rtlwifi-pci +rtl8821ae-firmware - FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/rtl8821ae.ko - AUTOLOAD:=$(call AutoProbe,rtl8821ae) -endef define KernelPackage/rtl8xxxu $(call KernelPackage/mac80211/Default) @@ -1467,7 +1414,7 @@ endef define KernelPackage/wl12xx $(call KernelPackage/mac80211/Default) TITLE:=Driver for TI WL12xx - URL:=https://wireless.wiki.kernel.org/en/users/drivers/wl12xx + URL:=http://wireless.kernel.org/en/users/Drivers/wl12xx DEPENDS+= +kmod-wlcore +wl12xx-firmware FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ti/wl12xx/wl12xx.ko AUTOLOAD:=$(call AutoProbe,wl12xx) @@ -1480,7 +1427,7 @@ endef define KernelPackage/wl18xx $(call KernelPackage/mac80211/Default) TITLE:=Driver for TI WL18xx - URL:=https://wireless.wiki.kernel.org/en/users/drivers/wl18xx + URL:=http://wireless.kernel.org/en/users/Drivers/wl18xx DEPENDS+= +kmod-wlcore +wl18xx-firmware FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ti/wl18xx/wl18xx.ko AUTOLOAD:=$(call AutoProbe,wl18xx) @@ -1550,8 +1497,7 @@ ifdef CONFIG_PACKAGE_MAC80211_DEBUGFS ATH9K_HTC_DEBUGFS \ ATH10K_DEBUGFS \ CARL9170_DEBUGFS \ - ATH5K_DEBUG \ - ATH6KL_DEBUG + ATH5K_DEBUG endif ifdef CONFIG_PACKAGE_MAC80211_TRACING @@ -1575,7 +1521,6 @@ config-$(CONFIG_PACKAGE_ATH_DFS) += ATH9K_DFS_CERTIFIED ATH10K_DFS_CERTIFIED config-$(call config_package,ath9k) += ATH9K config-$(call config_package,ath9k-common) += ATH9K_COMMON config-$(CONFIG_TARGET_ar71xx) += ATH9K_AHB -config-$(CONFIG_TARGET_ipq806x) += ATH10K_AHB config-$(CONFIG_PCI) += ATH9K_PCI config-$(CONFIG_ATH_USER_REGD) += ATH_USER_REGD config-$(CONFIG_ATH9K_SUPPORT_PCOEM) += ATH9K_PCOEM @@ -1592,10 +1537,6 @@ else config-y += ATH5K_PCI endif -config-$(call config_package,ath6kl) += ATH6KL -config-$(call config_package,ath6kl-sdio) += ATH6KL_SDIO -config-$(call config_package,ath6kl-usb) += ATH6KL_USB - config-$(call config_package,carl9170) += CARL9170 config-$(call config_package,b43) += B43 @@ -1685,14 +1626,12 @@ config-$(call config_package,zd1211rw) += ZD1211RW config-$(call config_package,rtlwifi) += RTL_CARDS RTLWIFI config-$(call config_package,rtlwifi-pci) += RTLWIFI_PCI -config-$(call config_package,rtlwifi-btcoexist) += RTLBTCOEXIST config-$(call config_package,rtlwifi-usb) += RTLWIFI_USB config-$(call config_package,rtl8192c-common) += RTL8192C_COMMON config-$(call config_package,rtl8192ce) += RTL8192CE config-$(call config_package,rtl8192se) += RTL8192SE config-$(call config_package,rtl8192de) += RTL8192DE config-$(call config_package,rtl8192cu) += RTL8192CU -config-$(call config_package,rtl8821ae) += RTL8821AE config-$(CONFIG_PACKAGE_RTLWIFI_DEBUG) += RTLWIFI_DEBUG config-$(call config_package,rtl8xxxu) += RTL8XXXU @@ -1701,7 +1640,8 @@ config-y += RTL8XXXU_UNTESTED config-$(CONFIG_LEDS_TRIGGERS) += MAC80211_LEDS B43_LEDS B43LEGACY_LEDS MAKE_OPTS:= -C "$(PKG_BUILD_DIR)" \ - $(KERNEL_MAKE_FLAGS) \ + CROSS_COMPILE="$(KERNEL_CROSS)" \ + ARCH="$(LINUX_KARCH)" \ EXTRA_CFLAGS="-I$(PKG_BUILD_DIR)/include $(IREMAP_CFLAGS)" \ KLIB_BUILD="$(LINUX_DIR)" \ MODPROBE=true \ @@ -1709,6 +1649,10 @@ MAKE_OPTS:= -C "$(PKG_BUILD_DIR)" \ KERNEL_SUBLEVEL=$(lastword $(subst ., ,$(KERNEL_PATCHVER))) \ KBUILD_LDFLAGS_MODULE_PREREQ= +ifneq ($(findstring c,$(OPENWRT_VERBOSE)),) + MAKE_OPTS += V=1 +endif + define ConfigVars $(subst $(space),,$(foreach opt,$(config-$(1)),CPTCFG_$(opt)=$(1) )) @@ -1837,9 +1781,6 @@ $(eval $(call KernelPackage,airo)) $(eval $(call KernelPackage,ath)) $(eval $(call KernelPackage,ath10k)) $(eval $(call KernelPackage,ath5k)) -$(eval $(call KernelPackage,ath6kl)) -$(eval $(call KernelPackage,ath6kl-sdio)) -$(eval $(call KernelPackage,ath6kl-usb)) $(eval $(call KernelPackage,ath9k)) $(eval $(call KernelPackage,ath9k-common)) $(eval $(call KernelPackage,ath9k-htc)) @@ -1893,14 +1834,12 @@ $(eval $(call KernelPackage,rtl8180)) $(eval $(call KernelPackage,rtl8187)) $(eval $(call KernelPackage,rtlwifi)) $(eval $(call KernelPackage,rtlwifi-pci)) -$(eval $(call KernelPackage,rtlwifi-btcoexist)) $(eval $(call KernelPackage,rtlwifi-usb)) $(eval $(call KernelPackage,rtl8192c-common)) $(eval $(call KernelPackage,rtl8192ce)) $(eval $(call KernelPackage,rtl8192se)) $(eval $(call KernelPackage,rtl8192de)) $(eval $(call KernelPackage,rtl8192cu)) -$(eval $(call KernelPackage,rtl8821ae)) $(eval $(call KernelPackage,rtl8xxxu)) $(eval $(call KernelPackage,wlcore)) $(eval $(call KernelPackage,wl12xx)) diff --git a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh index ebd24df0d3..82c374353e 100644 --- a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh +++ b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh @@ -411,34 +411,6 @@ mac80211_check_ap() { has_ap=1 } -mac80211_iw_interface_add() { - local phy="$1" - local ifname="$2" - local type="$3" - local wdsflag="$4" - local rc - - iw phy "$phy" interface add "$ifname" type "$type" $wdsflag - rc="$?" - - [ "$rc" = 233 ] && { - # Device might have just been deleted, give the kernel some time to finish cleaning it up - sleep 1 - - iw phy "$phy" interface add "$ifname" type "$type" $wdsflag - rc="$?" - } - - [ "$rc" = 233 ] && { - # Device might not support virtual interfaces, so the interface never got deleted in the first place. - # Check if the interface already exists, and avoid failing in this case. - ip link show dev "$ifname" >/dev/null 2>/dev/null && rc=0 - } - - [ "$rc" != 0 ] && wireless_setup_failed INTERFACE_CREATION_FAILED - return $rc -} - mac80211_prepare_vif() { json_select config @@ -465,7 +437,7 @@ mac80211_prepare_vif() { # It is far easier to delete and create the desired interface case "$mode" in adhoc) - mac80211_iw_interface_add "$phy" "$ifname" adhoc || return + iw phy "$phy" interface add "$ifname" type adhoc ;; ap) # Hostapd will handle recreating the interface and @@ -479,21 +451,21 @@ mac80211_prepare_vif() { mac80211_hostapd_setup_bss "$phy" "$ifname" "$macaddr" "$type" || return [ -n "$hostapd_ctrl" ] || { - mac80211_iw_interface_add "$phy" "$ifname" __ap || return + iw phy "$phy" interface add "$ifname" type __ap hostapd_ctrl="${hostapd_ctrl:-/var/run/hostapd/$ifname}" } ;; mesh) - mac80211_iw_interface_add "$phy" "$ifname" mp || return + iw phy "$phy" interface add "$ifname" type mp ;; monitor) - mac80211_iw_interface_add "$phy" "$ifname" monitor || return + iw phy "$phy" interface add "$ifname" type monitor ;; sta) local wdsflag= staidx="$(($staidx + 1))" [ "$wds" -gt 0 ] && wdsflag="4addr on" - mac80211_iw_interface_add "$phy" "$ifname" managed "$wdsflag" || return + iw phy "$phy" interface add "$ifname" type managed $wdsflag [ "$powersave" -gt 0 ] && powersave="on" || powersave="off" iw "$ifname" set power_save "$powersave" ;; diff --git a/package/kernel/mac80211/patches/001-fix_build.patch b/package/kernel/mac80211/patches/001-fix_build.patch index 9e272e90af..402649d2cc 100644 --- a/package/kernel/mac80211/patches/001-fix_build.patch +++ b/package/kernel/mac80211/patches/001-fix_build.patch @@ -24,7 +24,7 @@ -.DEFAULT: +.SILENT: $(STAMP_KERNEL_CONFIG) +$(STAMP_KERNEL_CONFIG): - @set -e ; test -f local-symbols || ( \ + @set -e ; test -f .local-symbols || ( \ echo "/--------------" ;\ echo "| You shouldn't run make in the backports tree, but only in" ;\ @@ -60,57 +62,61 @@ mrproper: @@ -34,7 +34,7 @@ - @set -e ; if [ "$$(cat .kernel_config_md5 2>/dev/null)" != "$(CONFIG_MD5)" ] ;\ - then \ - echo -n "Generating local configuration database from kernel ..." ;\ -- grep -v -f local-symbols $(KERNEL_CONFIG) | grep = | ( \ +- grep -v -f .local-symbols $(KERNEL_CONFIG) | grep = | ( \ - while read l ; do \ - if [ "$${l:0:7}" != "CONFIG_" ] ; then \ - continue ;\ @@ -85,9 +85,9 @@ + @rm -f .kernel_config_md5_* + @touch $@ + -+Kconfig.kernel: $(STAMP_KERNEL_CONFIG) local-symbols ++Kconfig.kernel: $(STAMP_KERNEL_CONFIG) .local-symbols + @printf "Generating local configuration database from kernel ..." -+ @grep -v -f local-symbols $(KERNEL_CONFIG) | grep = | ( \ ++ @grep -v -f .local-symbols $(KERNEL_CONFIG) | grep = | ( \ + while read l ; do \ + if [ "$${l:0:7}" != "CONFIG_" ] ; then \ + continue ;\ @@ -148,7 +148,7 @@ @$(MAKE) oldconfig - @echo -n "Building backport-include/backport/autoconf.h ..." + @printf "Building backport-include/backport/autoconf.h ..." - @grep -f local-symbols .config | ( \ + @grep -f .local-symbols .config | ( \ echo "#ifndef COMPAT_AUTOCONF_INCLUDED" ;\ echo "#define COMPAT_AUTOCONF_INCLUDED" ;\ @@ -80,7 +80,12 @@ backport-include/backport/autoconf.h: .c diff --git a/package/kernel/mac80211/patches/004-kconfig_backport_fix.patch b/package/kernel/mac80211/patches/004-kconfig_backport_fix.patch index 2c9572ec93..f11029844c 100644 --- a/package/kernel/mac80211/patches/004-kconfig_backport_fix.patch +++ b/package/kernel/mac80211/patches/004-kconfig_backport_fix.patch @@ -17,7 +17,7 @@ #undef IS_ENABLED #define IS_ENABLED(option) \ (config_enabled(option) || config_enabled(option##_MODULE)) -@@ -31,6 +34,8 @@ +@@ -24,6 +27,8 @@ #undef IS_BUILTIN #define IS_BUILTIN(option) config_enabled(option) diff --git a/package/kernel/mac80211/patches/005-revert-devcoredump.patch b/package/kernel/mac80211/patches/005-revert-devcoredump.patch index 1216b99574..ff460900ff 100644 --- a/package/kernel/mac80211/patches/005-revert-devcoredump.patch +++ b/package/kernel/mac80211/patches/005-revert-devcoredump.patch @@ -1,6 +1,6 @@ --- a/compat/Makefile +++ b/compat/Makefile -@@ -39,8 +39,6 @@ compat-$(CPTCFG_KERNEL_4_10) += backport +@@ -35,8 +35,6 @@ compat-$(CPTCFG_KERNEL_4_6) += backport- compat-$(CPTCFG_BPAUTO_BUILD_CRYPTO_CCM) += crypto-ccm.o compat-$(CPTCFG_BPAUTO_CRYPTO_SKCIPHER) += crypto-skcipher.o @@ -9,3 +9,144 @@ compat-$(CPTCFG_BPAUTO_BUILD_WANT_DEV_COREDUMP) += drivers-base-devcoredump.o compat-$(CPTCFG_BPAUTO_RHASHTABLE) += lib-rhashtable.o cordic-objs += lib-cordic.o +--- a/compat/drivers-base-devcoredump.c ++++ b/compat/drivers-base-devcoredump.c +@@ -31,6 +31,7 @@ + #include + #include + #include ++#include "backports.h" + + static struct class devcd_class; + +@@ -40,6 +41,10 @@ static bool devcd_disabled; + /* if data isn't read by userspace after 5 minutes then delete it */ + #define DEVCD_TIMEOUT (HZ * 60 * 5) + ++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0) ++static struct bin_attribute devcd_attr_data; ++#endif ++ + struct devcd_entry { + struct device devcd_dev; + void *data; +@@ -69,8 +74,7 @@ static void devcd_dev_release(struct dev + * a struct device to know when it goes away? + */ + if (devcd->failing_dev->kobj.sd) +- sysfs_delete_link(&devcd->failing_dev->kobj, &dev->kobj, +- "devcoredump"); ++ sysfs_remove_link(&devcd->failing_dev->kobj, "devcoredump"); + + put_device(devcd->failing_dev); + kfree(devcd); +@@ -82,6 +86,9 @@ static void devcd_del(struct work_struct + + devcd = container_of(wk, struct devcd_entry, del_wk.work); + ++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0) ++ device_remove_bin_file(&devcd->devcd_dev, &devcd_attr_data); ++#endif + device_del(&devcd->devcd_dev); + put_device(&devcd->devcd_dev); + } +@@ -115,6 +122,7 @@ static struct bin_attribute devcd_attr_d + .write = devcd_data_write, + }; + ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0) + static struct bin_attribute *devcd_dev_bin_attrs[] = { + &devcd_attr_data, NULL, + }; +@@ -126,6 +134,7 @@ static const struct attribute_group devc + static const struct attribute_group *devcd_dev_groups[] = { + &devcd_dev_group, NULL, + }; ++#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0) */ + + static int devcd_free(struct device *dev, void *data) + { +@@ -160,18 +169,11 @@ static ssize_t disabled_store(struct cla + + return count; + } +-static CLASS_ATTR_RW(disabled); + +-static struct attribute *devcd_class_attrs[] = { +- &class_attr_disabled.attr, +- NULL, ++static struct class_attribute devcd_class_attrs[] = { ++ __ATTR_RW(disabled), ++ __ATTR_NULL + }; +-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0) +-ATTRIBUTE_GROUPS(devcd_class); +-#else +-#define BP_ATTR_GRP_STRUCT device_attribute +-ATTRIBUTE_GROUPS_BACKPORT(devcd_class); +-#endif + + static struct class devcd_class = { + .name = "devcoredump", +@@ -179,10 +181,8 @@ static struct class devcd_class = { + .dev_release = devcd_dev_release, + #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0) + .dev_groups = devcd_dev_groups, +-#else +- .dev_attrs = devcd_class_dev_attrs, + #endif +- .class_groups = devcd_class_groups, ++ .class_attrs = devcd_class_attrs, + }; + + static ssize_t devcd_readv(char *buffer, loff_t offset, size_t count, +@@ -325,6 +325,11 @@ void dev_coredumpm(struct device *dev, s + if (device_add(&devcd->devcd_dev)) + goto put_device; + ++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0) ++ if (device_create_bin_file(&devcd->devcd_dev, &devcd_attr_data)) ++ goto put_device; ++#endif ++ + if (sysfs_create_link(&devcd->devcd_dev.kobj, &dev->kobj, + "failing_device")) + /* nothing - symlink will be missing */; +@@ -367,16 +372,13 @@ void dev_coredumpsg(struct device *dev, + } + EXPORT_SYMBOL_GPL(dev_coredumpsg); + +-static int __init devcoredump_init(void) ++int __init devcoredump_init(void) + { +- init_devcd_class_attrs(); + return class_register(&devcd_class); + } +-__initcall(devcoredump_init); + +-static void __exit devcoredump_exit(void) ++void __exit devcoredump_exit(void) + { + class_for_each_device(&devcd_class, NULL, NULL, devcd_free); + class_unregister(&devcd_class); + } +-__exitcall(devcoredump_exit); +--- a/include/linux/backport-devcoredump.h ++++ b/include/linux/backport-devcoredump.h +@@ -66,7 +66,7 @@ static inline void _devcd_free_sgtable(s + } + + +-#ifdef CONFIG_DEV_COREDUMP ++#ifdef CPTCFG_BPAUTO_WANT_DEV_COREDUMP + void dev_coredumpv(struct device *dev, void *data, size_t datalen, + gfp_t gfp); + +@@ -100,6 +100,6 @@ static inline void dev_coredumpsg(struct + { + _devcd_free_sgtable(table); + } +-#endif /* CONFIG_DEV_COREDUMP */ ++#endif /* CPTCFG_BPAUTO_WANT_DEV_COREDUMP */ + + #endif /* __DEVCOREDUMP_H */ diff --git a/package/kernel/mac80211/patches/006-revert-ktime-changes.patch b/package/kernel/mac80211/patches/006-revert-ktime-changes.patch new file mode 100644 index 0000000000..b839eb4c8d --- /dev/null +++ b/package/kernel/mac80211/patches/006-revert-ktime-changes.patch @@ -0,0 +1,20 @@ +--- a/drivers/net/wireless/ralink/rt2x00/rt2800usb.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2800usb.c +@@ -177,7 +177,7 @@ static bool rt2800usb_tx_sta_fifo_read_c + if (rt2800usb_txstatus_pending(rt2x00dev)) { + /* Read register after 1 ms */ + hrtimer_start(&rt2x00dev->txstatus_timer, +- TXSTATUS_READ_INTERVAL, ++ ktime_set(0, TXSTATUS_READ_INTERVAL), + HRTIMER_MODE_REL); + return false; + } +@@ -204,7 +204,7 @@ static void rt2800usb_async_read_tx_stat + + /* Read TX_STA_FIFO register after 2 ms */ + hrtimer_start(&rt2x00dev->txstatus_timer, +- 2 * TXSTATUS_READ_INTERVAL, ++ ktime_set(0, 2*TXSTATUS_READ_INTERVAL), + HRTIMER_MODE_REL); + } + diff --git a/package/kernel/mac80211/patches/007-revert-genetlink-changes.patch b/package/kernel/mac80211/patches/007-revert-genetlink-changes.patch new file mode 100644 index 0000000000..1a85106bc2 --- /dev/null +++ b/package/kernel/mac80211/patches/007-revert-genetlink-changes.patch @@ -0,0 +1,266 @@ +--- a/net/wireless/nl80211.c ++++ b/net/wireless/nl80211.c +@@ -32,8 +32,22 @@ static int nl80211_crypto_settings(struc + struct cfg80211_crypto_settings *settings, + int cipher_limit); + ++static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb, ++ struct genl_info *info); ++static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb, ++ struct genl_info *info); ++ + /* the netlink family */ +-static struct genl_family nl80211_fam; ++static struct genl_family nl80211_fam = { ++ .id = GENL_ID_GENERATE, /* don't bother with a hardcoded ID */ ++ .name = NL80211_GENL_NAME, /* have users key off the name instead */ ++ .hdrsize = 0, /* no private header */ ++ .version = 1, /* no particular meaning now */ ++ .maxattr = NL80211_ATTR_MAX, ++ .netnsok = true, ++ .pre_doit = nl80211_pre_doit, ++ .post_doit = nl80211_post_doit, ++}; + + /* multicast groups */ + enum nl80211_multicast_groups { +@@ -549,14 +563,13 @@ static int nl80211_prepare_wdev_dump(str + + if (!cb->args[0]) { + err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize, +- genl_family_attrbuf(&nl80211_fam), +- nl80211_fam.maxattr, nl80211_policy); ++ nl80211_fam.attrbuf, nl80211_fam.maxattr, ++ nl80211_policy); + if (err) + goto out_unlock; + +- *wdev = __cfg80211_wdev_from_attrs( +- sock_net(skb->sk), +- genl_family_attrbuf(&nl80211_fam)); ++ *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk), ++ nl80211_fam.attrbuf); + if (IS_ERR(*wdev)) { + err = PTR_ERR(*wdev); + goto out_unlock; +@@ -1903,7 +1916,7 @@ static int nl80211_dump_wiphy_parse(stru + struct netlink_callback *cb, + struct nl80211_dump_wiphy_state *state) + { +- struct nlattr **tb = genl_family_attrbuf(&nl80211_fam); ++ struct nlattr **tb = nl80211_fam.attrbuf; + int ret = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize, + tb, nl80211_fam.maxattr, nl80211_policy); + /* ignore parse errors for backward compatibility */ +@@ -7733,7 +7746,6 @@ static int nl80211_send_survey(struct sk + + static int nl80211_dump_survey(struct sk_buff *skb, struct netlink_callback *cb) + { +- struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam); + struct survey_info survey; + struct cfg80211_registered_device *rdev; + struct wireless_dev *wdev; +@@ -7746,7 +7758,7 @@ static int nl80211_dump_survey(struct sk + return res; + + /* prepare_wdev_dump parsed the attributes */ +- radio_stats = attrbuf[NL80211_ATTR_SURVEY_RADIO_STATS]; ++ radio_stats = nl80211_fam.attrbuf[NL80211_ATTR_SURVEY_RADIO_STATS]; + + if (!wdev->netdev) { + res = -EINVAL; +@@ -8594,14 +8606,14 @@ static int nl80211_testmode_dump(struct + */ + phy_idx = cb->args[0] - 1; + } else { +- struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam); +- + err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize, +- attrbuf, nl80211_fam.maxattr, nl80211_policy); ++ nl80211_fam.attrbuf, nl80211_fam.maxattr, ++ nl80211_policy); + if (err) + goto out_err; + +- rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); ++ rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), ++ nl80211_fam.attrbuf); + if (IS_ERR(rdev)) { + err = PTR_ERR(rdev); + goto out_err; +@@ -8609,8 +8621,9 @@ static int nl80211_testmode_dump(struct + phy_idx = rdev->wiphy_idx; + rdev = NULL; + +- if (attrbuf[NL80211_ATTR_TESTDATA]) +- cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA]; ++ if (nl80211_fam.attrbuf[NL80211_ATTR_TESTDATA]) ++ cb->args[1] = ++ (long)nl80211_fam.attrbuf[NL80211_ATTR_TESTDATA]; + } + + if (cb->args[1]) { +@@ -10814,7 +10827,8 @@ static int handle_nan_filter(struct nlat + + i = 0; + nla_for_each_nested(attr, attr_filter, rem) { +- filter[i].filter = nla_memdup(attr, GFP_KERNEL); ++ filter[i].filter = kmemdup(nla_data(attr), nla_len(attr), ++ GFP_KERNEL); + filter[i].len = nla_len(attr); + i++; + } +@@ -11450,7 +11464,6 @@ static int nl80211_prepare_vendor_dump(s + struct cfg80211_registered_device **rdev, + struct wireless_dev **wdev) + { +- struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam); + u32 vid, subcmd; + unsigned int i; + int vcmd_idx = -1; +@@ -11486,28 +11499,31 @@ static int nl80211_prepare_vendor_dump(s + } + + err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize, +- attrbuf, nl80211_fam.maxattr, nl80211_policy); ++ nl80211_fam.attrbuf, nl80211_fam.maxattr, ++ nl80211_policy); + if (err) + goto out_unlock; + +- if (!attrbuf[NL80211_ATTR_VENDOR_ID] || +- !attrbuf[NL80211_ATTR_VENDOR_SUBCMD]) { ++ if (!nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_ID] || ++ !nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_SUBCMD]) { + err = -EINVAL; + goto out_unlock; + } + +- *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk), attrbuf); ++ *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk), ++ nl80211_fam.attrbuf); + if (IS_ERR(*wdev)) + *wdev = NULL; + +- *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); ++ *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), ++ nl80211_fam.attrbuf); + if (IS_ERR(*rdev)) { + err = PTR_ERR(*rdev); + goto out_unlock; + } + +- vid = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_ID]); +- subcmd = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_SUBCMD]); ++ vid = nla_get_u32(nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_ID]); ++ subcmd = nla_get_u32(nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_SUBCMD]); + + for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) { + const struct wiphy_vendor_command *vcmd; +@@ -11531,9 +11547,9 @@ static int nl80211_prepare_vendor_dump(s + goto out_unlock; + } + +- if (attrbuf[NL80211_ATTR_VENDOR_DATA]) { +- data = nla_data(attrbuf[NL80211_ATTR_VENDOR_DATA]); +- data_len = nla_len(attrbuf[NL80211_ATTR_VENDOR_DATA]); ++ if (nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_DATA]) { ++ data = nla_data(nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_DATA]); ++ data_len = nla_len(nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_DATA]); + } + + /* 0 is the first index - add 1 to parse only once */ +@@ -12795,21 +12811,6 @@ static __genl_const struct genl_ops nl80 + }, + }; + +-static struct genl_family nl80211_fam __ro_after_init = { +- .name = NL80211_GENL_NAME, /* have users key off the name instead */ +- .hdrsize = 0, /* no private header */ +- .version = 1, /* no particular meaning now */ +- .maxattr = NL80211_ATTR_MAX, +- .netnsok = true, +- .pre_doit = nl80211_pre_doit, +- .post_doit = nl80211_post_doit, +- .module = THIS_MODULE, +- .ops = nl80211_ops, +- .n_ops = ARRAY_SIZE(nl80211_ops), +- .mcgrps = nl80211_mcgrps, +- .n_mcgrps = ARRAY_SIZE(nl80211_mcgrps), +-}; +- + /* notification functions */ + + void nl80211_notify_wiphy(struct cfg80211_registered_device *rdev, +@@ -14759,11 +14760,12 @@ void nl80211_send_ap_stopped(struct wire + + /* initialisation/exit functions */ + +-int __init nl80211_init(void) ++int nl80211_init(void) + { + int err; + +- err = genl_register_family(&nl80211_fam); ++ err = genl_register_family_with_ops_groups(&nl80211_fam, nl80211_ops, ++ nl80211_mcgrps); + if (err) + return err; + +--- a/drivers/net/wireless/mac80211_hwsim.c ++++ b/drivers/net/wireless/mac80211_hwsim.c +@@ -587,8 +587,15 @@ struct hwsim_radiotap_ack_hdr { + __le16 rt_chbitmask; + } __packed; + +-/* MAC80211_HWSIM netlink family */ +-static struct genl_family hwsim_genl_family; ++/* MAC80211_HWSIM netlinf family */ ++static struct genl_family hwsim_genl_family = { ++ .id = GENL_ID_GENERATE, ++ .hdrsize = 0, ++ .name = "MAC80211_HWSIM", ++ .version = 1, ++ .maxattr = HWSIM_ATTR_MAX, ++ .netnsok = true, ++}; + + enum hwsim_multicast_groups { + HWSIM_MCGRP_CONFIG, +@@ -3250,18 +3257,6 @@ static __genl_const struct genl_ops hwsi + }, + }; + +-static struct genl_family hwsim_genl_family __ro_after_init = { +- .name = "MAC80211_HWSIM", +- .version = 1, +- .maxattr = HWSIM_ATTR_MAX, +- .netnsok = true, +- .module = THIS_MODULE, +- .ops = hwsim_ops, +- .n_ops = ARRAY_SIZE(hwsim_ops), +- .mcgrps = hwsim_mcgrps, +- .n_mcgrps = ARRAY_SIZE(hwsim_mcgrps), +-}; +- + static void destroy_radio(struct work_struct *work) + { + struct mac80211_hwsim_data *data = +@@ -3309,13 +3304,15 @@ static struct notifier_block hwsim_netli + .notifier_call = mac80211_hwsim_netlink_notify, + }; + +-static int __init hwsim_init_netlink(void) ++static int hwsim_init_netlink(void) + { + int rc; + + printk(KERN_INFO "mac80211_hwsim: initializing netlink\n"); + +- rc = genl_register_family(&hwsim_genl_family); ++ rc = genl_register_family_with_ops_groups(&hwsim_genl_family, ++ hwsim_ops, ++ hwsim_mcgrps); + if (rc) + goto failure; + diff --git a/package/kernel/mac80211/patches/008-revert-ndo_stats64-cleanup.patch b/package/kernel/mac80211/patches/008-revert-ndo_stats64-cleanup.patch new file mode 100644 index 0000000000..0f6f0f919f --- /dev/null +++ b/package/kernel/mac80211/patches/008-revert-ndo_stats64-cleanup.patch @@ -0,0 +1,20 @@ +--- a/net/mac80211/iface.c ++++ b/net/mac80211/iface.c +@@ -1133,7 +1133,7 @@ static u16 ieee80211_netdev_select_queue + return ieee80211_select_queue(IEEE80211_DEV_TO_SUB_IF(dev), skb); + } + +-static void ++static struct rtnl_link_stats64 * + ieee80211_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) + { + int i; +@@ -1158,6 +1158,8 @@ ieee80211_get_stats64(struct net_device + stats->rx_bytes += rx_bytes; + stats->tx_bytes += tx_bytes; + } ++ ++ return stats; + } + + static const struct net_device_ops ieee80211_dataif_ops = { diff --git a/package/kernel/mac80211/patches/009-revert-mtu-changes.patch b/package/kernel/mac80211/patches/009-revert-mtu-changes.patch new file mode 100644 index 0000000000..f5e2757d3f --- /dev/null +++ b/package/kernel/mac80211/patches/009-revert-mtu-changes.patch @@ -0,0 +1,338 @@ +--- a/net/mac80211/iface.c ++++ b/net/mac80211/iface.c +@@ -151,6 +151,15 @@ void ieee80211_recalc_idle(struct ieee80 + ieee80211_hw_config(local, change); + } + ++static int ieee80211_change_mtu(struct net_device *dev, int new_mtu) ++{ ++ if (new_mtu < 256 || new_mtu > IEEE80211_MAX_DATA_LEN) ++ return -EINVAL; ++ ++ dev->mtu = new_mtu; ++ return 0; ++} ++ + static int ieee80211_verify_mac(struct ieee80211_sub_if_data *sdata, u8 *addr, + bool check_dup) + { +@@ -1168,6 +1177,7 @@ static const struct net_device_ops ieee8 + .ndo_uninit = ieee80211_uninit, + .ndo_start_xmit = ieee80211_subif_start_xmit, + .ndo_set_rx_mode = ieee80211_set_multicast_list, ++ .ndo_change_mtu = ieee80211_change_mtu, + .ndo_set_mac_address = ieee80211_change_mac, + .ndo_select_queue = ieee80211_netdev_select_queue, + .ndo_get_stats64 = ieee80211_get_stats64, +@@ -1211,6 +1221,7 @@ static const struct net_device_ops ieee8 + .ndo_uninit = ieee80211_uninit, + .ndo_start_xmit = ieee80211_monitor_start_xmit, + .ndo_set_rx_mode = ieee80211_set_multicast_list, ++ .ndo_change_mtu = ieee80211_change_mtu, + .ndo_set_mac_address = ieee80211_change_mac, + .ndo_select_queue = ieee80211_monitor_select_queue, + .ndo_get_stats64 = ieee80211_get_stats64, +@@ -1919,10 +1930,6 @@ int ieee80211_if_add(struct ieee80211_lo + + netdev_set_default_ethtool_ops(ndev, &ieee80211_ethtool_ops); + +- /* MTU range: 256 - 2304 */ +- ndev->min_mtu = 256; +- ndev->max_mtu = IEEE80211_MAX_DATA_LEN; +- + ret = register_netdevice(ndev); + if (ret) { + ieee80211_if_free(ndev); +--- a/drivers/net/wireless/ath/wil6210/netdev.c ++++ b/drivers/net/wireless/ath/wil6210/netdev.c +@@ -42,6 +42,21 @@ static int wil_stop(struct net_device *n + return wil_down(wil); + } + ++static int wil_change_mtu(struct net_device *ndev, int new_mtu) ++{ ++ struct wil6210_priv *wil = ndev_to_wil(ndev); ++ ++ if (new_mtu < 68 || new_mtu > mtu_max) { ++ wil_err(wil, "invalid MTU %d\n", new_mtu); ++ return -EINVAL; ++ } ++ ++ wil_dbg_misc(wil, "change MTU %d -> %d\n", ndev->mtu, new_mtu); ++ ndev->mtu = new_mtu; ++ ++ return 0; ++} ++ + static int wil_do_ioctl(struct net_device *ndev, struct ifreq *ifr, int cmd) + { + struct wil6210_priv *wil = ndev_to_wil(ndev); +@@ -55,6 +70,7 @@ static const struct net_device_ops wil_n + .ndo_start_xmit = wil_start_xmit, + .ndo_set_mac_address = eth_mac_addr, + .ndo_validate_addr = eth_validate_addr, ++ .ndo_change_mtu = wil_change_mtu, + .ndo_do_ioctl = wil_do_ioctl, + }; + +@@ -111,7 +127,6 @@ static int wil6210_netdev_poll_tx(struct + static void wil_dev_setup(struct net_device *dev) + { + ether_setup(dev); +- dev->max_mtu = mtu_max; + dev->tx_queue_len = WIL_TX_Q_LEN_DEFAULT; + } + +--- a/drivers/net/wireless/atmel/atmel.c ++++ b/drivers/net/wireless/atmel/atmel.c +@@ -1295,6 +1295,14 @@ static struct iw_statistics *atmel_get_w + return &priv->wstats; + } + ++static int atmel_change_mtu(struct net_device *dev, int new_mtu) ++{ ++ if ((new_mtu < 68) || (new_mtu > 2312)) ++ return -EINVAL; ++ dev->mtu = new_mtu; ++ return 0; ++} ++ + static int atmel_set_mac_address(struct net_device *dev, void *p) + { + struct sockaddr *addr = p; +@@ -1498,6 +1506,7 @@ static const struct file_operations atme + static const struct net_device_ops atmel_netdev_ops = { + .ndo_open = atmel_open, + .ndo_stop = atmel_close, ++ .ndo_change_mtu = atmel_change_mtu, + .ndo_set_mac_address = atmel_set_mac_address, + .ndo_start_xmit = start_tx, + .ndo_do_ioctl = atmel_ioctl, +@@ -1591,10 +1600,6 @@ struct net_device *init_atmel_card(unsig + dev->irq = irq; + dev->base_addr = port; + +- /* MTU range: 68 - 2312 */ +- dev->min_mtu = 68; +- dev->max_mtu = MAX_WIRELESS_BODY - ETH_FCS_LEN; +- + SET_NETDEV_DEV(dev, sys_dev); + + if ((rc = request_irq(dev->irq, service_interrupt, IRQF_SHARED, dev->name, dev))) { +--- a/drivers/net/wireless/cisco/airo.c ++++ b/drivers/net/wireless/cisco/airo.c +@@ -2329,6 +2329,14 @@ static int airo_set_mac_address(struct n + return 0; + } + ++static int airo_change_mtu(struct net_device *dev, int new_mtu) ++{ ++ if ((new_mtu < 68) || (new_mtu > 2400)) ++ return -EINVAL; ++ dev->mtu = new_mtu; ++ return 0; ++} ++ + static LIST_HEAD(airo_devices); + + static void add_airo_dev(struct airo_info *ai) +@@ -2648,6 +2656,7 @@ static const struct net_device_ops airo1 + .ndo_get_stats = airo_get_stats, + .ndo_set_mac_address = airo_set_mac_address, + .ndo_do_ioctl = airo_ioctl, ++ .ndo_change_mtu = airo_change_mtu, + }; + + static void wifi_setup(struct net_device *dev) +@@ -2659,8 +2668,6 @@ static void wifi_setup(struct net_device + dev->type = ARPHRD_IEEE80211; + dev->hard_header_len = ETH_HLEN; + dev->mtu = AIRO_DEF_MTU; +- dev->min_mtu = 68; +- dev->max_mtu = MIC_MSGLEN_MAX; + dev->addr_len = ETH_ALEN; + dev->tx_queue_len = 100; + +@@ -2747,6 +2754,7 @@ static const struct net_device_ops airo_ + .ndo_set_rx_mode = airo_set_multicast_list, + .ndo_set_mac_address = airo_set_mac_address, + .ndo_do_ioctl = airo_ioctl, ++ .ndo_change_mtu = airo_change_mtu, + .ndo_validate_addr = eth_validate_addr, + }; + +@@ -2758,6 +2766,7 @@ static const struct net_device_ops mpi_n + .ndo_set_rx_mode = airo_set_multicast_list, + .ndo_set_mac_address = airo_set_mac_address, + .ndo_do_ioctl = airo_ioctl, ++ .ndo_change_mtu = airo_change_mtu, + .ndo_validate_addr = eth_validate_addr, + }; + +@@ -2813,7 +2822,6 @@ static struct net_device *_init_airo_car + dev->irq = irq; + dev->base_addr = port; + dev->priv_flags &= ~IFF_TX_SKB_SHARING; +- dev->max_mtu = MIC_MSGLEN_MAX; + + SET_NETDEV_DEV(dev, dmdev); + +--- a/drivers/net/wireless/intel/ipw2x00/ipw2100.c ++++ b/drivers/net/wireless/intel/ipw2x00/ipw2100.c +@@ -6039,6 +6039,7 @@ static const struct net_device_ops ipw21 + .ndo_open = ipw2100_open, + .ndo_stop = ipw2100_close, + .ndo_start_xmit = libipw_xmit, ++ .ndo_change_mtu = libipw_change_mtu, + .ndo_tx_timeout = ipw2100_tx_timeout, + .ndo_set_mac_address = ipw2100_set_address, + .ndo_validate_addr = eth_validate_addr, +@@ -6074,8 +6075,6 @@ static struct net_device *ipw2100_alloc_ + dev->wireless_data = &priv->wireless_data; + dev->watchdog_timeo = 3 * HZ; + dev->irq = 0; +- dev->min_mtu = 68; +- dev->max_mtu = LIBIPW_DATA_LEN; + + /* NOTE: We don't use the wireless_handlers hook + * in dev as the system will start throwing WX requests +--- a/drivers/net/wireless/intel/ipw2x00/ipw2200.c ++++ b/drivers/net/wireless/intel/ipw2x00/ipw2200.c +@@ -11561,6 +11561,7 @@ static const struct net_device_ops ipw_p + .ndo_open = ipw_prom_open, + .ndo_stop = ipw_prom_stop, + .ndo_start_xmit = ipw_prom_hard_start_xmit, ++ .ndo_change_mtu = libipw_change_mtu, + .ndo_set_mac_address = eth_mac_addr, + .ndo_validate_addr = eth_validate_addr, + }; +@@ -11586,9 +11587,6 @@ static int ipw_prom_alloc(struct ipw_pri + priv->prom_net_dev->type = ARPHRD_IEEE80211_RADIOTAP; + priv->prom_net_dev->netdev_ops = &ipw_prom_netdev_ops; + +- priv->prom_net_dev->min_mtu = 68; +- priv->prom_net_dev->max_mtu = LIBIPW_DATA_LEN; +- + priv->prom_priv->ieee->iw_mode = IW_MODE_MONITOR; + SET_NETDEV_DEV(priv->prom_net_dev, &priv->pci_dev->dev); + +@@ -11621,6 +11619,7 @@ static const struct net_device_ops ipw_n + .ndo_set_rx_mode = ipw_net_set_multicast_list, + .ndo_set_mac_address = ipw_net_set_mac_address, + .ndo_start_xmit = libipw_xmit, ++ .ndo_change_mtu = libipw_change_mtu, + .ndo_validate_addr = eth_validate_addr, + }; + +@@ -11730,9 +11729,6 @@ static int ipw_pci_probe(struct pci_dev + net_dev->wireless_handlers = &ipw_wx_handler_def; + net_dev->ethtool_ops = &ipw_ethtool_ops; + +- net_dev->min_mtu = 68; +- net_dev->max_mtu = LIBIPW_DATA_LEN; +- + err = sysfs_create_group(&pdev->dev.kobj, &ipw_attribute_group); + if (err) { + IPW_ERROR("failed to create sysfs device attributes\n"); +--- a/drivers/net/wireless/intel/ipw2x00/libipw.h ++++ b/drivers/net/wireless/intel/ipw2x00/libipw.h +@@ -948,6 +948,7 @@ static inline int libipw_is_cck_rate(u8 + /* libipw.c */ + void free_libipw(struct net_device *dev, int monitor); + struct net_device *alloc_libipw(int sizeof_priv, int monitor); ++int libipw_change_mtu(struct net_device *dev, int new_mtu); + + void libipw_networks_age(struct libipw_device *ieee, unsigned long age_secs); + +--- a/drivers/net/wireless/intel/ipw2x00/libipw_module.c ++++ b/drivers/net/wireless/intel/ipw2x00/libipw_module.c +@@ -118,6 +118,15 @@ static void libipw_networks_initialize(s + &ieee->network_free_list); + } + ++int libipw_change_mtu(struct net_device *dev, int new_mtu) ++{ ++ if ((new_mtu < 68) || (new_mtu > LIBIPW_DATA_LEN)) ++ return -EINVAL; ++ dev->mtu = new_mtu; ++ return 0; ++} ++EXPORT_SYMBOL(libipw_change_mtu); ++ + struct net_device *alloc_libipw(int sizeof_priv, int monitor) + { + struct libipw_device *ieee; +--- a/drivers/net/wireless/intersil/hostap/hostap_main.c ++++ b/drivers/net/wireless/intersil/hostap/hostap_main.c +@@ -765,6 +765,16 @@ static void hostap_set_multicast_list(st + } + + ++static int prism2_change_mtu(struct net_device *dev, int new_mtu) ++{ ++ if (new_mtu < PRISM2_MIN_MTU || new_mtu > PRISM2_MAX_MTU) ++ return -EINVAL; ++ ++ dev->mtu = new_mtu; ++ return 0; ++} ++ ++ + static void prism2_tx_timeout(struct net_device *dev) + { + struct hostap_interface *iface; +@@ -803,6 +813,7 @@ static const struct net_device_ops hosta + .ndo_do_ioctl = hostap_ioctl, + .ndo_set_mac_address = prism2_set_mac_address, + .ndo_set_rx_mode = hostap_set_multicast_list, ++ .ndo_change_mtu = prism2_change_mtu, + .ndo_tx_timeout = prism2_tx_timeout, + .ndo_validate_addr = eth_validate_addr, + }; +@@ -815,6 +826,7 @@ static const struct net_device_ops hosta + .ndo_do_ioctl = hostap_ioctl, + .ndo_set_mac_address = prism2_set_mac_address, + .ndo_set_rx_mode = hostap_set_multicast_list, ++ .ndo_change_mtu = prism2_change_mtu, + .ndo_tx_timeout = prism2_tx_timeout, + .ndo_validate_addr = eth_validate_addr, + }; +@@ -827,6 +839,7 @@ static const struct net_device_ops hosta + .ndo_do_ioctl = hostap_ioctl, + .ndo_set_mac_address = prism2_set_mac_address, + .ndo_set_rx_mode = hostap_set_multicast_list, ++ .ndo_change_mtu = prism2_change_mtu, + .ndo_tx_timeout = prism2_tx_timeout, + .ndo_validate_addr = eth_validate_addr, + }; +@@ -838,8 +851,6 @@ void hostap_setup_dev(struct net_device + + iface = netdev_priv(dev); + ether_setup(dev); +- dev->min_mtu = PRISM2_MIN_MTU; +- dev->max_mtu = PRISM2_MAX_MTU; + dev->priv_flags &= ~IFF_TX_SKB_SHARING; + + /* kernel callbacks */ +--- a/drivers/net/wireless/intersil/orinoco/main.c ++++ b/drivers/net/wireless/intersil/orinoco/main.c +@@ -322,6 +322,9 @@ int orinoco_change_mtu(struct net_device + { + struct orinoco_private *priv = ndev_priv(dev); + ++ if ((new_mtu < ORINOCO_MIN_MTU) || (new_mtu > ORINOCO_MAX_MTU)) ++ return -EINVAL; ++ + /* MTU + encapsulation + header length */ + if ((new_mtu + ENCAPS_OVERHEAD + sizeof(struct ieee80211_hdr)) > + (priv->nicbuf_size - ETH_HLEN)) +@@ -2285,9 +2288,6 @@ int orinoco_if_add(struct orinoco_privat + dev->base_addr = base_addr; + dev->irq = irq; + +- dev->min_mtu = ORINOCO_MIN_MTU; +- dev->max_mtu = ORINOCO_MAX_MTU; +- + SET_NETDEV_DEV(dev, priv->dev); + ret = register_netdev(dev); + if (ret) diff --git a/package/kernel/mac80211/patches/010-disable_rfkill.patch b/package/kernel/mac80211/patches/010-disable_rfkill.patch index d5253063ce..2902e498d8 100644 --- a/package/kernel/mac80211/patches/010-disable_rfkill.patch +++ b/package/kernel/mac80211/patches/010-disable_rfkill.patch @@ -10,6 +10,6 @@ +#undef CONFIG_RFKILL_MODULE +#undef CONFIG_RFKILL_FULL_MODULE + - #if LINUX_VERSION_IS_GEQ(3,10,0) + #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) #include_next #else diff --git a/package/kernel/mac80211/patches/011-backport_strscpy.patch b/package/kernel/mac80211/patches/011-backport_strscpy.patch new file mode 100644 index 0000000000..c8e26c46f2 --- /dev/null +++ b/package/kernel/mac80211/patches/011-backport_strscpy.patch @@ -0,0 +1,43 @@ +--- a/backport-include/linux/string.h ++++ b/backport-include/linux/string.h +@@ -25,4 +25,8 @@ extern void *memdup_user_nul(const void + void memzero_explicit(void *s, size_t count); + #endif + ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,3,0)) ++ssize_t strscpy(char *dest, const char *src, size_t count); ++#endif ++ + #endif /* __BACKPORT_LINUX_STRING_H */ +--- a/compat/backport-4.3.c ++++ b/compat/backport-4.3.c +@@ -57,3 +57,29 @@ void seq_hex_dump(struct seq_file *m, co + } + } + EXPORT_SYMBOL_GPL(seq_hex_dump); ++ ++ssize_t strscpy(char *dest, const char *src, size_t count) ++{ ++ long res = 0; ++ ++ if (count == 0) ++ return -E2BIG; ++ ++ while (count) { ++ char c; ++ ++ c = src[res]; ++ dest[res] = c; ++ if (!c) ++ return res; ++ res++; ++ count--; ++ } ++ ++ /* Hit buffer length without finding a NUL; force NUL-termination. */ ++ if (res) ++ dest[res-1] = '\0'; ++ ++ return -E2BIG; ++} ++EXPORT_SYMBOL_GPL(strscpy); diff --git a/package/kernel/mac80211/patches/012-kernel_build_check.patch b/package/kernel/mac80211/patches/012-kernel_build_check.patch deleted file mode 100644 index d225ba1820..0000000000 --- a/package/kernel/mac80211/patches/012-kernel_build_check.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/Makefile -+++ b/Makefile -@@ -2,7 +2,7 @@ - # Makefile for the output source package - # - --ifeq ($(KERNELRELEASE),) -+ifeq ($(KERNELVERSION),) - - MAKEFLAGS += --no-print-directory - SHELL := /usr/bin/env bash diff --git a/package/kernel/mac80211/patches/015-ipw200-mtu.patch b/package/kernel/mac80211/patches/015-ipw200-mtu.patch deleted file mode 100644 index 8d273a095b..0000000000 --- a/package/kernel/mac80211/patches/015-ipw200-mtu.patch +++ /dev/null @@ -1,34 +0,0 @@ ---- a/drivers/net/wireless/intel/ipw2x00/ipw2200.c -+++ b/drivers/net/wireless/intel/ipw2x00/ipw2200.c -@@ -11506,6 +11506,15 @@ static const struct attribute_group ipw_ - .attrs = ipw_sysfs_entries, - }; - -+#if LINUX_VERSION_IS_LESS(4,10,0) -+static int __change_mtu(struct net_device *ndev, int new_mtu){ -+ if (new_mtu < 68 || new_mtu > LIBIPW_DATA_LEN) -+ return -EINVAL; -+ ndev->mtu = new_mtu; -+ return 0; -+} -+#endif -+ - #ifdef CPTCFG_IPW2200_PROMISCUOUS - static int ipw_prom_open(struct net_device *dev) - { -@@ -11554,15 +11563,6 @@ static netdev_tx_t ipw_prom_hard_start_x - return NETDEV_TX_OK; - } - --#if LINUX_VERSION_IS_LESS(4,10,0) --static int __change_mtu(struct net_device *ndev, int new_mtu){ -- if (new_mtu < 68 || new_mtu > LIBIPW_DATA_LEN) -- return -EINVAL; -- ndev->mtu = new_mtu; -- return 0; --} --#endif -- - static const struct net_device_ops ipw_prom_netdev_ops = { - #if LINUX_VERSION_IS_LESS(4,10,0) - .ndo_change_mtu = __change_mtu, diff --git a/package/kernel/mac80211/patches/020-01-rt2x00-avoid-introducing-a-USB-dependency-in-the-rt2.patch b/package/kernel/mac80211/patches/020-01-rt2x00-avoid-introducing-a-USB-dependency-in-the-rt2.patch new file mode 100644 index 0000000000..7e829faef6 --- /dev/null +++ b/package/kernel/mac80211/patches/020-01-rt2x00-avoid-introducing-a-USB-dependency-in-the-rt2.patch @@ -0,0 +1,85 @@ +From 6232c17438ed01f43665197db5a98a4a4f77ef47 Mon Sep 17 00:00:00 2001 +From: Stanislaw Gruszka +Date: Thu, 2 Feb 2017 10:57:40 +0100 +Subject: [PATCH 01/19] rt2x00: avoid introducing a USB dependency in the + rt2x00lib module + +As reported by Felix: + +Though protected by an ifdef, introducing an usb symbol dependency in +the rt2x00lib module is a major inconvenience for distributions that +package kernel modules split into individual packages. + +Get rid of this unnecessary dependency by calling the usb related +function from a more suitable place. + +Cc: Vishal Thanki +Reported-by: Felix Fietkau +Fixes: 8b4c0009313f ("rt2x00usb: Use usb anchor to manage URB") +Signed-off-by: Stanislaw Gruszka +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | 23 ++++++++--------------- + drivers/net/wireless/ralink/rt2x00/rt2x00usb.c | 5 +++++ + 2 files changed, 13 insertions(+), 15 deletions(-) + +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c +index 8fcbc8dc94c1..4b08007f93f7 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c +@@ -1436,21 +1436,6 @@ void rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev) + cancel_work_sync(&rt2x00dev->intf_work); + cancel_delayed_work_sync(&rt2x00dev->autowakeup_work); + cancel_work_sync(&rt2x00dev->sleep_work); +-#if IS_ENABLED(CPTCFG_RT2X00_LIB_USB) +- if (rt2x00_is_usb(rt2x00dev)) { +- usb_kill_anchored_urbs(rt2x00dev->anchor); +- hrtimer_cancel(&rt2x00dev->txstatus_timer); +- cancel_work_sync(&rt2x00dev->rxdone_work); +- cancel_work_sync(&rt2x00dev->txdone_work); +- } +-#endif +- if (rt2x00dev->workqueue) +- destroy_workqueue(rt2x00dev->workqueue); +- +- /* +- * Free the tx status fifo. +- */ +- kfifo_free(&rt2x00dev->txstatus_fifo); + + /* + * Kill the tx status tasklet. +@@ -1466,6 +1451,14 @@ void rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev) + */ + rt2x00lib_uninitialize(rt2x00dev); + ++ if (rt2x00dev->workqueue) ++ destroy_workqueue(rt2x00dev->workqueue); ++ ++ /* ++ * Free the tx status fifo. ++ */ ++ kfifo_free(&rt2x00dev->txstatus_fifo); ++ + /* + * Free extra components + */ +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c +index 838ca58d2dd6..5a2bf9f63cd7 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c +@@ -744,6 +744,11 @@ void rt2x00usb_uninitialize(struct rt2x00_dev *rt2x00dev) + { + struct data_queue *queue; + ++ usb_kill_anchored_urbs(rt2x00dev->anchor); ++ hrtimer_cancel(&rt2x00dev->txstatus_timer); ++ cancel_work_sync(&rt2x00dev->rxdone_work); ++ cancel_work_sync(&rt2x00dev->txdone_work); ++ + queue_for_each(rt2x00dev, queue) + rt2x00usb_free_entries(queue); + } +-- +2.12.1 + diff --git a/package/kernel/mac80211/patches/020-02-rt2x00usb-do-not-anchor-rx-and-tx-urb-s.patch b/package/kernel/mac80211/patches/020-02-rt2x00usb-do-not-anchor-rx-and-tx-urb-s.patch new file mode 100644 index 0000000000..6510b55c79 --- /dev/null +++ b/package/kernel/mac80211/patches/020-02-rt2x00usb-do-not-anchor-rx-and-tx-urb-s.patch @@ -0,0 +1,61 @@ +From 93c7018ec16bb83399dd4db61c361a6d6aba0d5a Mon Sep 17 00:00:00 2001 +From: Stanislaw Gruszka +Date: Wed, 8 Feb 2017 12:18:09 +0100 +Subject: [PATCH 02/19] rt2x00usb: do not anchor rx and tx urb's + +We might kill TX or RX urb during rt2x00usb_flush_entry(), what can +cause anchor list corruption like shown below: + +[ 2074.035633] WARNING: CPU: 2 PID: 14480 at lib/list_debug.c:33 __list_add+0xac/0xc0 +[ 2074.035634] list_add corruption. prev->next should be next (ffff88020f362c28), but was dead000000000100. (prev=ffff8801d161bb70). + +[ 2074.035670] Call Trace: +[ 2074.035672] [] dump_stack+0x63/0x8c +[ 2074.035674] [] __warn+0xd1/0xf0 +[ 2074.035676] [] warn_slowpath_fmt+0x5f/0x80 +[ 2074.035678] [] ? rt2x00usb_register_write_lock+0x3d/0x60 [rt2800usb] +[ 2074.035679] [] __list_add+0xac/0xc0 +[ 2074.035681] [] usb_anchor_urb+0x4c/0xa0 +[ 2074.035683] [] rt2x00usb_kick_rx_entry+0xaf/0x100 [rt2x00usb] +[ 2074.035684] [] rt2x00usb_clear_entry+0x22/0x30 [rt2x00usb] + +To fix do not anchor TX and RX urb's, it is not needed as during +shutdown we kill those urbs in rt2x00usb_free_entries(). + +Cc: Vishal Thanki +Fixes: 8b4c0009313f ("rt2x00usb: Use usb anchor to manage URB") +Signed-off-by: Stanislaw Gruszka +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/ralink/rt2x00/rt2x00usb.c | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c +index 5a2bf9f63cd7..fe13dd07cc2a 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c +@@ -319,10 +319,8 @@ static bool rt2x00usb_kick_tx_entry(struct queue_entry *entry, void *data) + entry->skb->data, length, + rt2x00usb_interrupt_txdone, entry); + +- usb_anchor_urb(entry_priv->urb, rt2x00dev->anchor); + status = usb_submit_urb(entry_priv->urb, GFP_ATOMIC); + if (status) { +- usb_unanchor_urb(entry_priv->urb); + if (status == -ENODEV) + clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags); + set_bit(ENTRY_DATA_IO_FAILED, &entry->flags); +@@ -410,10 +408,8 @@ static bool rt2x00usb_kick_rx_entry(struct queue_entry *entry, void *data) + entry->skb->data, entry->skb->len, + rt2x00usb_interrupt_rxdone, entry); + +- usb_anchor_urb(entry_priv->urb, rt2x00dev->anchor); + status = usb_submit_urb(entry_priv->urb, GFP_ATOMIC); + if (status) { +- usb_unanchor_urb(entry_priv->urb); + if (status == -ENODEV) + clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags); + set_bit(ENTRY_DATA_IO_FAILED, &entry->flags); +-- +2.12.1 + diff --git a/package/kernel/mac80211/patches/020-03-rt2x00usb-fix-anchor-initialization.patch b/package/kernel/mac80211/patches/020-03-rt2x00usb-fix-anchor-initialization.patch new file mode 100644 index 0000000000..78d8ac63d8 --- /dev/null +++ b/package/kernel/mac80211/patches/020-03-rt2x00usb-fix-anchor-initialization.patch @@ -0,0 +1,75 @@ +From 0488a6121dfe6cbd44de15ea3627913b7549a1e9 Mon Sep 17 00:00:00 2001 +From: Stanislaw Gruszka +Date: Wed, 8 Feb 2017 12:18:10 +0100 +Subject: [PATCH 03/19] rt2x00usb: fix anchor initialization + +If device fail to initialize we can OOPS in rt2x00lib_remove_dev(), due +to using uninitialized usb_anchor structure: + +[ 855.435820] ieee80211 phy3: rt2x00usb_vendor_request: Error - Vendor Request 0x07 failed for offset 0x1000 with error -19 +[ 855.435826] ieee80211 phy3: rt2800_probe_rt: Error - Invalid RT chipset 0x0000, rev 0000 detected +[ 855.435829] ieee80211 phy3: rt2x00lib_probe_dev: Error - Failed to allocate device +[ 855.435845] BUG: unable to handle kernel NULL pointer dereference at 0000000000000028 +[ 855.435900] IP: _raw_spin_lock_irq+0xd/0x30 +[ 855.435926] PGD 0 +[ 855.435953] Oops: 0002 [#1] SMP + +[ 855.437011] Call Trace: +[ 855.437029] ? usb_kill_anchored_urbs+0x27/0xc0 +[ 855.437061] rt2x00lib_remove_dev+0x190/0x1c0 [rt2x00lib] +[ 855.437097] rt2x00lib_probe_dev+0x246/0x7a0 [rt2x00lib] +[ 855.437149] ? ieee80211_roc_setup+0x9e/0xd0 [mac80211] +[ 855.437183] ? __kmalloc+0x1af/0x1f0 +[ 855.437207] ? rt2x00usb_probe+0x13d/0xc50 [rt2x00usb] +[ 855.437240] rt2x00usb_probe+0x155/0xc50 [rt2x00usb] +[ 855.437273] rt2800usb_probe+0x15/0x20 [rt2800usb] +[ 855.437304] usb_probe_interface+0x159/0x2d0 +[ 855.437333] driver_probe_device+0x2bb/0x460 + +Patch changes initialization sequence to fix the problem. + +Cc: Vishal Thanki +Fixes: 8b4c0009313f ("rt2x00usb: Use usb anchor to manage URB") +Signed-off-by: Stanislaw Gruszka +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/ralink/rt2x00/rt2x00usb.c | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c +index fe13dd07cc2a..c696f0ad6a68 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c +@@ -825,10 +825,6 @@ int rt2x00usb_probe(struct usb_interface *usb_intf, + if (retval) + goto exit_free_device; + +- retval = rt2x00lib_probe_dev(rt2x00dev); +- if (retval) +- goto exit_free_reg; +- + rt2x00dev->anchor = devm_kmalloc(&usb_dev->dev, + sizeof(struct usb_anchor), + GFP_KERNEL); +@@ -836,10 +832,17 @@ int rt2x00usb_probe(struct usb_interface *usb_intf, + retval = -ENOMEM; + goto exit_free_reg; + } +- + init_usb_anchor(rt2x00dev->anchor); ++ ++ retval = rt2x00lib_probe_dev(rt2x00dev); ++ if (retval) ++ goto exit_free_anchor; ++ + return 0; + ++exit_free_anchor: ++ usb_kill_anchored_urbs(rt2x00dev->anchor); ++ + exit_free_reg: + rt2x00usb_free_reg(rt2x00dev); + +-- +2.12.1 + diff --git a/package/kernel/mac80211/patches/020-04-rt61pci-use-entry-directly.patch b/package/kernel/mac80211/patches/020-04-rt61pci-use-entry-directly.patch new file mode 100644 index 0000000000..d8f262af85 --- /dev/null +++ b/package/kernel/mac80211/patches/020-04-rt61pci-use-entry-directly.patch @@ -0,0 +1,28 @@ +From 80a97eae304631f57ff8560f87c0b18b95321443 Mon Sep 17 00:00:00 2001 +From: Stanislaw Gruszka +Date: Wed, 8 Feb 2017 13:51:29 +0100 +Subject: [PATCH 04/19] rt61pci: use entry directly + +Signed-off-by: Stanislaw Gruszka +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/ralink/rt2x00/rt61pci.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/drivers/net/wireless/ralink/rt2x00/rt61pci.c b/drivers/net/wireless/ralink/rt2x00/rt61pci.c +index 5306a3b2622d..8adb5f3abe15 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt61pci.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt61pci.c +@@ -1903,8 +1903,7 @@ static void rt61pci_write_tx_desc(struct queue_entry *entry, + + rt2x00_desc_read(txd, 5, &word); + rt2x00_set_field32(&word, TXD_W5_PID_TYPE, entry->queue->qid); +- rt2x00_set_field32(&word, TXD_W5_PID_SUBTYPE, +- skbdesc->entry->entry_idx); ++ rt2x00_set_field32(&word, TXD_W5_PID_SUBTYPE, entry->entry_idx); + rt2x00_set_field32(&word, TXD_W5_TX_POWER, + TXPOWER_TO_DEV(entry->queue->rt2x00dev->tx_power)); + rt2x00_set_field32(&word, TXD_W5_WAITING_DMA_DONE_INT, 1); +-- +2.12.1 + diff --git a/package/kernel/mac80211/patches/020-05-rt2x00-call-entry-directly-in-rt2x00_dump_frame.patch b/package/kernel/mac80211/patches/020-05-rt2x00-call-entry-directly-in-rt2x00_dump_frame.patch new file mode 100644 index 0000000000..04a5118103 --- /dev/null +++ b/package/kernel/mac80211/patches/020-05-rt2x00-call-entry-directly-in-rt2x00_dump_frame.patch @@ -0,0 +1,181 @@ +From 2ceb813798e1fd33e71a574771828c0f298e077b Mon Sep 17 00:00:00 2001 +From: Stanislaw Gruszka +Date: Wed, 8 Feb 2017 13:51:30 +0100 +Subject: [PATCH 05/19] rt2x00: call entry directly in rt2x00_dump_frame + +Signed-off-by: Stanislaw Gruszka +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/ralink/rt2x00/rt2400pci.c | 2 +- + drivers/net/wireless/ralink/rt2x00/rt2500pci.c | 2 +- + drivers/net/wireless/ralink/rt2x00/rt2500usb.c | 2 +- + drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 2 +- + drivers/net/wireless/ralink/rt2x00/rt2x00.h | 4 ++-- + drivers/net/wireless/ralink/rt2x00/rt2x00debug.c | 7 ++++--- + drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | 4 ++-- + drivers/net/wireless/ralink/rt2x00/rt2x00queue.c | 2 +- + drivers/net/wireless/ralink/rt2x00/rt61pci.c | 2 +- + drivers/net/wireless/ralink/rt2x00/rt73usb.c | 2 +- + 10 files changed, 15 insertions(+), 14 deletions(-) + +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2400pci.c b/drivers/net/wireless/ralink/rt2x00/rt2400pci.c +index 085c5b423bdf..19874439ac40 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2400pci.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2400pci.c +@@ -1200,7 +1200,7 @@ static void rt2400pci_write_beacon(struct queue_entry *entry, + /* + * Dump beacon to userspace through debugfs. + */ +- rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_BEACON, entry->skb); ++ rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_BEACON, entry); + out: + /* + * Enable beaconing again. +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2500pci.c b/drivers/net/wireless/ralink/rt2x00/rt2500pci.c +index 9832fd50c793..791434de8052 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2500pci.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2500pci.c +@@ -1349,7 +1349,7 @@ static void rt2500pci_write_beacon(struct queue_entry *entry, + /* + * Dump beacon to userspace through debugfs. + */ +- rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_BEACON, entry->skb); ++ rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_BEACON, entry); + out: + /* + * Enable beaconing again. +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2500usb.c b/drivers/net/wireless/ralink/rt2x00/rt2500usb.c +index cd3ab5a9e98d..62357465fe29 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2500usb.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2500usb.c +@@ -1170,7 +1170,7 @@ static void rt2500usb_write_beacon(struct queue_entry *entry, + /* + * Dump beacon to userspace through debugfs. + */ +- rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_BEACON, entry->skb); ++ rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_BEACON, entry); + + /* + * USB devices cannot blindly pass the skb->len as the +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +index 572cdea4ca25..8223a1520316 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +@@ -1014,7 +1014,7 @@ void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc) + /* + * Dump beacon to userspace through debugfs. + */ +- rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_BEACON, entry->skb); ++ rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_BEACON, entry); + + /* + * Write entire beacon with TXWI and padding to register. +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00.h b/drivers/net/wireless/ralink/rt2x00/rt2x00.h +index ea299c4e7ada..26869b3bef45 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h ++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h +@@ -1400,11 +1400,11 @@ void rt2x00queue_flush_queues(struct rt2x00_dev *rt2x00dev, bool drop); + */ + #ifdef CPTCFG_RT2X00_LIB_DEBUGFS + void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev, +- enum rt2x00_dump_type type, struct sk_buff *skb); ++ enum rt2x00_dump_type type, struct queue_entry *entry); + #else + static inline void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev, + enum rt2x00_dump_type type, +- struct sk_buff *skb) ++ struct queue_entry *entry) + { + } + #endif /* CPTCFG_RT2X00_LIB_DEBUGFS */ +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00debug.c b/drivers/net/wireless/ralink/rt2x00/rt2x00debug.c +index 72ae530e4a3b..964aefdc11f0 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2x00debug.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00debug.c +@@ -157,9 +157,10 @@ void rt2x00debug_update_crypto(struct rt2x00_dev *rt2x00dev, + } + + void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev, +- enum rt2x00_dump_type type, struct sk_buff *skb) ++ enum rt2x00_dump_type type, struct queue_entry *entry) + { + struct rt2x00debug_intf *intf = rt2x00dev->debugfs_intf; ++ struct sk_buff *skb = entry->skb; + struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb); + struct sk_buff *skbcopy; + struct rt2x00dump_hdr *dump_hdr; +@@ -196,8 +197,8 @@ void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev, + dump_hdr->chip_rf = cpu_to_le16(rt2x00dev->chip.rf); + dump_hdr->chip_rev = cpu_to_le16(rt2x00dev->chip.rev); + dump_hdr->type = cpu_to_le16(type); +- dump_hdr->queue_index = skbdesc->entry->queue->qid; +- dump_hdr->entry_index = skbdesc->entry->entry_idx; ++ dump_hdr->queue_index = entry->queue->qid; ++ dump_hdr->entry_index = entry->entry_idx; + dump_hdr->timestamp_sec = cpu_to_le32(timestamp.tv_sec); + dump_hdr->timestamp_usec = cpu_to_le32(timestamp.tv_usec); + +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c +index 4b08007f93f7..dd6678109b7e 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c +@@ -363,7 +363,7 @@ void rt2x00lib_txdone(struct queue_entry *entry, + * Send frame to debugfs immediately, after this call is completed + * we are going to overwrite the skb->cb array. + */ +- rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_TXDONE, entry->skb); ++ rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_TXDONE, entry); + + /* + * Determine if the frame has been successfully transmitted and +@@ -772,7 +772,7 @@ void rt2x00lib_rxdone(struct queue_entry *entry, gfp_t gfp) + */ + rt2x00link_update_stats(rt2x00dev, entry->skb, &rxdesc); + rt2x00debug_update_crypto(rt2x00dev, &rxdesc); +- rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_RXDONE, entry->skb); ++ rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_RXDONE, entry); + + /* + * Initialize RX status information, and send frame +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c +index b2364d378774..380daf4e1b8d 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c +@@ -544,7 +544,7 @@ static void rt2x00queue_write_tx_descriptor(struct queue_entry *entry, + * All processing on the frame has been completed, this means + * it is now ready to be dumped to userspace through debugfs. + */ +- rt2x00debug_dump_frame(queue->rt2x00dev, DUMP_FRAME_TX, entry->skb); ++ rt2x00debug_dump_frame(queue->rt2x00dev, DUMP_FRAME_TX, entry); + } + + static void rt2x00queue_kick_tx_queue(struct data_queue *queue, +diff --git a/drivers/net/wireless/ralink/rt2x00/rt61pci.c b/drivers/net/wireless/ralink/rt2x00/rt61pci.c +index 8adb5f3abe15..973d418b8113 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt61pci.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt61pci.c +@@ -1988,7 +1988,7 @@ static void rt61pci_write_beacon(struct queue_entry *entry, + /* + * Dump beacon to userspace through debugfs. + */ +- rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_BEACON, entry->skb); ++ rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_BEACON, entry); + + /* + * Write entire beacon with descriptor and padding to register. +diff --git a/drivers/net/wireless/ralink/rt2x00/rt73usb.c b/drivers/net/wireless/ralink/rt2x00/rt73usb.c +index 1a29c4d205a5..bb8d307a789f 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt73usb.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt73usb.c +@@ -1557,7 +1557,7 @@ static void rt73usb_write_beacon(struct queue_entry *entry, + /* + * Dump beacon to userspace through debugfs. + */ +- rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_BEACON, entry->skb); ++ rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_BEACON, entry); + + /* + * Write entire beacon with descriptor and padding to register. +-- +2.12.1 + diff --git a/package/kernel/mac80211/patches/020-06-rt2x00-remove-queue_entry-from-skbdesc.patch b/package/kernel/mac80211/patches/020-06-rt2x00-remove-queue_entry-from-skbdesc.patch new file mode 100644 index 0000000000..d8194acd23 --- /dev/null +++ b/package/kernel/mac80211/patches/020-06-rt2x00-remove-queue_entry-from-skbdesc.patch @@ -0,0 +1,59 @@ +From cf81db30a6edcca791b1bfa5348a162471121d11 Mon Sep 17 00:00:00 2001 +From: Stanislaw Gruszka +Date: Wed, 8 Feb 2017 13:51:31 +0100 +Subject: [PATCH 06/19] rt2x00: remove queue_entry from skbdesc + +queue_entry field of skbdesc is not read any more, remove it to allow +skbdesc contain other data. + +Signed-off-by: Stanislaw Gruszka +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/ralink/rt2x00/rt2x00queue.c | 3 --- + drivers/net/wireless/ralink/rt2x00/rt2x00queue.h | 2 -- + 2 files changed, 5 deletions(-) + +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c +index 380daf4e1b8d..e1660b92b20c 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c +@@ -83,7 +83,6 @@ struct sk_buff *rt2x00queue_alloc_rxskb(struct queue_entry *entry, gfp_t gfp) + */ + skbdesc = get_skb_frame_desc(skb); + memset(skbdesc, 0, sizeof(*skbdesc)); +- skbdesc->entry = entry; + + if (rt2x00_has_cap_flag(rt2x00dev, REQUIRE_DMA)) { + dma_addr_t skb_dma; +@@ -689,7 +688,6 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, + goto out; + } + +- skbdesc->entry = entry; + entry->skb = skb; + + /* +@@ -774,7 +772,6 @@ int rt2x00queue_update_beacon(struct rt2x00_dev *rt2x00dev, + */ + skbdesc = get_skb_frame_desc(intf->beacon->skb); + memset(skbdesc, 0, sizeof(*skbdesc)); +- skbdesc->entry = intf->beacon; + + /* + * Send beacon to hardware. +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h +index 2233b911a1d7..22d18818e850 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h ++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h +@@ -116,8 +116,6 @@ struct skb_frame_desc { + __le32 iv[2]; + + dma_addr_t skb_dma; +- +- struct queue_entry *entry; + }; + + /** +-- +2.12.1 + diff --git a/package/kernel/mac80211/patches/020-07-rt2500usb-don-t-mark-register-accesses-as-inline.patch b/package/kernel/mac80211/patches/020-07-rt2500usb-don-t-mark-register-accesses-as-inline.patch new file mode 100644 index 0000000000..a82886d234 --- /dev/null +++ b/package/kernel/mac80211/patches/020-07-rt2500usb-don-t-mark-register-accesses-as-inline.patch @@ -0,0 +1,84 @@ +From 7272416609126e8910b7f0d0e3dba008aa87830c Mon Sep 17 00:00:00 2001 +From: Arnd Bergmann +Date: Tue, 14 Feb 2017 22:28:33 +0100 +Subject: [PATCH 07/19] rt2500usb: don't mark register accesses as inline + +When CONFIG_KASAN is set, we get a rather large stack here: + +drivers/net/wireless/ralink/rt2x00/rt2500usb.c: In function 'rt2500usb_set_device_state': +drivers/net/wireless/ralink/rt2x00/rt2500usb.c:1074:1: error: the frame size of 3032 bytes is larger than 100 bytes [-Werror=frame-larger-than=] + +If we don't force those functions to be inline, the compiler can figure this +out better itself and not inline the functions when doing so would be harmful, +reducing the stack size to a merge 256 bytes. + +Note that there is another problem that manifests in this driver, as a result +of the typecheck() macro causing even larger stack frames. + +Signed-off-by: Arnd Bergmann +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/ralink/rt2x00/rt2500usb.c | 19 +++++-------------- + 1 file changed, 5 insertions(+), 14 deletions(-) + +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2500usb.c b/drivers/net/wireless/ralink/rt2x00/rt2500usb.c +index 62357465fe29..0d2670a56c4c 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2500usb.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2500usb.c +@@ -55,7 +55,7 @@ MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption."); + * If the csr_mutex is already held then the _lock variants must + * be used instead. + */ +-static inline void rt2500usb_register_read(struct rt2x00_dev *rt2x00dev, ++static void rt2500usb_register_read(struct rt2x00_dev *rt2x00dev, + const unsigned int offset, + u16 *value) + { +@@ -66,7 +66,7 @@ static inline void rt2500usb_register_read(struct rt2x00_dev *rt2x00dev, + *value = le16_to_cpu(reg); + } + +-static inline void rt2500usb_register_read_lock(struct rt2x00_dev *rt2x00dev, ++static void rt2500usb_register_read_lock(struct rt2x00_dev *rt2x00dev, + const unsigned int offset, + u16 *value) + { +@@ -77,16 +77,7 @@ static inline void rt2500usb_register_read_lock(struct rt2x00_dev *rt2x00dev, + *value = le16_to_cpu(reg); + } + +-static inline void rt2500usb_register_multiread(struct rt2x00_dev *rt2x00dev, +- const unsigned int offset, +- void *value, const u16 length) +-{ +- rt2x00usb_vendor_request_buff(rt2x00dev, USB_MULTI_READ, +- USB_VENDOR_REQUEST_IN, offset, +- value, length); +-} +- +-static inline void rt2500usb_register_write(struct rt2x00_dev *rt2x00dev, ++static void rt2500usb_register_write(struct rt2x00_dev *rt2x00dev, + const unsigned int offset, + u16 value) + { +@@ -96,7 +87,7 @@ static inline void rt2500usb_register_write(struct rt2x00_dev *rt2x00dev, + ®, sizeof(reg)); + } + +-static inline void rt2500usb_register_write_lock(struct rt2x00_dev *rt2x00dev, ++static void rt2500usb_register_write_lock(struct rt2x00_dev *rt2x00dev, + const unsigned int offset, + u16 value) + { +@@ -106,7 +97,7 @@ static inline void rt2500usb_register_write_lock(struct rt2x00_dev *rt2x00dev, + ®, sizeof(reg), REGISTER_TIMEOUT); + } + +-static inline void rt2500usb_register_multiwrite(struct rt2x00_dev *rt2x00dev, ++static void rt2500usb_register_multiwrite(struct rt2x00_dev *rt2x00dev, + const unsigned int offset, + void *value, const u16 length) + { +-- +2.12.1 + diff --git a/package/kernel/mac80211/patches/020-08-rt2x00-rt2800lib-move-rt2800_drv_data-declaration-in.patch b/package/kernel/mac80211/patches/020-08-rt2x00-rt2800lib-move-rt2800_drv_data-declaration-in.patch new file mode 100644 index 0000000000..c2fa92641a --- /dev/null +++ b/package/kernel/mac80211/patches/020-08-rt2x00-rt2800lib-move-rt2800_drv_data-declaration-in.patch @@ -0,0 +1,94 @@ +From 96609f366c6f792421e1939c5c834abbe24eb88a Mon Sep 17 00:00:00 2001 +From: Gabor Juhos +Date: Wed, 15 Feb 2017 10:25:04 +0100 +Subject: [PATCH 08/19] rt2x00: rt2800lib: move rt2800_drv_data declaration + into rt2800lib.h + +The rt2800_drv_data structure contains driver specific +information. Move the declaration into the rt2800lib.h +header which is a more logical place for it. Also fix +the comment style to avoid checkpatch warning. + +The patch contains no functional changes, it is in +preparation for the next patch. + +Signed-off-by: Gabor Juhos +Signed-off-by: Daniel Golle +Signed-off-by: Stanislaw Gruszka +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/ralink/rt2x00/rt2800.h | 25 ------------------------- + drivers/net/wireless/ralink/rt2x00/rt2800lib.h | 23 +++++++++++++++++++++++ + 2 files changed, 23 insertions(+), 25 deletions(-) + +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h b/drivers/net/wireless/ralink/rt2x00/rt2800.h +index 256496bfbafb..0e7051d8132f 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h ++++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h +@@ -2987,29 +2987,4 @@ enum rt2800_eeprom_word { + */ + #define BCN_TBTT_OFFSET 64 + +-/* +- * Hardware has 255 WCID table entries. First 32 entries are reserved for +- * shared keys. Since parts of the pairwise key table might be shared with +- * the beacon frame buffers 6 & 7 we could only use the first 222 entries. +- */ +-#define WCID_START 33 +-#define WCID_END 222 +-#define STA_IDS_SIZE (WCID_END - WCID_START + 2) +- +-/* +- * RT2800 driver data structure +- */ +-struct rt2800_drv_data { +- u8 calibration_bw20; +- u8 calibration_bw40; +- u8 bbp25; +- u8 bbp26; +- u8 txmixer_gain_24g; +- u8 txmixer_gain_5g; +- u8 max_psdu; +- unsigned int tbtt_tick; +- unsigned int ampdu_factor_cnt[4]; +- DECLARE_BITMAP(sta_ids, STA_IDS_SIZE); +-}; +- + #endif /* RT2800_H */ +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h +index 0a8b4df665fe..8e1ae138c3f1 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h ++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h +@@ -20,6 +20,29 @@ + #ifndef RT2800LIB_H + #define RT2800LIB_H + ++/* ++ * Hardware has 255 WCID table entries. First 32 entries are reserved for ++ * shared keys. Since parts of the pairwise key table might be shared with ++ * the beacon frame buffers 6 & 7 we could only use the first 222 entries. ++ */ ++#define WCID_START 33 ++#define WCID_END 222 ++#define STA_IDS_SIZE (WCID_END - WCID_START + 2) ++ ++/* RT2800 driver data structure */ ++struct rt2800_drv_data { ++ u8 calibration_bw20; ++ u8 calibration_bw40; ++ u8 bbp25; ++ u8 bbp26; ++ u8 txmixer_gain_24g; ++ u8 txmixer_gain_5g; ++ u8 max_psdu; ++ unsigned int tbtt_tick; ++ unsigned int ampdu_factor_cnt[4]; ++ DECLARE_BITMAP(sta_ids, STA_IDS_SIZE); ++}; ++ + struct rt2800_ops { + void (*register_read)(struct rt2x00_dev *rt2x00dev, + const unsigned int offset, u32 *value); +-- +2.12.1 + diff --git a/package/kernel/mac80211/patches/020-09-rt2800-identify-station-based-on-status-WCID.patch b/package/kernel/mac80211/patches/020-09-rt2800-identify-station-based-on-status-WCID.patch new file mode 100644 index 0000000000..e6c829cbf8 --- /dev/null +++ b/package/kernel/mac80211/patches/020-09-rt2800-identify-station-based-on-status-WCID.patch @@ -0,0 +1,94 @@ +From a13d985f26f6df07d5c5c0e190477628e236babc Mon Sep 17 00:00:00 2001 +From: Stanislaw Gruszka +Date: Wed, 15 Feb 2017 10:25:05 +0100 +Subject: [PATCH 09/19] rt2800: identify station based on status WCID + +Add framework to identify sta based on tx status WCID. This is currently +not used, will start be utilized in the future patch. + +Signed-off-by: Stanislaw Gruszka +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 5 +++++ + drivers/net/wireless/ralink/rt2x00/rt2800lib.h | 1 + + drivers/net/wireless/ralink/rt2x00/rt2x00queue.h | 3 ++- + 3 files changed, 8 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +index 8223a1520316..46405cce35e0 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +@@ -855,11 +855,13 @@ EXPORT_SYMBOL_GPL(rt2800_process_rxwi); + void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi) + { + struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; ++ struct rt2800_drv_data *drv_data = rt2x00dev->drv_data; + struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); + struct txdone_entry_desc txdesc; + u32 word; + u16 mcs, real_mcs; + int aggr, ampdu; ++ int wcid; + + /* + * Obtain the status about this packet. +@@ -872,6 +874,7 @@ void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi) + + real_mcs = rt2x00_get_field32(status, TX_STA_FIFO_MCS); + aggr = rt2x00_get_field32(status, TX_STA_FIFO_TX_AGGRE); ++ wcid = rt2x00_get_field32(status, TX_STA_FIFO_WCID); + + /* + * If a frame was meant to be sent as a single non-aggregated MPDU +@@ -1468,6 +1471,7 @@ int rt2800_sta_add(struct rt2x00_dev *rt2x00dev, struct ieee80211_vif *vif, + return 0; + + __set_bit(wcid - WCID_START, drv_data->sta_ids); ++ drv_data->wcid_to_sta[wcid - WCID_START] = sta; + + /* + * Clean up WCID attributes and write STA address to the device. +@@ -1498,6 +1502,7 @@ int rt2800_sta_remove(struct rt2x00_dev *rt2x00dev, struct ieee80211_sta *sta) + * get renewed when the WCID is reused. + */ + rt2800_config_wcid(rt2x00dev, NULL, wcid); ++ drv_data->wcid_to_sta[wcid - WCID_START] = NULL; + __clear_bit(wcid - WCID_START, drv_data->sta_ids); + + return 0; +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h +index 8e1ae138c3f1..6811d677a6e7 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h ++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h +@@ -41,6 +41,7 @@ struct rt2800_drv_data { + unsigned int tbtt_tick; + unsigned int ampdu_factor_cnt[4]; + DECLARE_BITMAP(sta_ids, STA_IDS_SIZE); ++ struct ieee80211_sta *wcid_to_sta[STA_IDS_SIZE]; + }; + + struct rt2800_ops { +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h +index 22d18818e850..9b297fce4692 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h ++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h +@@ -102,7 +102,7 @@ enum skb_frame_desc_flags { + * of the scope of the skb->data pointer. + * @iv: IV/EIV data used during encryption/decryption. + * @skb_dma: (PCI-only) the DMA address associated with the sk buffer. +- * @entry: The entry to which this sk buffer belongs. ++ * @sta: The station where sk buffer was sent. + */ + struct skb_frame_desc { + u8 flags; +@@ -116,6 +116,7 @@ struct skb_frame_desc { + __le32 iv[2]; + + dma_addr_t skb_dma; ++ struct ieee80211_sta *sta; + }; + + /** +-- +2.12.1 + diff --git a/package/kernel/mac80211/patches/020-10-rt2x00-separte-filling-tx-status-from-rt2x00lib_txdo.patch b/package/kernel/mac80211/patches/020-10-rt2x00-separte-filling-tx-status-from-rt2x00lib_txdo.patch new file mode 100644 index 0000000000..278d2d6071 --- /dev/null +++ b/package/kernel/mac80211/patches/020-10-rt2x00-separte-filling-tx-status-from-rt2x00lib_txdo.patch @@ -0,0 +1,178 @@ +From 5edb05afebba8f488a30db29550e55c42eea6d6a Mon Sep 17 00:00:00 2001 +From: Stanislaw Gruszka +Date: Wed, 15 Feb 2017 10:25:06 +0100 +Subject: [PATCH 10/19] rt2x00: separte filling tx status from rt2x00lib_txdone + +This makes rt2x00lib_txdone a bit simpler and will allow to reuse code +in different variant of txdone which I'm preparing. + +Signed-off-by: Stanislaw Gruszka +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | 141 +++++++++++++------------ + 1 file changed, 76 insertions(+), 65 deletions(-) + +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c +index dd6678109b7e..b5d90fefc96b 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c +@@ -313,73 +313,14 @@ static inline int rt2x00lib_txdone_bar_status(struct queue_entry *entry) + return ret; + } + +-void rt2x00lib_txdone(struct queue_entry *entry, +- struct txdone_entry_desc *txdesc) ++static void rt2x00lib_fill_tx_status(struct rt2x00_dev *rt2x00dev, ++ struct ieee80211_tx_info *tx_info, ++ struct skb_frame_desc *skbdesc, ++ struct txdone_entry_desc *txdesc, ++ bool success) + { +- struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; +- struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(entry->skb); +- struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); +- unsigned int header_length, i; + u8 rate_idx, rate_flags, retry_rates; +- u8 skbdesc_flags = skbdesc->flags; +- bool success; +- +- /* +- * Unmap the skb. +- */ +- rt2x00queue_unmap_skb(entry); +- +- /* +- * Remove the extra tx headroom from the skb. +- */ +- skb_pull(entry->skb, rt2x00dev->extra_tx_headroom); +- +- /* +- * Signal that the TX descriptor is no longer in the skb. +- */ +- skbdesc->flags &= ~SKBDESC_DESC_IN_SKB; +- +- /* +- * Determine the length of 802.11 header. +- */ +- header_length = ieee80211_get_hdrlen_from_skb(entry->skb); +- +- /* +- * Remove L2 padding which was added during +- */ +- if (rt2x00_has_cap_flag(rt2x00dev, REQUIRE_L2PAD)) +- rt2x00queue_remove_l2pad(entry->skb, header_length); +- +- /* +- * If the IV/EIV data was stripped from the frame before it was +- * passed to the hardware, we should now reinsert it again because +- * mac80211 will expect the same data to be present it the +- * frame as it was passed to us. +- */ +- if (rt2x00_has_cap_hw_crypto(rt2x00dev)) +- rt2x00crypto_tx_insert_iv(entry->skb, header_length); +- +- /* +- * Send frame to debugfs immediately, after this call is completed +- * we are going to overwrite the skb->cb array. +- */ +- rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_TXDONE, entry); +- +- /* +- * Determine if the frame has been successfully transmitted and +- * remove BARs from our check list while checking for their +- * TX status. +- */ +- success = +- rt2x00lib_txdone_bar_status(entry) || +- test_bit(TXDONE_SUCCESS, &txdesc->flags) || +- test_bit(TXDONE_UNKNOWN, &txdesc->flags); +- +- /* +- * Update TX statistics. +- */ +- rt2x00dev->link.qual.tx_success += success; +- rt2x00dev->link.qual.tx_failed += !success; ++ int i; + + rate_idx = skbdesc->tx_rate_idx; + rate_flags = skbdesc->tx_rate_flags; +@@ -448,6 +389,76 @@ void rt2x00lib_txdone(struct queue_entry *entry, + else + rt2x00dev->low_level_stats.dot11RTSFailureCount++; + } ++} ++ ++void rt2x00lib_txdone(struct queue_entry *entry, ++ struct txdone_entry_desc *txdesc) ++{ ++ struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; ++ struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(entry->skb); ++ struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); ++ u8 skbdesc_flags = skbdesc->flags; ++ unsigned int header_length; ++ bool success; ++ ++ /* ++ * Unmap the skb. ++ */ ++ rt2x00queue_unmap_skb(entry); ++ ++ /* ++ * Remove the extra tx headroom from the skb. ++ */ ++ skb_pull(entry->skb, rt2x00dev->extra_tx_headroom); ++ ++ /* ++ * Signal that the TX descriptor is no longer in the skb. ++ */ ++ skbdesc->flags &= ~SKBDESC_DESC_IN_SKB; ++ ++ /* ++ * Determine the length of 802.11 header. ++ */ ++ header_length = ieee80211_get_hdrlen_from_skb(entry->skb); ++ ++ /* ++ * Remove L2 padding which was added during ++ */ ++ if (rt2x00_has_cap_flag(rt2x00dev, REQUIRE_L2PAD)) ++ rt2x00queue_remove_l2pad(entry->skb, header_length); ++ ++ /* ++ * If the IV/EIV data was stripped from the frame before it was ++ * passed to the hardware, we should now reinsert it again because ++ * mac80211 will expect the same data to be present it the ++ * frame as it was passed to us. ++ */ ++ if (rt2x00_has_cap_hw_crypto(rt2x00dev)) ++ rt2x00crypto_tx_insert_iv(entry->skb, header_length); ++ ++ /* ++ * Send frame to debugfs immediately, after this call is completed ++ * we are going to overwrite the skb->cb array. ++ */ ++ rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_TXDONE, entry); ++ ++ /* ++ * Determine if the frame has been successfully transmitted and ++ * remove BARs from our check list while checking for their ++ * TX status. ++ */ ++ success = ++ rt2x00lib_txdone_bar_status(entry) || ++ test_bit(TXDONE_SUCCESS, &txdesc->flags) || ++ test_bit(TXDONE_UNKNOWN, &txdesc->flags); ++ ++ /* ++ * Update TX statistics. ++ */ ++ rt2x00dev->link.qual.tx_success += success; ++ rt2x00dev->link.qual.tx_failed += !success; ++ ++ rt2x00lib_fill_tx_status(rt2x00dev, tx_info, skbdesc, txdesc, success); + + /* + * Only send the status report to mac80211 when it's a frame +-- +2.12.1 + diff --git a/package/kernel/mac80211/patches/020-11-rt2x00-separte-clearing-entry-from-rt2x00lib_txdone.patch b/package/kernel/mac80211/patches/020-11-rt2x00-separte-clearing-entry-from-rt2x00lib_txdone.patch new file mode 100644 index 0000000000..b28d894fc6 --- /dev/null +++ b/package/kernel/mac80211/patches/020-11-rt2x00-separte-clearing-entry-from-rt2x00lib_txdone.patch @@ -0,0 +1,88 @@ +From 56646adf9cd60b488ddc5633a2d9aa1f30efa5db Mon Sep 17 00:00:00 2001 +From: Stanislaw Gruszka +Date: Wed, 15 Feb 2017 10:25:07 +0100 +Subject: [PATCH 11/19] rt2x00: separte clearing entry from rt2x00lib_txdone + +This makes rt2x00lib_txdone a bit simpler and will allow to reuse +code in different variant of txdone which I'm preparing. + +Signed-off-by: Stanislaw Gruszka +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | 51 +++++++++++++++----------- + 1 file changed, 29 insertions(+), 22 deletions(-) + +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c +index b5d90fefc96b..03b368ac9cb6 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c +@@ -391,6 +391,32 @@ static void rt2x00lib_fill_tx_status(struct rt2x00_dev *rt2x00dev, + } + } + ++static void rt2x00lib_clear_entry(struct rt2x00_dev *rt2x00dev, ++ struct queue_entry *entry) ++{ ++ /* ++ * Make this entry available for reuse. ++ */ ++ entry->skb = NULL; ++ entry->flags = 0; ++ ++ rt2x00dev->ops->lib->clear_entry(entry); ++ ++ rt2x00queue_index_inc(entry, Q_INDEX_DONE); ++ ++ /* ++ * If the data queue was below the threshold before the txdone ++ * handler we must make sure the packet queue in the mac80211 stack ++ * is reenabled when the txdone handler has finished. This has to be ++ * serialized with rt2x00mac_tx(), otherwise we can wake up queue ++ * before it was stopped. ++ */ ++ spin_lock_bh(&entry->queue->tx_lock); ++ if (!rt2x00queue_threshold(entry->queue)) ++ rt2x00queue_unpause_queue(entry->queue); ++ spin_unlock_bh(&entry->queue->tx_lock); ++} ++ + void rt2x00lib_txdone(struct queue_entry *entry, + struct txdone_entry_desc *txdesc) + { +@@ -471,30 +497,11 @@ void rt2x00lib_txdone(struct queue_entry *entry, + ieee80211_tx_status(rt2x00dev->hw, entry->skb); + else + ieee80211_tx_status_ni(rt2x00dev->hw, entry->skb); +- } else ++ } else { + dev_kfree_skb_any(entry->skb); ++ } + +- /* +- * Make this entry available for reuse. +- */ +- entry->skb = NULL; +- entry->flags = 0; +- +- rt2x00dev->ops->lib->clear_entry(entry); +- +- rt2x00queue_index_inc(entry, Q_INDEX_DONE); +- +- /* +- * If the data queue was below the threshold before the txdone +- * handler we must make sure the packet queue in the mac80211 stack +- * is reenabled when the txdone handler has finished. This has to be +- * serialized with rt2x00mac_tx(), otherwise we can wake up queue +- * before it was stopped. +- */ +- spin_lock_bh(&entry->queue->tx_lock); +- if (!rt2x00queue_threshold(entry->queue)) +- rt2x00queue_unpause_queue(entry->queue); +- spin_unlock_bh(&entry->queue->tx_lock); ++ rt2x00lib_clear_entry(rt2x00dev, entry); + } + EXPORT_SYMBOL_GPL(rt2x00lib_txdone); + +-- +2.12.1 + diff --git a/package/kernel/mac80211/patches/020-12-rt2x00-add-txdone-nomatch-function.patch b/package/kernel/mac80211/patches/020-12-rt2x00-add-txdone-nomatch-function.patch new file mode 100644 index 0000000000..7bec546a9e --- /dev/null +++ b/package/kernel/mac80211/patches/020-12-rt2x00-add-txdone-nomatch-function.patch @@ -0,0 +1,92 @@ +From a09305d052166cb489402a63a5d275e954e0b923 Mon Sep 17 00:00:00 2001 +From: Stanislaw Gruszka +Date: Wed, 15 Feb 2017 10:25:08 +0100 +Subject: [PATCH 12/19] rt2x00: add txdone nomatch function + +This txdone nomatch function will be used when we get status from the HW, +but we could not match it with any sent skb. + +Signed-off-by: Stanislaw Gruszka +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/ralink/rt2x00/rt2x00.h | 2 ++ + drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | 50 ++++++++++++++++++++++++++ + 2 files changed, 52 insertions(+) + +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00.h b/drivers/net/wireless/ralink/rt2x00/rt2x00.h +index 340787894c69..91ba10fdf732 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h ++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h +@@ -1425,6 +1425,8 @@ void rt2x00lib_dmastart(struct queue_entry *entry); + void rt2x00lib_dmadone(struct queue_entry *entry); + void rt2x00lib_txdone(struct queue_entry *entry, + struct txdone_entry_desc *txdesc); ++void rt2x00lib_txdone_nomatch(struct queue_entry *entry, ++ struct txdone_entry_desc *txdesc); + void rt2x00lib_txdone_noinfo(struct queue_entry *entry, u32 status); + void rt2x00lib_rxdone(struct queue_entry *entry, gfp_t gfp); + +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c +index 03b368ac9cb6..90fc259fb5bc 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c +@@ -417,6 +417,56 @@ static void rt2x00lib_clear_entry(struct rt2x00_dev *rt2x00dev, + spin_unlock_bh(&entry->queue->tx_lock); + } + ++void rt2x00lib_txdone_nomatch(struct queue_entry *entry, ++ struct txdone_entry_desc *txdesc) ++{ ++ struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; ++ struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); ++ struct ieee80211_tx_info txinfo = {}; ++ bool success; ++ ++ /* ++ * Unmap the skb. ++ */ ++ rt2x00queue_unmap_skb(entry); ++ ++ /* ++ * Signal that the TX descriptor is no longer in the skb. ++ */ ++ skbdesc->flags &= ~SKBDESC_DESC_IN_SKB; ++ ++ /* ++ * Send frame to debugfs immediately, after this call is completed ++ * we are going to overwrite the skb->cb array. ++ */ ++ rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_TXDONE, entry); ++ ++ /* ++ * Determine if the frame has been successfully transmitted and ++ * remove BARs from our check list while checking for their ++ * TX status. ++ */ ++ success = ++ rt2x00lib_txdone_bar_status(entry) || ++ test_bit(TXDONE_SUCCESS, &txdesc->flags); ++ ++ if (!test_bit(TXDONE_UNKNOWN, &txdesc->flags)) { ++ /* ++ * Update TX statistics. ++ */ ++ rt2x00dev->link.qual.tx_success += success; ++ rt2x00dev->link.qual.tx_failed += !success; ++ ++ rt2x00lib_fill_tx_status(rt2x00dev, &txinfo, skbdesc, txdesc, ++ success); ++ ieee80211_tx_status_noskb(rt2x00dev->hw, skbdesc->sta, &txinfo); ++ } ++ ++ dev_kfree_skb_any(entry->skb); ++ rt2x00lib_clear_entry(rt2x00dev, entry); ++} ++EXPORT_SYMBOL_GPL(rt2x00lib_txdone_nomatch); ++ + void rt2x00lib_txdone(struct queue_entry *entry, + struct txdone_entry_desc *txdesc) + { +-- +2.12.1 + diff --git a/package/kernel/mac80211/patches/020-13-rt2x00-fixup-fill_tx_status-for-nomatch-case.patch b/package/kernel/mac80211/patches/020-13-rt2x00-fixup-fill_tx_status-for-nomatch-case.patch new file mode 100644 index 0000000000..bb35f2d300 --- /dev/null +++ b/package/kernel/mac80211/patches/020-13-rt2x00-fixup-fill_tx_status-for-nomatch-case.patch @@ -0,0 +1,54 @@ +From ec80ad70d778af7665992672896633ebd3b02ac8 Mon Sep 17 00:00:00 2001 +From: Stanislaw Gruszka +Date: Wed, 15 Feb 2017 10:25:09 +0100 +Subject: [PATCH 13/19] rt2x00: fixup fill_tx_status for nomatch case + +Add bits rt2x00lib_fill_tx_status() when filling status in nomatch +case and hopefully do not break the function for existing cases. + +Signed-off-by: Stanislaw Gruszka +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | 6 +++++- + drivers/net/wireless/ralink/rt2x00/rt2x00queue.h | 1 + + 2 files changed, 6 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c +index 90fc259fb5bc..e95d2aad3b3f 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c +@@ -357,6 +357,9 @@ static void rt2x00lib_fill_tx_status(struct rt2x00_dev *rt2x00dev, + if (i < (IEEE80211_TX_MAX_RATES - 1)) + tx_info->status.rates[i].idx = -1; /* terminate */ + ++ if (test_bit(TXDONE_NO_ACK_REQ, &txdesc->flags)) ++ tx_info->flags |= IEEE80211_TX_CTL_NO_ACK; ++ + if (!(tx_info->flags & IEEE80211_TX_CTL_NO_ACK)) { + if (success) + tx_info->flags |= IEEE80211_TX_STAT_ACK; +@@ -375,7 +378,8 @@ static void rt2x00lib_fill_tx_status(struct rt2x00_dev *rt2x00dev, + */ + if (test_bit(TXDONE_AMPDU, &txdesc->flags) || + tx_info->flags & IEEE80211_TX_CTL_AMPDU) { +- tx_info->flags |= IEEE80211_TX_STAT_AMPDU; ++ tx_info->flags |= IEEE80211_TX_STAT_AMPDU | ++ IEEE80211_TX_CTL_AMPDU; + tx_info->status.ampdu_len = 1; + tx_info->status.ampdu_ack_len = success ? 1 : 0; + +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h +index 9b297fce4692..c78fb8c8838a 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h ++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h +@@ -215,6 +215,7 @@ enum txdone_entry_desc_flags { + TXDONE_FAILURE, + TXDONE_EXCESSIVE_RETRY, + TXDONE_AMPDU, ++ TXDONE_NO_ACK_REQ, + }; + + /** +-- +2.12.1 + diff --git a/package/kernel/mac80211/patches/020-14-rt2x00-use-txdone_nomatch-on-rt2800usb.patch b/package/kernel/mac80211/patches/020-14-rt2x00-use-txdone_nomatch-on-rt2800usb.patch new file mode 100644 index 0000000000..f4e4b8b075 --- /dev/null +++ b/package/kernel/mac80211/patches/020-14-rt2x00-use-txdone_nomatch-on-rt2800usb.patch @@ -0,0 +1,191 @@ +From 293dff78ee058ec1e0b90e05a803c512b6a2097f Mon Sep 17 00:00:00 2001 +From: Stanislaw Gruszka +Date: Wed, 15 Feb 2017 10:25:10 +0100 +Subject: [PATCH 14/19] rt2x00: use txdone_nomatch on rt2800usb + +If we do not match skb entry, provide tx status via nomatch procedure. + +Currently in that case we do rt2x00lib_txdone_noinfo(TXDONE_NOINFO), +which actually assume that entry->skb was posted without retries and +provide rate saved in skb desc as successful. Patch changed that to +rate read from TX_STAT_FIFO, however still do not provide correct +number of retries. + +On SoC/PCI devices we keep providing status via standard txdone +procedure, no change in those devices, though we should thing about it. + +Signed-off-by: Stanislaw Gruszka +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 31 ++++++++++++++++++++----- + drivers/net/wireless/ralink/rt2x00/rt2800lib.h | 3 ++- + drivers/net/wireless/ralink/rt2x00/rt2800mmio.c | 2 +- + drivers/net/wireless/ralink/rt2x00/rt2800usb.c | 18 ++++++-------- + 4 files changed, 35 insertions(+), 19 deletions(-) + +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +index 46405cce35e0..4a7bec708a13 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +@@ -852,7 +852,8 @@ void rt2800_process_rxwi(struct queue_entry *entry, + } + EXPORT_SYMBOL_GPL(rt2800_process_rxwi); + +-void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi) ++void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi, ++ bool match) + { + struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; + struct rt2800_drv_data *drv_data = rt2x00dev->drv_data; +@@ -860,8 +861,7 @@ void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi) + struct txdone_entry_desc txdesc; + u32 word; + u16 mcs, real_mcs; +- int aggr, ampdu; +- int wcid; ++ int aggr, ampdu, wcid, ack_req; + + /* + * Obtain the status about this packet. +@@ -875,6 +875,7 @@ void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi) + real_mcs = rt2x00_get_field32(status, TX_STA_FIFO_MCS); + aggr = rt2x00_get_field32(status, TX_STA_FIFO_TX_AGGRE); + wcid = rt2x00_get_field32(status, TX_STA_FIFO_WCID); ++ ack_req = rt2x00_get_field32(status, TX_STA_FIFO_TX_ACK_REQUIRED); + + /* + * If a frame was meant to be sent as a single non-aggregated MPDU +@@ -891,8 +892,12 @@ void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi) + * Hence, replace the requested rate with the real tx rate to not + * confuse the rate control algortihm by providing clearly wrong + * data. +- */ +- if (unlikely(aggr == 1 && ampdu == 0 && real_mcs != mcs)) { ++ * ++ * FIXME: if we do not find matching entry, we tell that frame was ++ * posted without any retries. We need to find a way to fix that ++ * and provide retry count. ++ */ ++ if (unlikely((aggr == 1 && ampdu == 0 && real_mcs != mcs)) || !match) { + skbdesc->tx_rate_idx = real_mcs; + mcs = real_mcs; + } +@@ -900,6 +905,9 @@ void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi) + if (aggr == 1 || ampdu == 1) + __set_bit(TXDONE_AMPDU, &txdesc.flags); + ++ if (!ack_req) ++ __set_bit(TXDONE_NO_ACK_REQ, &txdesc.flags); ++ + /* + * Ralink has a retry mechanism using a global fallback + * table. We setup this fallback table to try the immediate +@@ -931,7 +939,18 @@ void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi) + if (txdesc.retry) + __set_bit(TXDONE_FALLBACK, &txdesc.flags); + +- rt2x00lib_txdone(entry, &txdesc); ++ if (!match) { ++ /* RCU assures non-null sta will not be freed by mac80211. */ ++ rcu_read_lock(); ++ if (likely(wcid >= WCID_START && wcid <= WCID_END)) ++ skbdesc->sta = drv_data->wcid_to_sta[wcid - WCID_START]; ++ else ++ skbdesc->sta = NULL; ++ rt2x00lib_txdone_nomatch(entry, &txdesc); ++ rcu_read_unlock(); ++ } else { ++ rt2x00lib_txdone(entry, &txdesc); ++ } + } + EXPORT_SYMBOL_GPL(rt2800_txdone_entry); + +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h +index 6811d677a6e7..d9ef260d542a 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h ++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h +@@ -191,7 +191,8 @@ void rt2800_write_tx_data(struct queue_entry *entry, + struct txentry_desc *txdesc); + void rt2800_process_rxwi(struct queue_entry *entry, struct rxdone_entry_desc *txdesc); + +-void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32* txwi); ++void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi, ++ bool match); + + void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc); + void rt2800_clear_beacon(struct queue_entry *entry); +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c +index de4790b41be7..3ab3b5323897 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c +@@ -239,7 +239,7 @@ static bool rt2800mmio_txdone_release_entries(struct queue_entry *entry, + { + if (test_bit(ENTRY_DATA_STATUS_SET, &entry->flags)) { + rt2800_txdone_entry(entry, entry->status, +- rt2800mmio_get_txwi(entry)); ++ rt2800mmio_get_txwi(entry), true); + return false; + } + +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800usb.c b/drivers/net/wireless/ralink/rt2x00/rt2800usb.c +index 205a7b8ac8a7..f11e3f532a84 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2800usb.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2800usb.c +@@ -501,8 +501,7 @@ static int rt2800usb_get_tx_data_len(struct queue_entry *entry) + /* + * TX control handlers + */ +-static enum txdone_entry_desc_flags +-rt2800usb_txdone_entry_check(struct queue_entry *entry, u32 reg) ++static bool rt2800usb_txdone_entry_check(struct queue_entry *entry, u32 reg) + { + __le32 *txwi; + u32 word; +@@ -515,7 +514,7 @@ rt2800usb_txdone_entry_check(struct queue_entry *entry, u32 reg) + * frame. + */ + if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags)) +- return TXDONE_FAILURE; ++ return false; + + wcid = rt2x00_get_field32(reg, TX_STA_FIFO_WCID); + ack = rt2x00_get_field32(reg, TX_STA_FIFO_TX_ACK_REQUIRED); +@@ -537,10 +536,10 @@ rt2800usb_txdone_entry_check(struct queue_entry *entry, u32 reg) + rt2x00_dbg(entry->queue->rt2x00dev, + "TX status report missed for queue %d entry %d\n", + entry->queue->qid, entry->entry_idx); +- return TXDONE_UNKNOWN; ++ return false; + } + +- return TXDONE_SUCCESS; ++ return true; + } + + static void rt2800usb_txdone(struct rt2x00_dev *rt2x00dev) +@@ -549,7 +548,7 @@ static void rt2800usb_txdone(struct rt2x00_dev *rt2x00dev) + struct queue_entry *entry; + u32 reg; + u8 qid; +- enum txdone_entry_desc_flags done_status; ++ bool match; + + while (kfifo_get(&rt2x00dev->txstatus_fifo, ®)) { + /* +@@ -574,11 +573,8 @@ static void rt2800usb_txdone(struct rt2x00_dev *rt2x00dev) + break; + } + +- done_status = rt2800usb_txdone_entry_check(entry, reg); +- if (likely(done_status == TXDONE_SUCCESS)) +- rt2800_txdone_entry(entry, reg, rt2800usb_get_txwi(entry)); +- else +- rt2x00lib_txdone_noinfo(entry, done_status); ++ match = rt2800usb_txdone_entry_check(entry, reg); ++ rt2800_txdone_entry(entry, reg, rt2800usb_get_txwi(entry), match); + } + } + +-- +2.12.1 + diff --git a/package/kernel/mac80211/patches/020-15-rt2800-status-based-rate-flags-for-nomatch-case.patch b/package/kernel/mac80211/patches/020-15-rt2800-status-based-rate-flags-for-nomatch-case.patch new file mode 100644 index 0000000000..4e18dc8e2a --- /dev/null +++ b/package/kernel/mac80211/patches/020-15-rt2800-status-based-rate-flags-for-nomatch-case.patch @@ -0,0 +1,88 @@ +From 9d7a7a4d2b02bcd30fb5fe4270278212353cc332 Mon Sep 17 00:00:00 2001 +From: Stanislaw Gruszka +Date: Wed, 15 Feb 2017 10:25:11 +0100 +Subject: [PATCH 15/19] rt2800: status based rate flags for nomatch case + +We use skb_desc->tx_rate_flags from entry as rate[].flags even if +skb does not match status. Patch corrects flags and also fixes +mcs for legacy rates. + +rt2800_rate_from_status() is based on Felix's mt76 +mt76x2_mac_process_tx_rate() function. + +Signed-off-by: Stanislaw Gruszka +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/ralink/rt2x00/rt2800.h | 2 ++ + drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 35 +++++++++++++++++++++++++- + 2 files changed, 36 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h b/drivers/net/wireless/ralink/rt2x00/rt2800.h +index 0e7051d8132f..480b08601785 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h ++++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h +@@ -1760,6 +1760,8 @@ + #define TX_STA_FIFO_WCID FIELD32(0x0000ff00) + #define TX_STA_FIFO_SUCCESS_RATE FIELD32(0xffff0000) + #define TX_STA_FIFO_MCS FIELD32(0x007f0000) ++#define TX_STA_FIFO_BW FIELD32(0x00800000) ++#define TX_STA_FIFO_SGI FIELD32(0x01000000) + #define TX_STA_FIFO_PHYMODE FIELD32(0xc0000000) + + /* +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +index 4a7bec708a13..8d00c599e47a 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +@@ -852,6 +852,39 @@ void rt2800_process_rxwi(struct queue_entry *entry, + } + EXPORT_SYMBOL_GPL(rt2800_process_rxwi); + ++static void rt2800_rate_from_status(struct skb_frame_desc *skbdesc, ++ u32 status, enum nl80211_band band) ++{ ++ u8 flags = 0; ++ u8 idx = rt2x00_get_field32(status, TX_STA_FIFO_MCS); ++ ++ switch (rt2x00_get_field32(status, TX_STA_FIFO_PHYMODE)) { ++ case RATE_MODE_HT_GREENFIELD: ++ flags |= IEEE80211_TX_RC_GREEN_FIELD; ++ /* fall through */ ++ case RATE_MODE_HT_MIX: ++ flags |= IEEE80211_TX_RC_MCS; ++ break; ++ case RATE_MODE_OFDM: ++ if (band == NL80211_BAND_2GHZ) ++ idx += 4; ++ break; ++ case RATE_MODE_CCK: ++ if (idx >= 8) ++ idx -= 8; ++ break; ++ } ++ ++ if (rt2x00_get_field32(status, TX_STA_FIFO_BW)) ++ flags |= IEEE80211_TX_RC_40_MHZ_WIDTH; ++ ++ if (rt2x00_get_field32(status, TX_STA_FIFO_SGI)) ++ flags |= IEEE80211_TX_RC_SHORT_GI; ++ ++ skbdesc->tx_rate_idx = idx; ++ skbdesc->tx_rate_flags = flags; ++} ++ + void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi, + bool match) + { +@@ -898,7 +931,7 @@ void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi, + * and provide retry count. + */ + if (unlikely((aggr == 1 && ampdu == 0 && real_mcs != mcs)) || !match) { +- skbdesc->tx_rate_idx = real_mcs; ++ rt2800_rate_from_status(skbdesc, status, rt2x00dev->curr_band); + mcs = real_mcs; + } + +-- +2.12.1 + diff --git a/package/kernel/mac80211/patches/020-16-rt2800-use-TXOP_BACKOFF-for-probe-frames.patch b/package/kernel/mac80211/patches/020-16-rt2800-use-TXOP_BACKOFF-for-probe-frames.patch new file mode 100644 index 0000000000..31d79bb751 --- /dev/null +++ b/package/kernel/mac80211/patches/020-16-rt2800-use-TXOP_BACKOFF-for-probe-frames.patch @@ -0,0 +1,43 @@ +From fb47ada8dc3c30c8e7b415da155742b49536c61e Mon Sep 17 00:00:00 2001 +From: Stanislaw Gruszka +Date: Wed, 15 Feb 2017 10:25:12 +0100 +Subject: [PATCH 16/19] rt2800: use TXOP_BACKOFF for probe frames + +Even if we do not set AMPDU bit in TXWI, device still can aggregate +frame and send it with rate not corresponding to requested. That mean +we can do not sent probe frames with requested rate. To prevent that +use TXOP_BACKOFF for probe frames. + +Signed-off-by: Stanislaw Gruszka +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/ralink/rt2x00/rt2x00queue.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c +index e1660b92b20c..a2c1ca5c76d1 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c +@@ -372,15 +372,16 @@ static void rt2x00queue_create_tx_descriptor_ht(struct rt2x00_dev *rt2x00dev, + + /* + * Determine IFS values +- * - Use TXOP_BACKOFF for management frames except beacons ++ * - Use TXOP_BACKOFF for probe and management frames except beacons + * - Use TXOP_SIFS for fragment bursts + * - Use TXOP_HTTXOP for everything else + * + * Note: rt2800 devices won't use CTS protection (if used) + * for frames not transmitted with TXOP_HTTXOP + */ +- if (ieee80211_is_mgmt(hdr->frame_control) && +- !ieee80211_is_beacon(hdr->frame_control)) ++ if ((ieee80211_is_mgmt(hdr->frame_control) && ++ !ieee80211_is_beacon(hdr->frame_control)) || ++ (tx_info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE)) + txdesc->u.ht.txop = TXOP_BACKOFF; + else if (!(tx_info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT)) + txdesc->u.ht.txop = TXOP_SIFS; +-- +2.12.1 + diff --git a/package/kernel/mac80211/patches/020-17-rt2x00-fix-rt2x00debug_dump_frame-comment.patch b/package/kernel/mac80211/patches/020-17-rt2x00-fix-rt2x00debug_dump_frame-comment.patch new file mode 100644 index 0000000000..4e53092d12 --- /dev/null +++ b/package/kernel/mac80211/patches/020-17-rt2x00-fix-rt2x00debug_dump_frame-comment.patch @@ -0,0 +1,28 @@ +From dd35cc0896faff5ed9d22eac9ea4a1920e2eec0c Mon Sep 17 00:00:00 2001 +From: Stanislaw Gruszka +Date: Wed, 15 Feb 2017 10:25:13 +0100 +Subject: [PATCH 17/19] rt2x00: fix rt2x00debug_dump_frame comment + +Reported-by: Jeroen Roovers +Signed-off-by: Stanislaw Gruszka +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/ralink/rt2x00/rt2x00.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00.h b/drivers/net/wireless/ralink/rt2x00/rt2x00.h +index 91ba10fdf732..ce340bfd71a0 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h ++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h +@@ -1396,7 +1396,7 @@ void rt2x00queue_flush_queues(struct rt2x00_dev *rt2x00dev, bool drop); + * rt2x00debug_dump_frame - Dump a frame to userspace through debugfs. + * @rt2x00dev: Pointer to &struct rt2x00_dev. + * @type: The type of frame that is being dumped. +- * @skb: The skb containing the frame to be dumped. ++ * @entry: The queue entry containing the frame to be dumped. + */ + #ifdef CPTCFG_RT2X00_LIB_DEBUGFS + void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev, +-- +2.12.1 + diff --git a/package/kernel/mac80211/patches/020-18-rt2x00-fix-TX_PWR_CFG_4-register-definition.patch b/package/kernel/mac80211/patches/020-18-rt2x00-fix-TX_PWR_CFG_4-register-definition.patch new file mode 100644 index 0000000000..3cf342d690 --- /dev/null +++ b/package/kernel/mac80211/patches/020-18-rt2x00-fix-TX_PWR_CFG_4-register-definition.patch @@ -0,0 +1,37 @@ +From 5ce33b603063f36272fcfb1b4a5fde69f46eca88 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Thu, 9 Mar 2017 00:54:22 +0100 +Subject: [PATCH 18/19] rt2x00: fix TX_PWR_CFG_4 register definition + +Some of the macros used to describe the TX_PWR_CFG_4 register accidentally +refer to TX_PWR_CFG_3, probably a copy&paste error. Fix that. + +Signed-off-by: Daniel Golle +Acked-by: Stanislaw Gruszka +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/ralink/rt2x00/rt2800.h | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h b/drivers/net/wireless/ralink/rt2x00/rt2800.h +index 480b08601785..fd1dbd956bad 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h ++++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h +@@ -1171,10 +1171,10 @@ + #define TX_PWR_CFG_4_UKNOWN7 FIELD32(0x00000f00) + #define TX_PWR_CFG_4_UKNOWN8 FIELD32(0x0000f000) + /* bits for 3T devices */ +-#define TX_PWR_CFG_3_STBC4_CH0 FIELD32(0x0000000f) +-#define TX_PWR_CFG_3_STBC4_CH1 FIELD32(0x000000f0) +-#define TX_PWR_CFG_3_STBC6_CH0 FIELD32(0x00000f00) +-#define TX_PWR_CFG_3_STBC6_CH1 FIELD32(0x0000f000) ++#define TX_PWR_CFG_4_STBC4_CH0 FIELD32(0x0000000f) ++#define TX_PWR_CFG_4_STBC4_CH1 FIELD32(0x000000f0) ++#define TX_PWR_CFG_4_STBC6_CH0 FIELD32(0x00000f00) ++#define TX_PWR_CFG_4_STBC6_CH1 FIELD32(0x0000f000) + + /* + * TX_PIN_CFG: +-- +2.12.1 + diff --git a/package/kernel/mac80211/patches/020-19-rt2x00-add-support-for-MT7620.patch b/package/kernel/mac80211/patches/020-19-rt2x00-add-support-for-MT7620.patch new file mode 100644 index 0000000000..7b99312744 --- /dev/null +++ b/package/kernel/mac80211/patches/020-19-rt2x00-add-support-for-MT7620.patch @@ -0,0 +1,2077 @@ +From 41977e86c984fcdddb454a3d7887de5d47b5f530 Mon Sep 17 00:00:00 2001 +From: Roman Yeryomin +Date: Tue, 21 Mar 2017 00:43:00 +0100 +Subject: [PATCH 19/19] rt2x00: add support for MT7620 + +Basic support for MT7620 built-in wireless radio was added to +OpenWrt in r41441. It has seen some heavy cleaning and refactoring +since in order to match the Kernel's code quality standards. + +Signed-off-by: Roman Yeryomin +Signed-off-by: Daniel Golle +Acked-by: Stanislaw Gruszka +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/ralink/rt2x00/Kconfig | 2 +- + drivers/net/wireless/ralink/rt2x00/rt2800.h | 177 +++ + drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 1421 +++++++++++++++++++++++- + drivers/net/wireless/ralink/rt2x00/rt2800lib.h | 4 + + drivers/net/wireless/ralink/rt2x00/rt2x00.h | 1 + + 5 files changed, 1578 insertions(+), 27 deletions(-) + +diff --git a/drivers/net/wireless/ralink/rt2x00/Kconfig b/drivers/net/wireless/ralink/rt2x00/Kconfig +index de62f5dcb62f..a1d1cfe214d2 100644 +--- a/drivers/net/wireless/ralink/rt2x00/Kconfig ++++ b/drivers/net/wireless/ralink/rt2x00/Kconfig +@@ -210,7 +210,7 @@ endif + config RT2800SOC + tristate "Ralink WiSoC support" + depends on m +- depends on SOC_RT288X || SOC_RT305X ++ depends on SOC_RT288X || SOC_RT305X || SOC_MT7620 + select RT2X00_LIB_SOC + select RT2X00_LIB_MMIO + select RT2X00_LIB_CRYPTO +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h b/drivers/net/wireless/ralink/rt2x00/rt2800.h +index fd1dbd956bad..6a8c93fb6a43 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h ++++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h +@@ -79,6 +79,7 @@ + #define RF5372 0x5372 + #define RF5390 0x5390 + #define RF5392 0x5392 ++#define RF7620 0x7620 + + /* + * Chipset revisions. +@@ -639,6 +640,24 @@ + #define RF_CSR_CFG_BUSY FIELD32(0x00020000) + + /* ++ * MT7620 RF registers (reversed order) ++ */ ++#define RF_CSR_CFG_DATA_MT7620 FIELD32(0x0000ff00) ++#define RF_CSR_CFG_REGNUM_MT7620 FIELD32(0x03ff0000) ++#define RF_CSR_CFG_WRITE_MT7620 FIELD32(0x00000010) ++#define RF_CSR_CFG_BUSY_MT7620 FIELD32(0x00000001) ++ ++/* undocumented registers for calibration of new MAC */ ++#define RF_CONTROL0 0x0518 ++#define RF_BYPASS0 0x051c ++#define RF_CONTROL1 0x0520 ++#define RF_BYPASS1 0x0524 ++#define RF_CONTROL2 0x0528 ++#define RF_BYPASS2 0x052c ++#define RF_CONTROL3 0x0530 ++#define RF_BYPASS3 0x0534 ++ ++/* + * EFUSE_CSR: RT30x0 EEPROM + */ + #define EFUSE_CTRL 0x0580 +@@ -1022,6 +1041,16 @@ + #define AUTOWAKEUP_CFG_AUTOWAKE FIELD32(0x00008000) + + /* ++ * MIMO_PS_CFG: MIMO Power-save Configuration ++ */ ++#define MIMO_PS_CFG 0x1210 ++#define MIMO_PS_CFG_MMPS_BB_EN FIELD32(0x00000001) ++#define MIMO_PS_CFG_MMPS_RX_ANT_NUM FIELD32(0x00000006) ++#define MIMO_PS_CFG_MMPS_RF_EN FIELD32(0x00000008) ++#define MIMO_PS_CFG_RX_STBY_POL FIELD32(0x00000010) ++#define MIMO_PS_CFG_RX_RX_STBY0 FIELD32(0x00000020) ++ ++/* + * EDCA_AC0_CFG: + */ + #define EDCA_AC0_CFG 0x1300 +@@ -1095,6 +1124,12 @@ + #define TX_PWR_CFG_0_OFDM6_CH1 FIELD32(0x00f00000) + #define TX_PWR_CFG_0_OFDM12_CH0 FIELD32(0x0f000000) + #define TX_PWR_CFG_0_OFDM12_CH1 FIELD32(0xf0000000) ++/* bits for new 2T devices */ ++#define TX_PWR_CFG_0B_1MBS_2MBS FIELD32(0x000000ff) ++#define TX_PWR_CFG_0B_5MBS_11MBS FIELD32(0x0000ff00) ++#define TX_PWR_CFG_0B_6MBS_9MBS FIELD32(0x00ff0000) ++#define TX_PWR_CFG_0B_12MBS_18MBS FIELD32(0xff000000) ++ + + /* + * TX_PWR_CFG_1: +@@ -1117,6 +1152,11 @@ + #define TX_PWR_CFG_1_MCS0_CH1 FIELD32(0x00f00000) + #define TX_PWR_CFG_1_MCS2_CH0 FIELD32(0x0f000000) + #define TX_PWR_CFG_1_MCS2_CH1 FIELD32(0xf0000000) ++/* bits for new 2T devices */ ++#define TX_PWR_CFG_1B_24MBS_36MBS FIELD32(0x000000ff) ++#define TX_PWR_CFG_1B_48MBS FIELD32(0x0000ff00) ++#define TX_PWR_CFG_1B_MCS0_MCS1 FIELD32(0x00ff0000) ++#define TX_PWR_CFG_1B_MCS2_MCS3 FIELD32(0xff000000) + + /* + * TX_PWR_CFG_2: +@@ -1139,6 +1179,11 @@ + #define TX_PWR_CFG_2_MCS8_CH1 FIELD32(0x00f00000) + #define TX_PWR_CFG_2_MCS10_CH0 FIELD32(0x0f000000) + #define TX_PWR_CFG_2_MCS10_CH1 FIELD32(0xf0000000) ++/* bits for new 2T devices */ ++#define TX_PWR_CFG_2B_MCS4_MCS5 FIELD32(0x000000ff) ++#define TX_PWR_CFG_2B_MCS6_MCS7 FIELD32(0x0000ff00) ++#define TX_PWR_CFG_2B_MCS8_MCS9 FIELD32(0x00ff0000) ++#define TX_PWR_CFG_2B_MCS10_MCS11 FIELD32(0xff000000) + + /* + * TX_PWR_CFG_3: +@@ -1161,6 +1206,11 @@ + #define TX_PWR_CFG_3_STBC0_CH1 FIELD32(0x00f00000) + #define TX_PWR_CFG_3_STBC2_CH0 FIELD32(0x0f000000) + #define TX_PWR_CFG_3_STBC2_CH1 FIELD32(0xf0000000) ++/* bits for new 2T devices */ ++#define TX_PWR_CFG_3B_MCS12_MCS13 FIELD32(0x000000ff) ++#define TX_PWR_CFG_3B_MCS14 FIELD32(0x0000ff00) ++#define TX_PWR_CFG_3B_STBC_MCS0_MCS1 FIELD32(0x00ff0000) ++#define TX_PWR_CFG_3B_STBC_MCS2_MSC3 FIELD32(0xff000000) + + /* + * TX_PWR_CFG_4: +@@ -1175,6 +1225,9 @@ + #define TX_PWR_CFG_4_STBC4_CH1 FIELD32(0x000000f0) + #define TX_PWR_CFG_4_STBC6_CH0 FIELD32(0x00000f00) + #define TX_PWR_CFG_4_STBC6_CH1 FIELD32(0x0000f000) ++/* bits for new 2T devices */ ++#define TX_PWR_CFG_4B_STBC_MCS4_MCS5 FIELD32(0x000000ff) ++#define TX_PWR_CFG_4B_STBC_MCS6 FIELD32(0x0000ff00) + + /* + * TX_PIN_CFG: +@@ -1201,6 +1254,8 @@ + #define TX_PIN_CFG_RFTR_POL FIELD32(0x00020000) + #define TX_PIN_CFG_TRSW_EN FIELD32(0x00040000) + #define TX_PIN_CFG_TRSW_POL FIELD32(0x00080000) ++#define TX_PIN_CFG_RFRX_EN FIELD32(0x00100000) ++#define TX_PIN_CFG_RFRX_POL FIELD32(0x00200000) + #define TX_PIN_CFG_PA_PE_A2_EN FIELD32(0x01000000) + #define TX_PIN_CFG_PA_PE_G2_EN FIELD32(0x02000000) + #define TX_PIN_CFG_PA_PE_A2_POL FIELD32(0x04000000) +@@ -1547,6 +1602,95 @@ + #define TX_PWR_CFG_4_EXT_STBC4_CH2 FIELD32(0x0000000f) + #define TX_PWR_CFG_4_EXT_STBC6_CH2 FIELD32(0x00000f00) + ++/* TXn_RF_GAIN_CORRECT: RF Gain Correction for each RF_ALC[3:2] ++ * Unit: 0.1 dB, Range: -3.2 dB to 3.1 dB ++ */ ++#define TX0_RF_GAIN_CORRECT 0x13a0 ++#define TX0_RF_GAIN_CORRECT_GAIN_CORR_0 FIELD32(0x0000003f) ++#define TX0_RF_GAIN_CORRECT_GAIN_CORR_1 FIELD32(0x00003f00) ++#define TX0_RF_GAIN_CORRECT_GAIN_CORR_2 FIELD32(0x003f0000) ++#define TX0_RF_GAIN_CORRECT_GAIN_CORR_3 FIELD32(0x3f000000) ++ ++#define TX1_RF_GAIN_CORRECT 0x13a4 ++#define TX1_RF_GAIN_CORRECT_GAIN_CORR_0 FIELD32(0x0000003f) ++#define TX1_RF_GAIN_CORRECT_GAIN_CORR_1 FIELD32(0x00003f00) ++#define TX1_RF_GAIN_CORRECT_GAIN_CORR_2 FIELD32(0x003f0000) ++#define TX1_RF_GAIN_CORRECT_GAIN_CORR_3 FIELD32(0x3f000000) ++ ++/* TXn_RF_GAIN_ATTEN: TXn RF Gain Attenuation Level ++ * Format: 7-bit, signed value ++ * Unit: 0.5 dB, Range: -20 dB to -5 dB ++ */ ++#define TX0_RF_GAIN_ATTEN 0x13a8 ++#define TX0_RF_GAIN_ATTEN_LEVEL_0 FIELD32(0x0000007f) ++#define TX0_RF_GAIN_ATTEN_LEVEL_1 FIELD32(0x00007f00) ++#define TX0_RF_GAIN_ATTEN_LEVEL_2 FIELD32(0x007f0000) ++#define TX0_RF_GAIN_ATTEN_LEVEL_3 FIELD32(0x7f000000) ++#define TX1_RF_GAIN_ATTEN 0x13ac ++#define TX1_RF_GAIN_ATTEN_LEVEL_0 FIELD32(0x0000007f) ++#define TX1_RF_GAIN_ATTEN_LEVEL_1 FIELD32(0x00007f00) ++#define TX1_RF_GAIN_ATTEN_LEVEL_2 FIELD32(0x007f0000) ++#define TX1_RF_GAIN_ATTEN_LEVEL_3 FIELD32(0x7f000000) ++ ++/* TX_ALC_CFG_0: TX Automatic Level Control Configuration 0 ++ * TX_ALC_LIMIT_n: TXn upper limit ++ * TX_ALC_CH_INIT_n: TXn channel initial transmission gain ++ * Unit: 0.5 dB, Range: 0 to 23.5 dB ++ */ ++#define TX_ALC_CFG_0 0x13b0 ++#define TX_ALC_CFG_0_CH_INIT_0 FIELD32(0x0000003f) ++#define TX_ALC_CFG_0_CH_INIT_1 FIELD32(0x00003f00) ++#define TX_ALC_CFG_0_LIMIT_0 FIELD32(0x003f0000) ++#define TX_ALC_CFG_0_LIMIT_1 FIELD32(0x3f000000) ++ ++/* TX_ALC_CFG_1: TX Automatic Level Control Configuration 1 ++ * TX_TEMP_COMP: TX Power Temperature Compensation ++ * Unit: 0.5 dB, Range: -10 dB to 10 dB ++ * TXn_GAIN_FINE: TXn Gain Fine Adjustment ++ * Unit: 0.1 dB, Range: -0.8 dB to 0.7 dB ++ * RF_TOS_DLY: Sets the RF_TOS_EN assertion delay after ++ * deassertion of PA_PE. ++ * Unit: 0.25 usec ++ * TXn_RF_GAIN_ATTEN: TXn RF gain attentuation selector ++ * RF_TOS_TIMEOUT: time-out value for RF_TOS_ENABLE ++ * deassertion if RF_TOS_DONE is missing. ++ * Unit: 0.25 usec ++ * RF_TOS_ENABLE: TX offset calibration enable ++ * ROS_BUSY_EN: RX offset calibration busy enable ++ */ ++#define TX_ALC_CFG_1 0x13b4 ++#define TX_ALC_CFG_1_TX_TEMP_COMP FIELD32(0x0000003f) ++#define TX_ALC_CFG_1_TX0_GAIN_FINE FIELD32(0x00000f00) ++#define TX_ALC_CFG_1_TX1_GAIN_FINE FIELD32(0x0000f000) ++#define TX_ALC_CFG_1_RF_TOS_DLY FIELD32(0x00070000) ++#define TX_ALC_CFG_1_TX0_RF_GAIN_ATTEN FIELD32(0x00300000) ++#define TX_ALC_CFG_1_TX1_RF_GAIN_ATTEN FIELD32(0x00c00000) ++#define TX_ALC_CFG_1_RF_TOS_TIMEOUT FIELD32(0x3f000000) ++#define TX_ALC_CFG_1_RF_TOS_ENABLE FIELD32(0x40000000) ++#define TX_ALC_CFG_1_ROS_BUSY_EN FIELD32(0x80000000) ++ ++/* TXn_BB_GAIN_ATTEN: TXn RF Gain Attenuation Level ++ * Format: 5-bit signed values ++ * Unit: 0.5 dB, Range: -8 dB to 7 dB ++ */ ++#define TX0_BB_GAIN_ATTEN 0x13c0 ++#define TX0_BB_GAIN_ATTEN_LEVEL_0 FIELD32(0x0000001f) ++#define TX0_BB_GAIN_ATTEN_LEVEL_1 FIELD32(0x00001f00) ++#define TX0_BB_GAIN_ATTEN_LEVEL_2 FIELD32(0x001f0000) ++#define TX0_BB_GAIN_ATTEN_LEVEL_3 FIELD32(0x1f000000) ++#define TX1_BB_GAIN_ATTEN 0x13c4 ++#define TX1_BB_GAIN_ATTEN_LEVEL_0 FIELD32(0x0000001f) ++#define TX1_BB_GAIN_ATTEN_LEVEL_1 FIELD32(0x00001f00) ++#define TX1_BB_GAIN_ATTEN_LEVEL_2 FIELD32(0x001f0000) ++#define TX1_BB_GAIN_ATTEN_LEVEL_3 FIELD32(0x1f000000) ++ ++/* TX_ALC_VGA3: TX Automatic Level Correction Variable Gain Amplifier 3 */ ++#define TX_ALC_VGA3 0x13c8 ++#define TX_ALC_VGA3_TX0_ALC_VGA3 FIELD32(0x0000001f) ++#define TX_ALC_VGA3_TX1_ALC_VGA3 FIELD32(0x00001f00) ++#define TX_ALC_VGA3_TX0_ALC_VGA2 FIELD32(0x001f0000) ++#define TX_ALC_VGA3_TX1_ALC_VGA2 FIELD32(0x1f000000) ++ + /* TX_PWR_CFG_7 */ + #define TX_PWR_CFG_7 0x13d4 + #define TX_PWR_CFG_7_OFDM54_CH0 FIELD32(0x0000000f) +@@ -1555,6 +1699,10 @@ + #define TX_PWR_CFG_7_MCS7_CH0 FIELD32(0x000f0000) + #define TX_PWR_CFG_7_MCS7_CH1 FIELD32(0x00f00000) + #define TX_PWR_CFG_7_MCS7_CH2 FIELD32(0x0f000000) ++/* bits for new 2T devices */ ++#define TX_PWR_CFG_7B_54MBS FIELD32(0x000000ff) ++#define TX_PWR_CFG_7B_MCS7 FIELD32(0x00ff0000) ++ + + /* TX_PWR_CFG_8 */ + #define TX_PWR_CFG_8 0x13d8 +@@ -1564,12 +1712,17 @@ + #define TX_PWR_CFG_8_MCS23_CH0 FIELD32(0x000f0000) + #define TX_PWR_CFG_8_MCS23_CH1 FIELD32(0x00f00000) + #define TX_PWR_CFG_8_MCS23_CH2 FIELD32(0x0f000000) ++/* bits for new 2T devices */ ++#define TX_PWR_CFG_8B_MCS15 FIELD32(0x000000ff) ++ + + /* TX_PWR_CFG_9 */ + #define TX_PWR_CFG_9 0x13dc + #define TX_PWR_CFG_9_STBC7_CH0 FIELD32(0x0000000f) + #define TX_PWR_CFG_9_STBC7_CH1 FIELD32(0x000000f0) + #define TX_PWR_CFG_9_STBC7_CH2 FIELD32(0x00000f00) ++/* bits for new 2T devices */ ++#define TX_PWR_CFG_9B_STBC_MCS7 FIELD32(0x000000ff) + + /* + * RX_FILTER_CFG: RX configuration register. +@@ -2137,11 +2290,14 @@ struct mac_iveiv_entry { + #define RFCSR1_TX1_PD FIELD8(0x20) + #define RFCSR1_RX2_PD FIELD8(0x40) + #define RFCSR1_TX2_PD FIELD8(0x80) ++#define RFCSR1_TX2_EN_MT7620 FIELD8(0x02) + + /* + * RFCSR 2: + */ + #define RFCSR2_RESCAL_EN FIELD8(0x80) ++#define RFCSR2_RX2_EN_MT7620 FIELD8(0x02) ++#define RFCSR2_TX2_EN_MT7620 FIELD8(0x20) + + /* + * RFCSR 3: +@@ -2160,6 +2316,12 @@ struct mac_iveiv_entry { + #define RFCSR3_BIT5 FIELD8(0x20) + + /* ++ * RFCSR 4: ++ * VCOCAL_EN used by MT7620 ++ */ ++#define RFCSR4_VCOCAL_EN FIELD8(0x80) ++ ++/* + * FRCSR 5: + */ + #define RFCSR5_R1 FIELD8(0x0c) +@@ -2214,6 +2376,7 @@ struct mac_iveiv_entry { + */ + #define RFCSR13_TX_POWER FIELD8(0x1f) + #define RFCSR13_DR0 FIELD8(0xe0) ++#define RFCSR13_RDIV_MT7620 FIELD8(0x03) + + /* + * RFCSR 15: +@@ -2224,6 +2387,8 @@ struct mac_iveiv_entry { + * RFCSR 16: + */ + #define RFCSR16_TXMIXER_GAIN FIELD8(0x07) ++#define RFCSR16_RF_PLL_FREQ_SEL_MT7620 FIELD8(0x0F) ++#define RFCSR16_SDM_MODE_MT7620 FIELD8(0xE0) + + /* + * RFCSR 17: +@@ -2236,6 +2401,8 @@ struct mac_iveiv_entry { + /* RFCSR 18 */ + #define RFCSR18_XO_TUNE_BYPASS FIELD8(0x40) + ++/* RFCSR 19 */ ++#define RFCSR19_K FIELD8(0x03) + + /* + * RFCSR 20: +@@ -2246,11 +2413,14 @@ struct mac_iveiv_entry { + * RFCSR 21: + */ + #define RFCSR21_RX_LO2_EN FIELD8(0x08) ++#define RFCSR21_BIT1 FIELD8(0x01) ++#define RFCSR21_BIT8 FIELD8(0x80) + + /* + * RFCSR 22: + */ + #define RFCSR22_BASEBAND_LOOPBACK FIELD8(0x01) ++#define RFCSR22_FREQPLAN_D_MT7620 FIELD8(0x07) + + /* + * RFCSR 23: +@@ -2273,6 +2443,11 @@ struct mac_iveiv_entry { + #define RFCSR27_R4 FIELD8(0x40) + + /* ++ * RFCSR 28: ++ */ ++#define RFCSR28_CH11_HT40 FIELD8(0x04) ++ ++/* + * RFCSR 29: + */ + #define RFCSR29_ADC6_TEST FIELD8(0x01) +@@ -2333,6 +2508,7 @@ struct mac_iveiv_entry { + */ + #define RFCSR42_BIT1 FIELD8(0x01) + #define RFCSR42_BIT4 FIELD8(0x08) ++#define RFCSR42_TX2_EN_MT7620 FIELD8(0x40) + + /* + * RFCSR 49: +@@ -2435,6 +2611,7 @@ enum rt2800_eeprom_word { + EEPROM_TSSI_BOUND_BG5, + EEPROM_TXPOWER_A1, + EEPROM_TXPOWER_A2, ++ EEPROM_TXPOWER_INIT, + EEPROM_TSSI_BOUND_A1, + EEPROM_TSSI_BOUND_A2, + EEPROM_TSSI_BOUND_A3, +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +index 8d00c599e47a..201b12ed90c6 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +@@ -59,6 +59,9 @@ + rt2800_regbusy_read((__dev), BBP_CSR_CFG, BBP_CSR_CFG_BUSY, (__reg)) + #define WAIT_FOR_RFCSR(__dev, __reg) \ + rt2800_regbusy_read((__dev), RF_CSR_CFG, RF_CSR_CFG_BUSY, (__reg)) ++#define WAIT_FOR_RFCSR_MT7620(__dev, __reg) \ ++ rt2800_regbusy_read((__dev), RF_CSR_CFG, RF_CSR_CFG_BUSY_MT7620, \ ++ (__reg)) + #define WAIT_FOR_RF(__dev, __reg) \ + rt2800_regbusy_read((__dev), RF_CSR_CFG0, RF_CSR_CFG0_BUSY, (__reg)) + #define WAIT_FOR_MCU(__dev, __reg) \ +@@ -150,19 +153,56 @@ static void rt2800_rfcsr_write(struct rt2x00_dev *rt2x00dev, + * Wait until the RFCSR becomes available, afterwards we + * can safely write the new data into the register. + */ +- if (WAIT_FOR_RFCSR(rt2x00dev, ®)) { +- reg = 0; +- rt2x00_set_field32(®, RF_CSR_CFG_DATA, value); +- rt2x00_set_field32(®, RF_CSR_CFG_REGNUM, word); +- rt2x00_set_field32(®, RF_CSR_CFG_WRITE, 1); +- rt2x00_set_field32(®, RF_CSR_CFG_BUSY, 1); ++ switch (rt2x00dev->chip.rt) { ++ case RT6352: ++ if (WAIT_FOR_RFCSR_MT7620(rt2x00dev, ®)) { ++ reg = 0; ++ rt2x00_set_field32(®, RF_CSR_CFG_DATA_MT7620, value); ++ rt2x00_set_field32(®, RF_CSR_CFG_REGNUM_MT7620, ++ word); ++ rt2x00_set_field32(®, RF_CSR_CFG_WRITE_MT7620, 1); ++ rt2x00_set_field32(®, RF_CSR_CFG_BUSY_MT7620, 1); ++ ++ rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg); ++ } ++ break; + +- rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg); ++ default: ++ if (WAIT_FOR_RFCSR(rt2x00dev, ®)) { ++ reg = 0; ++ rt2x00_set_field32(®, RF_CSR_CFG_DATA, value); ++ rt2x00_set_field32(®, RF_CSR_CFG_REGNUM, word); ++ rt2x00_set_field32(®, RF_CSR_CFG_WRITE, 1); ++ rt2x00_set_field32(®, RF_CSR_CFG_BUSY, 1); ++ ++ rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg); ++ } ++ break; + } + + mutex_unlock(&rt2x00dev->csr_mutex); + } + ++static void rt2800_rfcsr_write_bank(struct rt2x00_dev *rt2x00dev, const u8 bank, ++ const unsigned int reg, const u8 value) ++{ ++ rt2800_rfcsr_write(rt2x00dev, (reg | (bank << 6)), value); ++} ++ ++static void rt2800_rfcsr_write_chanreg(struct rt2x00_dev *rt2x00dev, ++ const unsigned int reg, const u8 value) ++{ ++ rt2800_rfcsr_write_bank(rt2x00dev, 4, reg, value); ++ rt2800_rfcsr_write_bank(rt2x00dev, 6, reg, value); ++} ++ ++static void rt2800_rfcsr_write_dccal(struct rt2x00_dev *rt2x00dev, ++ const unsigned int reg, const u8 value) ++{ ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, reg, value); ++ rt2800_rfcsr_write_bank(rt2x00dev, 7, reg, value); ++} ++ + static void rt2800_rfcsr_read(struct rt2x00_dev *rt2x00dev, + const unsigned int word, u8 *value) + { +@@ -178,22 +218,48 @@ static void rt2800_rfcsr_read(struct rt2x00_dev *rt2x00dev, + * doesn't become available in time, reg will be 0xffffffff + * which means we return 0xff to the caller. + */ +- if (WAIT_FOR_RFCSR(rt2x00dev, ®)) { +- reg = 0; +- rt2x00_set_field32(®, RF_CSR_CFG_REGNUM, word); +- rt2x00_set_field32(®, RF_CSR_CFG_WRITE, 0); +- rt2x00_set_field32(®, RF_CSR_CFG_BUSY, 1); ++ switch (rt2x00dev->chip.rt) { ++ case RT6352: ++ if (WAIT_FOR_RFCSR_MT7620(rt2x00dev, ®)) { ++ reg = 0; ++ rt2x00_set_field32(®, RF_CSR_CFG_REGNUM_MT7620, ++ word); ++ rt2x00_set_field32(®, RF_CSR_CFG_WRITE_MT7620, 0); ++ rt2x00_set_field32(®, RF_CSR_CFG_BUSY_MT7620, 1); + +- rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg); ++ rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg); + +- WAIT_FOR_RFCSR(rt2x00dev, ®); +- } ++ WAIT_FOR_RFCSR_MT7620(rt2x00dev, ®); ++ } + +- *value = rt2x00_get_field32(reg, RF_CSR_CFG_DATA); ++ *value = rt2x00_get_field32(reg, RF_CSR_CFG_DATA_MT7620); ++ break; ++ ++ default: ++ if (WAIT_FOR_RFCSR(rt2x00dev, ®)) { ++ reg = 0; ++ rt2x00_set_field32(®, RF_CSR_CFG_REGNUM, word); ++ rt2x00_set_field32(®, RF_CSR_CFG_WRITE, 0); ++ rt2x00_set_field32(®, RF_CSR_CFG_BUSY, 1); ++ ++ rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg); ++ ++ WAIT_FOR_RFCSR(rt2x00dev, ®); ++ } ++ ++ *value = rt2x00_get_field32(reg, RF_CSR_CFG_DATA); ++ break; ++ } + + mutex_unlock(&rt2x00dev->csr_mutex); + } + ++static void rt2800_rfcsr_read_bank(struct rt2x00_dev *rt2x00dev, const u8 bank, ++ const unsigned int reg, u8 *value) ++{ ++ rt2800_rfcsr_read(rt2x00dev, (reg | (bank << 6)), value); ++} ++ + static void rt2800_rf_write(struct rt2x00_dev *rt2x00dev, + const unsigned int word, const u32 value) + { +@@ -250,6 +316,7 @@ static const unsigned int rt2800_eeprom_map[EEPROM_WORD_COUNT] = { + [EEPROM_TSSI_BOUND_BG5] = 0x003b, + [EEPROM_TXPOWER_A1] = 0x003c, + [EEPROM_TXPOWER_A2] = 0x0053, ++ [EEPROM_TXPOWER_INIT] = 0x0068, + [EEPROM_TSSI_BOUND_A1] = 0x006a, + [EEPROM_TSSI_BOUND_A2] = 0x006b, + [EEPROM_TSSI_BOUND_A3] = 0x006c, +@@ -524,6 +591,7 @@ void rt2800_get_txwi_rxwi_size(struct rt2x00_dev *rt2x00dev, + break; + + case RT5592: ++ case RT6352: + *txwi_size = TXWI_DESC_SIZE_5WORDS; + *rxwi_size = RXWI_DESC_SIZE_6WORDS; + break; +@@ -2810,7 +2878,8 @@ static void rt2800_config_channel_rf53xx(struct rt2x00_dev *rt2x00dev, + rt2800_rfcsr_write(rt2x00dev, 59, + r59_nonbt_rev[idx]); + } else if (rt2x00_rt(rt2x00dev, RT5390) || +- rt2x00_rt(rt2x00dev, RT5392)) { ++ rt2x00_rt(rt2x00dev, RT5392) || ++ rt2x00_rt(rt2x00dev, RT6352)) { + static const char r59_non_bt[] = {0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8d, + 0x8a, 0x88, 0x88, 0x87, 0x87, 0x86}; +@@ -3104,6 +3173,242 @@ static void rt2800_config_channel_rf55xx(struct rt2x00_dev *rt2x00dev, + rt2800_bbp_write(rt2x00dev, 196, (rf->channel <= 14) ? 0x19 : 0x7F); + } + ++static void rt2800_config_channel_rf7620(struct rt2x00_dev *rt2x00dev, ++ struct ieee80211_conf *conf, ++ struct rf_channel *rf, ++ struct channel_info *info) ++{ ++ struct rt2800_drv_data *drv_data = rt2x00dev->drv_data; ++ u8 rx_agc_fc, tx_agc_fc; ++ u8 rfcsr; ++ ++ /* Frequeny plan setting */ ++ /* Rdiv setting (set 0x03 if Xtal==20) ++ * R13[1:0] ++ */ ++ rt2800_rfcsr_read(rt2x00dev, 13, &rfcsr); ++ rt2x00_set_field8(&rfcsr, RFCSR13_RDIV_MT7620, ++ rt2800_clk_is_20mhz(rt2x00dev) ? 3 : 0); ++ rt2800_rfcsr_write(rt2x00dev, 13, rfcsr); ++ ++ /* N setting ++ * R20[7:0] in rf->rf1 ++ * R21[0] always 0 ++ */ ++ rt2800_rfcsr_read(rt2x00dev, 20, &rfcsr); ++ rfcsr = (rf->rf1 & 0x00ff); ++ rt2800_rfcsr_write(rt2x00dev, 20, rfcsr); ++ ++ rt2800_rfcsr_read(rt2x00dev, 21, &rfcsr); ++ rt2x00_set_field8(&rfcsr, RFCSR21_BIT1, 0); ++ rt2800_rfcsr_write(rt2x00dev, 21, rfcsr); ++ ++ /* K setting (always 0) ++ * R16[3:0] (RF PLL freq selection) ++ */ ++ rt2800_rfcsr_read(rt2x00dev, 16, &rfcsr); ++ rt2x00_set_field8(&rfcsr, RFCSR16_RF_PLL_FREQ_SEL_MT7620, 0); ++ rt2800_rfcsr_write(rt2x00dev, 16, rfcsr); ++ ++ /* D setting (always 0) ++ * R22[2:0] (D=15, R22[2:0]=<111>) ++ */ ++ rt2800_rfcsr_read(rt2x00dev, 22, &rfcsr); ++ rt2x00_set_field8(&rfcsr, RFCSR22_FREQPLAN_D_MT7620, 0); ++ rt2800_rfcsr_write(rt2x00dev, 22, rfcsr); ++ ++ /* Ksd setting ++ * Ksd: R17<7:0> in rf->rf2 ++ * R18<7:0> in rf->rf3 ++ * R19<1:0> in rf->rf4 ++ */ ++ rt2800_rfcsr_read(rt2x00dev, 17, &rfcsr); ++ rfcsr = rf->rf2; ++ rt2800_rfcsr_write(rt2x00dev, 17, rfcsr); ++ ++ rt2800_rfcsr_read(rt2x00dev, 18, &rfcsr); ++ rfcsr = rf->rf3; ++ rt2800_rfcsr_write(rt2x00dev, 18, rfcsr); ++ ++ rt2800_rfcsr_read(rt2x00dev, 19, &rfcsr); ++ rt2x00_set_field8(&rfcsr, RFCSR19_K, rf->rf4); ++ rt2800_rfcsr_write(rt2x00dev, 19, rfcsr); ++ ++ /* Default: XO=20MHz , SDM mode */ ++ rt2800_rfcsr_read(rt2x00dev, 16, &rfcsr); ++ rt2x00_set_field8(&rfcsr, RFCSR16_SDM_MODE_MT7620, 0x80); ++ rt2800_rfcsr_write(rt2x00dev, 16, rfcsr); ++ ++ rt2800_rfcsr_read(rt2x00dev, 21, &rfcsr); ++ rt2x00_set_field8(&rfcsr, RFCSR21_BIT8, 1); ++ rt2800_rfcsr_write(rt2x00dev, 21, rfcsr); ++ ++ rt2800_rfcsr_read(rt2x00dev, 1, &rfcsr); ++ rt2x00_set_field8(&rfcsr, RFCSR1_TX2_EN_MT7620, ++ rt2x00dev->default_ant.tx_chain_num != 1); ++ rt2800_rfcsr_write(rt2x00dev, 1, rfcsr); ++ ++ rt2800_rfcsr_read(rt2x00dev, 2, &rfcsr); ++ rt2x00_set_field8(&rfcsr, RFCSR2_TX2_EN_MT7620, ++ rt2x00dev->default_ant.tx_chain_num != 1); ++ rt2x00_set_field8(&rfcsr, RFCSR2_RX2_EN_MT7620, ++ rt2x00dev->default_ant.rx_chain_num != 1); ++ rt2800_rfcsr_write(rt2x00dev, 2, rfcsr); ++ ++ rt2800_rfcsr_read(rt2x00dev, 42, &rfcsr); ++ rt2x00_set_field8(&rfcsr, RFCSR42_TX2_EN_MT7620, ++ rt2x00dev->default_ant.tx_chain_num != 1); ++ rt2800_rfcsr_write(rt2x00dev, 42, rfcsr); ++ ++ /* RF for DC Cal BW */ ++ if (conf_is_ht40(conf)) { ++ rt2800_rfcsr_write_dccal(rt2x00dev, 6, 0x10); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 7, 0x10); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 8, 0x04); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 58, 0x10); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x10); ++ } else { ++ rt2800_rfcsr_write_dccal(rt2x00dev, 6, 0x20); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 7, 0x20); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 8, 0x00); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 58, 0x20); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x20); ++ } ++ ++ if (conf_is_ht40(conf)) { ++ rt2800_rfcsr_write_dccal(rt2x00dev, 58, 0x08); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x08); ++ } else { ++ rt2800_rfcsr_write_dccal(rt2x00dev, 58, 0x28); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x28); ++ } ++ ++ rt2800_rfcsr_read(rt2x00dev, 28, &rfcsr); ++ rt2x00_set_field8(&rfcsr, RFCSR28_CH11_HT40, ++ conf_is_ht40(conf) && (rf->channel == 11)); ++ rt2800_rfcsr_write(rt2x00dev, 28, rfcsr); ++ ++ if (!test_bit(DEVICE_STATE_SCANNING, &rt2x00dev->flags)) { ++ if (conf_is_ht40(conf)) { ++ rx_agc_fc = drv_data->rx_calibration_bw40; ++ tx_agc_fc = drv_data->tx_calibration_bw40; ++ } else { ++ rx_agc_fc = drv_data->rx_calibration_bw20; ++ tx_agc_fc = drv_data->tx_calibration_bw20; ++ } ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 6, &rfcsr); ++ rfcsr &= (~0x3F); ++ rfcsr |= rx_agc_fc; ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 6, rfcsr); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 7, &rfcsr); ++ rfcsr &= (~0x3F); ++ rfcsr |= rx_agc_fc; ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 7, rfcsr); ++ rt2800_rfcsr_read_bank(rt2x00dev, 7, 6, &rfcsr); ++ rfcsr &= (~0x3F); ++ rfcsr |= rx_agc_fc; ++ rt2800_rfcsr_write_bank(rt2x00dev, 7, 6, rfcsr); ++ rt2800_rfcsr_read_bank(rt2x00dev, 7, 7, &rfcsr); ++ rfcsr &= (~0x3F); ++ rfcsr |= rx_agc_fc; ++ rt2800_rfcsr_write_bank(rt2x00dev, 7, 7, rfcsr); ++ ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 58, &rfcsr); ++ rfcsr &= (~0x3F); ++ rfcsr |= tx_agc_fc; ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 58, rfcsr); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 59, &rfcsr); ++ rfcsr &= (~0x3F); ++ rfcsr |= tx_agc_fc; ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 59, rfcsr); ++ rt2800_rfcsr_read_bank(rt2x00dev, 7, 58, &rfcsr); ++ rfcsr &= (~0x3F); ++ rfcsr |= tx_agc_fc; ++ rt2800_rfcsr_write_bank(rt2x00dev, 7, 58, rfcsr); ++ rt2800_rfcsr_read_bank(rt2x00dev, 7, 59, &rfcsr); ++ rfcsr &= (~0x3F); ++ rfcsr |= tx_agc_fc; ++ rt2800_rfcsr_write_bank(rt2x00dev, 7, 59, rfcsr); ++ } ++} ++ ++static void rt2800_config_alc(struct rt2x00_dev *rt2x00dev, ++ struct ieee80211_channel *chan, ++ int power_level) { ++ u16 eeprom, target_power, max_power; ++ u32 mac_sys_ctrl, mac_status; ++ u32 reg; ++ u8 bbp; ++ int i; ++ ++ /* hardware unit is 0.5dBm, limited to 23.5dBm */ ++ power_level *= 2; ++ if (power_level > 0x2f) ++ power_level = 0x2f; ++ ++ max_power = chan->max_power * 2; ++ if (max_power > 0x2f) ++ max_power = 0x2f; ++ ++ rt2800_register_read(rt2x00dev, TX_ALC_CFG_0, ®); ++ rt2x00_set_field32(®, TX_ALC_CFG_0_CH_INIT_0, power_level); ++ rt2x00_set_field32(®, TX_ALC_CFG_0_CH_INIT_1, power_level); ++ rt2x00_set_field32(®, TX_ALC_CFG_0_LIMIT_0, max_power); ++ rt2x00_set_field32(®, TX_ALC_CFG_0_LIMIT_1, max_power); ++ ++ rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom); ++ if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_INTERNAL_TX_ALC)) { ++ /* init base power by eeprom target power */ ++ rt2800_eeprom_read(rt2x00dev, EEPROM_TXPOWER_INIT, ++ &target_power); ++ rt2x00_set_field32(®, TX_ALC_CFG_0_CH_INIT_0, target_power); ++ rt2x00_set_field32(®, TX_ALC_CFG_0_CH_INIT_1, target_power); ++ } ++ rt2800_register_write(rt2x00dev, TX_ALC_CFG_0, reg); ++ ++ rt2800_register_read(rt2x00dev, TX_ALC_CFG_1, ®); ++ rt2x00_set_field32(®, TX_ALC_CFG_1_TX_TEMP_COMP, 0); ++ rt2800_register_write(rt2x00dev, TX_ALC_CFG_1, reg); ++ ++ /* Save MAC SYS CTRL registers */ ++ rt2800_register_read(rt2x00dev, MAC_SYS_CTRL, &mac_sys_ctrl); ++ /* Disable Tx/Rx */ ++ rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, 0); ++ /* Check MAC Tx/Rx idle */ ++ for (i = 0; i < 10000; i++) { ++ rt2800_register_read(rt2x00dev, MAC_STATUS_CFG, ++ &mac_status); ++ if (mac_status & 0x3) ++ usleep_range(50, 200); ++ else ++ break; ++ } ++ ++ if (i == 10000) ++ rt2x00_warn(rt2x00dev, "Wait MAC Status to MAX !!!\n"); ++ ++ if (chan->center_freq > 2457) { ++ rt2800_bbp_read(rt2x00dev, 30, &bbp); ++ bbp = 0x40; ++ rt2800_bbp_write(rt2x00dev, 30, bbp); ++ rt2800_rfcsr_write(rt2x00dev, 39, 0); ++ if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) ++ rt2800_rfcsr_write(rt2x00dev, 42, 0xfb); ++ else ++ rt2800_rfcsr_write(rt2x00dev, 42, 0x7b); ++ } else { ++ rt2800_bbp_read(rt2x00dev, 30, &bbp); ++ bbp = 0x1f; ++ rt2800_bbp_write(rt2x00dev, 30, bbp); ++ rt2800_rfcsr_write(rt2x00dev, 39, 0x80); ++ if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) ++ rt2800_rfcsr_write(rt2x00dev, 42, 0xdb); ++ else ++ rt2800_rfcsr_write(rt2x00dev, 42, 0x5b); ++ } ++ rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, mac_sys_ctrl); ++} ++ + static void rt2800_bbp_write_with_rx_chain(struct rt2x00_dev *rt2x00dev, + const unsigned int word, + const u8 value) +@@ -3228,7 +3533,7 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, + struct channel_info *info) + { + u32 reg; +- unsigned int tx_pin; ++ u32 tx_pin; + u8 bbp, rfcsr; + + info->default_power1 = rt2800_txpower_to_dev(rt2x00dev, rf->channel, +@@ -3273,6 +3578,9 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, + case RF5592: + rt2800_config_channel_rf55xx(rt2x00dev, conf, rf, info); + break; ++ case RF7620: ++ rt2800_config_channel_rf7620(rt2x00dev, conf, rf, info); ++ break; + default: + rt2800_config_channel_rf2xxx(rt2x00dev, conf, rf, info); + } +@@ -3347,7 +3655,8 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, + + if (rf->channel <= 14) { + if (!rt2x00_rt(rt2x00dev, RT5390) && +- !rt2x00_rt(rt2x00dev, RT5392)) { ++ !rt2x00_rt(rt2x00dev, RT5392) && ++ !rt2x00_rt(rt2x00dev, RT6352)) { + if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) { + rt2800_bbp_write(rt2x00dev, 82, 0x62); + rt2800_bbp_write(rt2x00dev, 75, 0x46); +@@ -3367,7 +3676,7 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, + rt2800_bbp_write(rt2x00dev, 82, 0x94); + else if (rt2x00_rt(rt2x00dev, RT3593)) + rt2800_bbp_write(rt2x00dev, 82, 0x82); +- else ++ else if (!rt2x00_rt(rt2x00dev, RT6352)) + rt2800_bbp_write(rt2x00dev, 82, 0xf2); + + if (rt2x00_rt(rt2x00dev, RT3593)) +@@ -3388,7 +3697,7 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, + if (rt2x00_rt(rt2x00dev, RT3572)) + rt2800_rfcsr_write(rt2x00dev, 8, 0); + +- tx_pin = 0; ++ rt2800_register_read(rt2x00dev, TX_PIN_CFG, &tx_pin); + + switch (rt2x00dev->default_ant.tx_chain_num) { + case 3: +@@ -3437,6 +3746,7 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, + + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_RFTR_EN, 1); + rt2x00_set_field32(&tx_pin, TX_PIN_CFG_TRSW_EN, 1); ++ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_RFRX_EN, 1); /* mt7620 */ + + rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin); + +@@ -3495,7 +3805,7 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, + usleep_range(1000, 1500); + } + +- if (rt2x00_rt(rt2x00dev, RT5592)) { ++ if (rt2x00_rt(rt2x00dev, RT5592) || rt2x00_rt(rt2x00dev, RT6352)) { + rt2800_bbp_write(rt2x00dev, 195, 141); + rt2800_bbp_write(rt2x00dev, 196, conf_is_ht40(conf) ? 0x10 : 0x1a); + +@@ -4182,6 +4492,128 @@ static void rt2800_config_txpower_rt3593(struct rt2x00_dev *rt2x00dev, + (unsigned long) regs[i]); + } + ++static void rt2800_config_txpower_rt6352(struct rt2x00_dev *rt2x00dev, ++ struct ieee80211_channel *chan, ++ int power_level) ++{ ++ u32 reg, pwreg; ++ u16 eeprom; ++ u32 data, gdata; ++ u8 t, i; ++ enum nl80211_band band = chan->band; ++ int delta; ++ ++ /* Warn user if bw_comp is set in EEPROM */ ++ delta = rt2800_get_txpower_bw_comp(rt2x00dev, band); ++ ++ if (delta) ++ rt2x00_warn(rt2x00dev, "ignoring EEPROM HT40 power delta: %d\n", ++ delta); ++ ++ /* populate TX_PWR_CFG_0 up to TX_PWR_CFG_4 from EEPROM for HT20, limit ++ * value to 0x3f and replace 0x20 by 0x21 as this is what the vendor ++ * driver does as well, though it looks kinda wrong. ++ * Maybe some misunderstanding of what a signed 8-bit value is? Maybe ++ * the hardware has a problem handling 0x20, and as the code initially ++ * used a fixed offset between HT20 and HT40 rates they had to work- ++ * around that issue and most likely just forgot about it later on. ++ * Maybe we should use rt2800_get_txpower_bw_comp() here as well, ++ * however, the corresponding EEPROM value is not respected by the ++ * vendor driver, so maybe this is rather being taken care of the ++ * TXALC and the driver doesn't need to handle it...? ++ * Though this is all very awkward, just do as they did, as that's what ++ * board vendors expected when they populated the EEPROM... ++ */ ++ for (i = 0; i < 5; i++) { ++ rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE, ++ i * 2, &eeprom); ++ ++ data = eeprom; ++ ++ t = eeprom & 0x3f; ++ if (t == 32) ++ t++; ++ ++ gdata = t; ++ ++ t = (eeprom & 0x3f00) >> 8; ++ if (t == 32) ++ t++; ++ ++ gdata |= (t << 8); ++ ++ rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE, ++ (i * 2) + 1, &eeprom); ++ ++ t = eeprom & 0x3f; ++ if (t == 32) ++ t++; ++ ++ gdata |= (t << 16); ++ ++ t = (eeprom & 0x3f00) >> 8; ++ if (t == 32) ++ t++; ++ ++ gdata |= (t << 24); ++ data |= (eeprom << 16); ++ ++ if (!test_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags)) { ++ /* HT20 */ ++ if (data != 0xffffffff) ++ rt2800_register_write(rt2x00dev, ++ TX_PWR_CFG_0 + (i * 4), ++ data); ++ } else { ++ /* HT40 */ ++ if (gdata != 0xffffffff) ++ rt2800_register_write(rt2x00dev, ++ TX_PWR_CFG_0 + (i * 4), ++ gdata); ++ } ++ } ++ ++ /* Aparently Ralink ran out of space in the BYRATE calibration section ++ * of the EERPOM which is copied to the corresponding TX_PWR_CFG_x ++ * registers. As recent 2T chips use 8-bit instead of 4-bit values for ++ * power-offsets more space would be needed. Ralink decided to keep the ++ * EEPROM layout untouched and rather have some shared values covering ++ * multiple bitrates. ++ * Populate the registers not covered by the EEPROM in the same way the ++ * vendor driver does. ++ */ ++ ++ /* For OFDM 54MBS use value from OFDM 48MBS */ ++ pwreg = 0; ++ rt2800_register_read(rt2x00dev, TX_PWR_CFG_1, ®); ++ t = rt2x00_get_field32(reg, TX_PWR_CFG_1B_48MBS); ++ rt2x00_set_field32(&pwreg, TX_PWR_CFG_7B_54MBS, t); ++ ++ /* For MCS 7 use value from MCS 6 */ ++ rt2800_register_read(rt2x00dev, TX_PWR_CFG_2, ®); ++ t = rt2x00_get_field32(reg, TX_PWR_CFG_2B_MCS6_MCS7); ++ rt2x00_set_field32(&pwreg, TX_PWR_CFG_7B_MCS7, t); ++ rt2800_register_write(rt2x00dev, TX_PWR_CFG_7, pwreg); ++ ++ /* For MCS 15 use value from MCS 14 */ ++ pwreg = 0; ++ rt2800_register_read(rt2x00dev, TX_PWR_CFG_3, ®); ++ t = rt2x00_get_field32(reg, TX_PWR_CFG_3B_MCS14); ++ rt2x00_set_field32(&pwreg, TX_PWR_CFG_8B_MCS15, t); ++ rt2800_register_write(rt2x00dev, TX_PWR_CFG_8, pwreg); ++ ++ /* For STBC MCS 7 use value from STBC MCS 6 */ ++ pwreg = 0; ++ rt2800_register_read(rt2x00dev, TX_PWR_CFG_4, ®); ++ t = rt2x00_get_field32(reg, TX_PWR_CFG_4B_STBC_MCS6); ++ rt2x00_set_field32(&pwreg, TX_PWR_CFG_9B_STBC_MCS7, t); ++ rt2800_register_write(rt2x00dev, TX_PWR_CFG_9, pwreg); ++ ++ rt2800_config_alc(rt2x00dev, chan, power_level); ++ ++ /* TODO: temperature compensation code! */ ++} ++ + /* + * We configure transmit power using MAC TX_PWR_CFG_{0,...,N} registers and + * BBP R1 register. TX_PWR_CFG_X allow to configure per rate TX power values, +@@ -4378,6 +4810,8 @@ static void rt2800_config_txpower(struct rt2x00_dev *rt2x00dev, + { + if (rt2x00_rt(rt2x00dev, RT3593)) + rt2800_config_txpower_rt3593(rt2x00dev, chan, power_level); ++ else if (rt2x00_rt(rt2x00dev, RT6352)) ++ rt2800_config_txpower_rt6352(rt2x00dev, chan, power_level); + else + rt2800_config_txpower_rt28xx(rt2x00dev, chan, power_level); + } +@@ -4393,6 +4827,7 @@ void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev) + { + u32 tx_pin; + u8 rfcsr; ++ unsigned long min_sleep = 0; + + /* + * A voltage-controlled oscillator(VCO) is an electronic oscillator +@@ -4431,6 +4866,15 @@ void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev) + rt2800_rfcsr_read(rt2x00dev, 3, &rfcsr); + rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1); + rt2800_rfcsr_write(rt2x00dev, 3, rfcsr); ++ min_sleep = 1000; ++ break; ++ case RF7620: ++ rt2800_rfcsr_write(rt2x00dev, 5, 0x40); ++ rt2800_rfcsr_write(rt2x00dev, 4, 0x0C); ++ rt2800_rfcsr_read(rt2x00dev, 4, &rfcsr); ++ rt2x00_set_field8(&rfcsr, RFCSR4_VCOCAL_EN, 1); ++ rt2800_rfcsr_write(rt2x00dev, 4, rfcsr); ++ min_sleep = 2000; + break; + default: + WARN_ONCE(1, "Not supported RF chipet %x for VCO recalibration", +@@ -4438,7 +4882,8 @@ void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev) + return; + } + +- usleep_range(1000, 1500); ++ if (min_sleep > 0) ++ usleep_range(min_sleep, min_sleep * 2); + + rt2800_register_read(rt2x00dev, TX_PIN_CFG, &tx_pin); + if (rt2x00dev->rf_channel <= 14) { +@@ -4470,6 +4915,42 @@ void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev) + } + rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin); + ++ if (rt2x00_rt(rt2x00dev, RT6352)) { ++ if (rt2x00dev->default_ant.tx_chain_num == 1) { ++ rt2800_bbp_write(rt2x00dev, 91, 0x07); ++ rt2800_bbp_write(rt2x00dev, 95, 0x1A); ++ rt2800_bbp_write(rt2x00dev, 195, 128); ++ rt2800_bbp_write(rt2x00dev, 196, 0xA0); ++ rt2800_bbp_write(rt2x00dev, 195, 170); ++ rt2800_bbp_write(rt2x00dev, 196, 0x12); ++ rt2800_bbp_write(rt2x00dev, 195, 171); ++ rt2800_bbp_write(rt2x00dev, 196, 0x10); ++ } else { ++ rt2800_bbp_write(rt2x00dev, 91, 0x06); ++ rt2800_bbp_write(rt2x00dev, 95, 0x9A); ++ rt2800_bbp_write(rt2x00dev, 195, 128); ++ rt2800_bbp_write(rt2x00dev, 196, 0xE0); ++ rt2800_bbp_write(rt2x00dev, 195, 170); ++ rt2800_bbp_write(rt2x00dev, 196, 0x30); ++ rt2800_bbp_write(rt2x00dev, 195, 171); ++ rt2800_bbp_write(rt2x00dev, 196, 0x30); ++ } ++ ++ if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) { ++ rt2800_bbp_write(rt2x00dev, 75, 0x60); ++ rt2800_bbp_write(rt2x00dev, 76, 0x44); ++ rt2800_bbp_write(rt2x00dev, 79, 0x1C); ++ rt2800_bbp_write(rt2x00dev, 80, 0x0C); ++ rt2800_bbp_write(rt2x00dev, 82, 0xB6); ++ } ++ ++ /* On 11A, We should delay and wait RF/BBP to be stable ++ * and the appropriate time should be 1000 micro seconds ++ * 2005/06/05 - On 11G, we also need this delay time. ++ * Otherwise it's difficult to pass the WHQL. ++ */ ++ usleep_range(1000, 1500); ++ } + } + EXPORT_SYMBOL_GPL(rt2800_vco_calibration); + +@@ -4568,7 +5049,8 @@ static u8 rt2800_get_default_vgc(struct rt2x00_dev *rt2x00dev) + rt2x00_rt(rt2x00dev, RT3593) || + rt2x00_rt(rt2x00dev, RT5390) || + rt2x00_rt(rt2x00dev, RT5392) || +- rt2x00_rt(rt2x00dev, RT5592)) ++ rt2x00_rt(rt2x00dev, RT5592) || ++ rt2x00_rt(rt2x00dev, RT6352)) + vgc = 0x1c + (2 * rt2x00dev->lna_gain); + else + vgc = 0x2e + rt2x00dev->lna_gain; +@@ -4795,7 +5277,8 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev) + 0x00000000); + } + } else if (rt2x00_rt(rt2x00dev, RT5390) || +- rt2x00_rt(rt2x00dev, RT5392)) { ++ rt2x00_rt(rt2x00dev, RT5392) || ++ rt2x00_rt(rt2x00dev, RT6352)) { + rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404); + rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606); + rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000); +@@ -4805,6 +5288,24 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev) + rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000); + } else if (rt2x00_rt(rt2x00dev, RT5350)) { + rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404); ++ } else if (rt2x00_rt(rt2x00dev, RT6352)) { ++ rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000401); ++ rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x000C0000); ++ rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000); ++ rt2800_register_write(rt2x00dev, MIMO_PS_CFG, 0x00000002); ++ rt2800_register_write(rt2x00dev, TX_PIN_CFG, 0x00150F0F); ++ rt2800_register_write(rt2x00dev, TX_ALC_VGA3, 0x06060606); ++ rt2800_register_write(rt2x00dev, TX0_BB_GAIN_ATTEN, 0x0); ++ rt2800_register_write(rt2x00dev, TX1_BB_GAIN_ATTEN, 0x0); ++ rt2800_register_write(rt2x00dev, TX0_RF_GAIN_ATTEN, 0x6C6C666C); ++ rt2800_register_write(rt2x00dev, TX1_RF_GAIN_ATTEN, 0x6C6C666C); ++ rt2800_register_write(rt2x00dev, TX0_RF_GAIN_CORRECT, ++ 0x3630363A); ++ rt2800_register_write(rt2x00dev, TX1_RF_GAIN_CORRECT, ++ 0x3630363A); ++ rt2800_register_read(rt2x00dev, TX_ALC_CFG_1, ®); ++ rt2x00_set_field32(®, TX_ALC_CFG_1_ROS_BUSY_EN, 0); ++ rt2800_register_write(rt2x00dev, TX_ALC_CFG_1, reg); + } else { + rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000000); + rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606); +@@ -5786,6 +6287,231 @@ static void rt2800_init_bbp_5592(struct rt2x00_dev *rt2x00dev) + rt2800_bbp_write(rt2x00dev, 103, 0xc0); + } + ++static void rt2800_bbp_glrt_write(struct rt2x00_dev *rt2x00dev, ++ const u8 reg, const u8 value) ++{ ++ rt2800_bbp_write(rt2x00dev, 195, reg); ++ rt2800_bbp_write(rt2x00dev, 196, value); ++} ++ ++static void rt2800_bbp_dcoc_write(struct rt2x00_dev *rt2x00dev, ++ const u8 reg, const u8 value) ++{ ++ rt2800_bbp_write(rt2x00dev, 158, reg); ++ rt2800_bbp_write(rt2x00dev, 159, value); ++} ++ ++static void rt2800_bbp_dcoc_read(struct rt2x00_dev *rt2x00dev, ++ const u8 reg, u8 *value) ++{ ++ rt2800_bbp_write(rt2x00dev, 158, reg); ++ rt2800_bbp_read(rt2x00dev, 159, value); ++} ++ ++static void rt2800_init_bbp_6352(struct rt2x00_dev *rt2x00dev) ++{ ++ u8 bbp; ++ ++ /* Apply Maximum Likelihood Detection (MLD) for 2 stream case */ ++ rt2800_bbp_read(rt2x00dev, 105, &bbp); ++ rt2x00_set_field8(&bbp, BBP105_MLD, ++ rt2x00dev->default_ant.rx_chain_num == 2); ++ rt2800_bbp_write(rt2x00dev, 105, bbp); ++ ++ /* Avoid data loss and CRC errors */ ++ rt2800_bbp4_mac_if_ctrl(rt2x00dev); ++ ++ /* Fix I/Q swap issue */ ++ rt2800_bbp_read(rt2x00dev, 1, &bbp); ++ bbp |= 0x04; ++ rt2800_bbp_write(rt2x00dev, 1, bbp); ++ ++ /* BBP for G band */ ++ rt2800_bbp_write(rt2x00dev, 3, 0x08); ++ rt2800_bbp_write(rt2x00dev, 4, 0x00); /* rt2800_bbp4_mac_if_ctrl? */ ++ rt2800_bbp_write(rt2x00dev, 6, 0x08); ++ rt2800_bbp_write(rt2x00dev, 14, 0x09); ++ rt2800_bbp_write(rt2x00dev, 15, 0xFF); ++ rt2800_bbp_write(rt2x00dev, 16, 0x01); ++ rt2800_bbp_write(rt2x00dev, 20, 0x06); ++ rt2800_bbp_write(rt2x00dev, 21, 0x00); ++ rt2800_bbp_write(rt2x00dev, 22, 0x00); ++ rt2800_bbp_write(rt2x00dev, 27, 0x00); ++ rt2800_bbp_write(rt2x00dev, 28, 0x00); ++ rt2800_bbp_write(rt2x00dev, 30, 0x00); ++ rt2800_bbp_write(rt2x00dev, 31, 0x48); ++ rt2800_bbp_write(rt2x00dev, 47, 0x40); ++ rt2800_bbp_write(rt2x00dev, 62, 0x00); ++ rt2800_bbp_write(rt2x00dev, 63, 0x00); ++ rt2800_bbp_write(rt2x00dev, 64, 0x00); ++ rt2800_bbp_write(rt2x00dev, 65, 0x2C); ++ rt2800_bbp_write(rt2x00dev, 66, 0x1C); ++ rt2800_bbp_write(rt2x00dev, 67, 0x20); ++ rt2800_bbp_write(rt2x00dev, 68, 0xDD); ++ rt2800_bbp_write(rt2x00dev, 69, 0x10); ++ rt2800_bbp_write(rt2x00dev, 70, 0x05); ++ rt2800_bbp_write(rt2x00dev, 73, 0x18); ++ rt2800_bbp_write(rt2x00dev, 74, 0x0F); ++ rt2800_bbp_write(rt2x00dev, 75, 0x60); ++ rt2800_bbp_write(rt2x00dev, 76, 0x44); ++ rt2800_bbp_write(rt2x00dev, 77, 0x59); ++ rt2800_bbp_write(rt2x00dev, 78, 0x1E); ++ rt2800_bbp_write(rt2x00dev, 79, 0x1C); ++ rt2800_bbp_write(rt2x00dev, 80, 0x0C); ++ rt2800_bbp_write(rt2x00dev, 81, 0x3A); ++ rt2800_bbp_write(rt2x00dev, 82, 0xB6); ++ rt2800_bbp_write(rt2x00dev, 83, 0x9A); ++ rt2800_bbp_write(rt2x00dev, 84, 0x9A); ++ rt2800_bbp_write(rt2x00dev, 86, 0x38); ++ rt2800_bbp_write(rt2x00dev, 88, 0x90); ++ rt2800_bbp_write(rt2x00dev, 91, 0x04); ++ rt2800_bbp_write(rt2x00dev, 92, 0x02); ++ rt2800_bbp_write(rt2x00dev, 95, 0x9A); ++ rt2800_bbp_write(rt2x00dev, 96, 0x00); ++ rt2800_bbp_write(rt2x00dev, 103, 0xC0); ++ rt2800_bbp_write(rt2x00dev, 104, 0x92); ++ /* FIXME BBP105 owerwrite */ ++ rt2800_bbp_write(rt2x00dev, 105, 0x3C); ++ rt2800_bbp_write(rt2x00dev, 106, 0x12); ++ rt2800_bbp_write(rt2x00dev, 109, 0x00); ++ rt2800_bbp_write(rt2x00dev, 134, 0x10); ++ rt2800_bbp_write(rt2x00dev, 135, 0xA6); ++ rt2800_bbp_write(rt2x00dev, 137, 0x04); ++ rt2800_bbp_write(rt2x00dev, 142, 0x30); ++ rt2800_bbp_write(rt2x00dev, 143, 0xF7); ++ rt2800_bbp_write(rt2x00dev, 160, 0xEC); ++ rt2800_bbp_write(rt2x00dev, 161, 0xC4); ++ rt2800_bbp_write(rt2x00dev, 162, 0x77); ++ rt2800_bbp_write(rt2x00dev, 163, 0xF9); ++ rt2800_bbp_write(rt2x00dev, 164, 0x00); ++ rt2800_bbp_write(rt2x00dev, 165, 0x00); ++ rt2800_bbp_write(rt2x00dev, 186, 0x00); ++ rt2800_bbp_write(rt2x00dev, 187, 0x00); ++ rt2800_bbp_write(rt2x00dev, 188, 0x00); ++ rt2800_bbp_write(rt2x00dev, 186, 0x00); ++ rt2800_bbp_write(rt2x00dev, 187, 0x01); ++ rt2800_bbp_write(rt2x00dev, 188, 0x00); ++ rt2800_bbp_write(rt2x00dev, 189, 0x00); ++ ++ rt2800_bbp_write(rt2x00dev, 91, 0x06); ++ rt2800_bbp_write(rt2x00dev, 92, 0x04); ++ rt2800_bbp_write(rt2x00dev, 93, 0x54); ++ rt2800_bbp_write(rt2x00dev, 99, 0x50); ++ rt2800_bbp_write(rt2x00dev, 148, 0x84); ++ rt2800_bbp_write(rt2x00dev, 167, 0x80); ++ rt2800_bbp_write(rt2x00dev, 178, 0xFF); ++ rt2800_bbp_write(rt2x00dev, 106, 0x13); ++ ++ /* BBP for G band GLRT function (BBP_128 ~ BBP_221) */ ++ rt2800_bbp_glrt_write(rt2x00dev, 0, 0x00); ++ rt2800_bbp_glrt_write(rt2x00dev, 1, 0x14); ++ rt2800_bbp_glrt_write(rt2x00dev, 2, 0x20); ++ rt2800_bbp_glrt_write(rt2x00dev, 3, 0x0A); ++ rt2800_bbp_glrt_write(rt2x00dev, 10, 0x16); ++ rt2800_bbp_glrt_write(rt2x00dev, 11, 0x06); ++ rt2800_bbp_glrt_write(rt2x00dev, 12, 0x02); ++ rt2800_bbp_glrt_write(rt2x00dev, 13, 0x07); ++ rt2800_bbp_glrt_write(rt2x00dev, 14, 0x05); ++ rt2800_bbp_glrt_write(rt2x00dev, 15, 0x09); ++ rt2800_bbp_glrt_write(rt2x00dev, 16, 0x20); ++ rt2800_bbp_glrt_write(rt2x00dev, 17, 0x08); ++ rt2800_bbp_glrt_write(rt2x00dev, 18, 0x4A); ++ rt2800_bbp_glrt_write(rt2x00dev, 19, 0x00); ++ rt2800_bbp_glrt_write(rt2x00dev, 20, 0x00); ++ rt2800_bbp_glrt_write(rt2x00dev, 128, 0xE0); ++ rt2800_bbp_glrt_write(rt2x00dev, 129, 0x1F); ++ rt2800_bbp_glrt_write(rt2x00dev, 130, 0x4F); ++ rt2800_bbp_glrt_write(rt2x00dev, 131, 0x32); ++ rt2800_bbp_glrt_write(rt2x00dev, 132, 0x08); ++ rt2800_bbp_glrt_write(rt2x00dev, 133, 0x28); ++ rt2800_bbp_glrt_write(rt2x00dev, 134, 0x19); ++ rt2800_bbp_glrt_write(rt2x00dev, 135, 0x0A); ++ rt2800_bbp_glrt_write(rt2x00dev, 138, 0x16); ++ rt2800_bbp_glrt_write(rt2x00dev, 139, 0x10); ++ rt2800_bbp_glrt_write(rt2x00dev, 140, 0x10); ++ rt2800_bbp_glrt_write(rt2x00dev, 141, 0x1A); ++ rt2800_bbp_glrt_write(rt2x00dev, 142, 0x36); ++ rt2800_bbp_glrt_write(rt2x00dev, 143, 0x2C); ++ rt2800_bbp_glrt_write(rt2x00dev, 144, 0x26); ++ rt2800_bbp_glrt_write(rt2x00dev, 145, 0x24); ++ rt2800_bbp_glrt_write(rt2x00dev, 146, 0x42); ++ rt2800_bbp_glrt_write(rt2x00dev, 147, 0x40); ++ rt2800_bbp_glrt_write(rt2x00dev, 148, 0x30); ++ rt2800_bbp_glrt_write(rt2x00dev, 149, 0x29); ++ rt2800_bbp_glrt_write(rt2x00dev, 150, 0x4C); ++ rt2800_bbp_glrt_write(rt2x00dev, 151, 0x46); ++ rt2800_bbp_glrt_write(rt2x00dev, 152, 0x3D); ++ rt2800_bbp_glrt_write(rt2x00dev, 153, 0x40); ++ rt2800_bbp_glrt_write(rt2x00dev, 154, 0x3E); ++ rt2800_bbp_glrt_write(rt2x00dev, 155, 0x38); ++ rt2800_bbp_glrt_write(rt2x00dev, 156, 0x3D); ++ rt2800_bbp_glrt_write(rt2x00dev, 157, 0x2F); ++ rt2800_bbp_glrt_write(rt2x00dev, 158, 0x3C); ++ rt2800_bbp_glrt_write(rt2x00dev, 159, 0x34); ++ rt2800_bbp_glrt_write(rt2x00dev, 160, 0x2C); ++ rt2800_bbp_glrt_write(rt2x00dev, 161, 0x2F); ++ rt2800_bbp_glrt_write(rt2x00dev, 162, 0x3C); ++ rt2800_bbp_glrt_write(rt2x00dev, 163, 0x35); ++ rt2800_bbp_glrt_write(rt2x00dev, 164, 0x2E); ++ rt2800_bbp_glrt_write(rt2x00dev, 165, 0x2F); ++ rt2800_bbp_glrt_write(rt2x00dev, 166, 0x49); ++ rt2800_bbp_glrt_write(rt2x00dev, 167, 0x41); ++ rt2800_bbp_glrt_write(rt2x00dev, 168, 0x36); ++ rt2800_bbp_glrt_write(rt2x00dev, 169, 0x39); ++ rt2800_bbp_glrt_write(rt2x00dev, 170, 0x30); ++ rt2800_bbp_glrt_write(rt2x00dev, 171, 0x30); ++ rt2800_bbp_glrt_write(rt2x00dev, 172, 0x0E); ++ rt2800_bbp_glrt_write(rt2x00dev, 173, 0x0D); ++ rt2800_bbp_glrt_write(rt2x00dev, 174, 0x28); ++ rt2800_bbp_glrt_write(rt2x00dev, 175, 0x21); ++ rt2800_bbp_glrt_write(rt2x00dev, 176, 0x1C); ++ rt2800_bbp_glrt_write(rt2x00dev, 177, 0x16); ++ rt2800_bbp_glrt_write(rt2x00dev, 178, 0x50); ++ rt2800_bbp_glrt_write(rt2x00dev, 179, 0x4A); ++ rt2800_bbp_glrt_write(rt2x00dev, 180, 0x43); ++ rt2800_bbp_glrt_write(rt2x00dev, 181, 0x50); ++ rt2800_bbp_glrt_write(rt2x00dev, 182, 0x10); ++ rt2800_bbp_glrt_write(rt2x00dev, 183, 0x10); ++ rt2800_bbp_glrt_write(rt2x00dev, 184, 0x10); ++ rt2800_bbp_glrt_write(rt2x00dev, 185, 0x10); ++ rt2800_bbp_glrt_write(rt2x00dev, 200, 0x7D); ++ rt2800_bbp_glrt_write(rt2x00dev, 201, 0x14); ++ rt2800_bbp_glrt_write(rt2x00dev, 202, 0x32); ++ rt2800_bbp_glrt_write(rt2x00dev, 203, 0x2C); ++ rt2800_bbp_glrt_write(rt2x00dev, 204, 0x36); ++ rt2800_bbp_glrt_write(rt2x00dev, 205, 0x4C); ++ rt2800_bbp_glrt_write(rt2x00dev, 206, 0x43); ++ rt2800_bbp_glrt_write(rt2x00dev, 207, 0x2C); ++ rt2800_bbp_glrt_write(rt2x00dev, 208, 0x2E); ++ rt2800_bbp_glrt_write(rt2x00dev, 209, 0x36); ++ rt2800_bbp_glrt_write(rt2x00dev, 210, 0x30); ++ rt2800_bbp_glrt_write(rt2x00dev, 211, 0x6E); ++ ++ /* BBP for G band DCOC function */ ++ rt2800_bbp_dcoc_write(rt2x00dev, 140, 0x0C); ++ rt2800_bbp_dcoc_write(rt2x00dev, 141, 0x00); ++ rt2800_bbp_dcoc_write(rt2x00dev, 142, 0x10); ++ rt2800_bbp_dcoc_write(rt2x00dev, 143, 0x10); ++ rt2800_bbp_dcoc_write(rt2x00dev, 144, 0x10); ++ rt2800_bbp_dcoc_write(rt2x00dev, 145, 0x10); ++ rt2800_bbp_dcoc_write(rt2x00dev, 146, 0x08); ++ rt2800_bbp_dcoc_write(rt2x00dev, 147, 0x40); ++ rt2800_bbp_dcoc_write(rt2x00dev, 148, 0x04); ++ rt2800_bbp_dcoc_write(rt2x00dev, 149, 0x04); ++ rt2800_bbp_dcoc_write(rt2x00dev, 150, 0x08); ++ rt2800_bbp_dcoc_write(rt2x00dev, 151, 0x08); ++ rt2800_bbp_dcoc_write(rt2x00dev, 152, 0x03); ++ rt2800_bbp_dcoc_write(rt2x00dev, 153, 0x03); ++ rt2800_bbp_dcoc_write(rt2x00dev, 154, 0x03); ++ rt2800_bbp_dcoc_write(rt2x00dev, 155, 0x02); ++ rt2800_bbp_dcoc_write(rt2x00dev, 156, 0x40); ++ rt2800_bbp_dcoc_write(rt2x00dev, 157, 0x40); ++ rt2800_bbp_dcoc_write(rt2x00dev, 158, 0x64); ++ rt2800_bbp_dcoc_write(rt2x00dev, 159, 0x64); ++ ++ rt2800_bbp4_mac_if_ctrl(rt2x00dev); ++} ++ + static void rt2800_init_bbp(struct rt2x00_dev *rt2x00dev) + { + unsigned int i; +@@ -5830,6 +6556,9 @@ static void rt2800_init_bbp(struct rt2x00_dev *rt2x00dev) + case RT5592: + rt2800_init_bbp_5592(rt2x00dev); + return; ++ case RT6352: ++ rt2800_init_bbp_6352(rt2x00dev); ++ break; + } + + for (i = 0; i < EEPROM_BBP_SIZE; i++) { +@@ -6901,6 +7630,615 @@ static void rt2800_init_rfcsr_5592(struct rt2x00_dev *rt2x00dev) + rt2800_led_open_drain_enable(rt2x00dev); + } + ++static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev, ++ bool set_bw, bool is_ht40) ++{ ++ u8 bbp_val; ++ ++ rt2800_bbp_read(rt2x00dev, 21, &bbp_val); ++ bbp_val |= 0x1; ++ rt2800_bbp_write(rt2x00dev, 21, bbp_val); ++ usleep_range(100, 200); ++ ++ if (set_bw) { ++ rt2800_bbp_read(rt2x00dev, 4, &bbp_val); ++ rt2x00_set_field8(&bbp_val, BBP4_BANDWIDTH, 2 * is_ht40); ++ rt2800_bbp_write(rt2x00dev, 4, bbp_val); ++ usleep_range(100, 200); ++ } ++ ++ rt2800_bbp_read(rt2x00dev, 21, &bbp_val); ++ bbp_val &= (~0x1); ++ rt2800_bbp_write(rt2x00dev, 21, bbp_val); ++ usleep_range(100, 200); ++} ++ ++static int rt2800_rf_lp_config(struct rt2x00_dev *rt2x00dev, bool btxcal) ++{ ++ u8 rf_val; ++ ++ if (btxcal) ++ rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x04); ++ else ++ rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x02); ++ ++ rt2800_register_write(rt2x00dev, RF_BYPASS0, 0x06); ++ ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 17, &rf_val); ++ rf_val |= 0x80; ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 17, rf_val); ++ ++ if (btxcal) { ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 18, 0xC1); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 19, 0x20); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 20, 0x02); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 3, &rf_val); ++ rf_val &= (~0x3F); ++ rf_val |= 0x3F; ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 3, rf_val); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 4, &rf_val); ++ rf_val &= (~0x3F); ++ rf_val |= 0x3F; ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 4, rf_val); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 5, 0x31); ++ } else { ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 18, 0xF1); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 19, 0x18); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 20, 0x02); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 3, &rf_val); ++ rf_val &= (~0x3F); ++ rf_val |= 0x34; ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 3, rf_val); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 4, &rf_val); ++ rf_val &= (~0x3F); ++ rf_val |= 0x34; ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 4, rf_val); ++ } ++ ++ return 0; ++} ++ ++static char rt2800_lp_tx_filter_bw_cal(struct rt2x00_dev *rt2x00dev) ++{ ++ unsigned int cnt; ++ u8 bbp_val; ++ char cal_val; ++ ++ rt2800_bbp_dcoc_write(rt2x00dev, 0, 0x82); ++ ++ cnt = 0; ++ do { ++ usleep_range(500, 2000); ++ rt2800_bbp_read(rt2x00dev, 159, &bbp_val); ++ if (bbp_val == 0x02 || cnt == 20) ++ break; ++ ++ cnt++; ++ } while (cnt < 20); ++ ++ rt2800_bbp_dcoc_read(rt2x00dev, 0x39, &bbp_val); ++ cal_val = bbp_val & 0x7F; ++ if (cal_val >= 0x40) ++ cal_val -= 128; ++ ++ return cal_val; ++} ++ ++static void rt2800_bw_filter_calibration(struct rt2x00_dev *rt2x00dev, ++ bool btxcal) ++{ ++ struct rt2800_drv_data *drv_data = rt2x00dev->drv_data; ++ u8 tx_agc_fc = 0, rx_agc_fc = 0, cmm_agc_fc; ++ u8 filter_target; ++ u8 tx_filter_target_20m = 0x09, tx_filter_target_40m = 0x02; ++ u8 rx_filter_target_20m = 0x27, rx_filter_target_40m = 0x31; ++ int loop = 0, is_ht40, cnt; ++ u8 bbp_val, rf_val; ++ char cal_r32_init, cal_r32_val, cal_diff; ++ u8 saverfb5r00, saverfb5r01, saverfb5r03, saverfb5r04, saverfb5r05; ++ u8 saverfb5r06, saverfb5r07; ++ u8 saverfb5r08, saverfb5r17, saverfb5r18, saverfb5r19, saverfb5r20; ++ u8 saverfb5r37, saverfb5r38, saverfb5r39, saverfb5r40, saverfb5r41; ++ u8 saverfb5r42, saverfb5r43, saverfb5r44, saverfb5r45, saverfb5r46; ++ u8 saverfb5r58, saverfb5r59; ++ u8 savebbp159r0, savebbp159r2, savebbpr23; ++ u32 MAC_RF_CONTROL0, MAC_RF_BYPASS0; ++ ++ /* Save MAC registers */ ++ rt2800_register_read(rt2x00dev, RF_CONTROL0, &MAC_RF_CONTROL0); ++ rt2800_register_read(rt2x00dev, RF_BYPASS0, &MAC_RF_BYPASS0); ++ ++ /* save BBP registers */ ++ rt2800_bbp_read(rt2x00dev, 23, &savebbpr23); ++ ++ rt2800_bbp_dcoc_read(rt2x00dev, 0, &savebbp159r0); ++ rt2800_bbp_dcoc_read(rt2x00dev, 2, &savebbp159r2); ++ ++ /* Save RF registers */ ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 0, &saverfb5r00); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 1, &saverfb5r01); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 3, &saverfb5r03); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 4, &saverfb5r04); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 5, &saverfb5r05); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 6, &saverfb5r06); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 7, &saverfb5r07); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 8, &saverfb5r08); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 17, &saverfb5r17); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 18, &saverfb5r18); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 19, &saverfb5r19); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 20, &saverfb5r20); ++ ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 37, &saverfb5r37); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 38, &saverfb5r38); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 39, &saverfb5r39); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 40, &saverfb5r40); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 41, &saverfb5r41); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 42, &saverfb5r42); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 43, &saverfb5r43); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 44, &saverfb5r44); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 45, &saverfb5r45); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 46, &saverfb5r46); ++ ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 58, &saverfb5r58); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 59, &saverfb5r59); ++ ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 0, &rf_val); ++ rf_val |= 0x3; ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 0, rf_val); ++ ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 1, &rf_val); ++ rf_val |= 0x1; ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 1, rf_val); ++ ++ cnt = 0; ++ do { ++ usleep_range(500, 2000); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 1, &rf_val); ++ if (((rf_val & 0x1) == 0x00) || (cnt == 40)) ++ break; ++ cnt++; ++ } while (cnt < 40); ++ ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 0, &rf_val); ++ rf_val &= (~0x3); ++ rf_val |= 0x1; ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 0, rf_val); ++ ++ /* I-3 */ ++ rt2800_bbp_read(rt2x00dev, 23, &bbp_val); ++ bbp_val &= (~0x1F); ++ bbp_val |= 0x10; ++ rt2800_bbp_write(rt2x00dev, 23, bbp_val); ++ ++ do { ++ /* I-4,5,6,7,8,9 */ ++ if (loop == 0) { ++ is_ht40 = false; ++ ++ if (btxcal) ++ filter_target = tx_filter_target_20m; ++ else ++ filter_target = rx_filter_target_20m; ++ } else { ++ is_ht40 = true; ++ ++ if (btxcal) ++ filter_target = tx_filter_target_40m; ++ else ++ filter_target = rx_filter_target_40m; ++ } ++ ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 8, &rf_val); ++ rf_val &= (~0x04); ++ if (loop == 1) ++ rf_val |= 0x4; ++ ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 8, rf_val); ++ ++ rt2800_bbp_core_soft_reset(rt2x00dev, true, is_ht40); ++ ++ rt2800_rf_lp_config(rt2x00dev, btxcal); ++ if (btxcal) { ++ tx_agc_fc = 0; ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 58, &rf_val); ++ rf_val &= (~0x7F); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 58, rf_val); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 59, &rf_val); ++ rf_val &= (~0x7F); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 59, rf_val); ++ } else { ++ rx_agc_fc = 0; ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 6, &rf_val); ++ rf_val &= (~0x7F); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 6, rf_val); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 7, &rf_val); ++ rf_val &= (~0x7F); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 7, rf_val); ++ } ++ ++ usleep_range(1000, 2000); ++ ++ rt2800_bbp_dcoc_read(rt2x00dev, 2, &bbp_val); ++ bbp_val &= (~0x6); ++ rt2800_bbp_dcoc_write(rt2x00dev, 2, bbp_val); ++ ++ rt2800_bbp_core_soft_reset(rt2x00dev, false, is_ht40); ++ ++ cal_r32_init = rt2800_lp_tx_filter_bw_cal(rt2x00dev); ++ ++ rt2800_bbp_dcoc_read(rt2x00dev, 2, &bbp_val); ++ bbp_val |= 0x6; ++ rt2800_bbp_dcoc_write(rt2x00dev, 2, bbp_val); ++do_cal: ++ if (btxcal) { ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 58, &rf_val); ++ rf_val &= (~0x7F); ++ rf_val |= tx_agc_fc; ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 58, rf_val); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 59, &rf_val); ++ rf_val &= (~0x7F); ++ rf_val |= tx_agc_fc; ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 59, rf_val); ++ } else { ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 6, &rf_val); ++ rf_val &= (~0x7F); ++ rf_val |= rx_agc_fc; ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 6, rf_val); ++ rt2800_rfcsr_read_bank(rt2x00dev, 5, 7, &rf_val); ++ rf_val &= (~0x7F); ++ rf_val |= rx_agc_fc; ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 7, rf_val); ++ } ++ ++ usleep_range(500, 1000); ++ ++ rt2800_bbp_core_soft_reset(rt2x00dev, false, is_ht40); ++ ++ cal_r32_val = rt2800_lp_tx_filter_bw_cal(rt2x00dev); ++ ++ cal_diff = cal_r32_init - cal_r32_val; ++ ++ if (btxcal) ++ cmm_agc_fc = tx_agc_fc; ++ else ++ cmm_agc_fc = rx_agc_fc; ++ ++ if (((cal_diff > filter_target) && (cmm_agc_fc == 0)) || ++ ((cal_diff < filter_target) && (cmm_agc_fc == 0x3f))) { ++ if (btxcal) ++ tx_agc_fc = 0; ++ else ++ rx_agc_fc = 0; ++ } else if ((cal_diff <= filter_target) && (cmm_agc_fc < 0x3f)) { ++ if (btxcal) ++ tx_agc_fc++; ++ else ++ rx_agc_fc++; ++ goto do_cal; ++ } ++ ++ if (btxcal) { ++ if (loop == 0) ++ drv_data->tx_calibration_bw20 = tx_agc_fc; ++ else ++ drv_data->tx_calibration_bw40 = tx_agc_fc; ++ } else { ++ if (loop == 0) ++ drv_data->rx_calibration_bw20 = rx_agc_fc; ++ else ++ drv_data->rx_calibration_bw40 = rx_agc_fc; ++ } ++ ++ loop++; ++ } while (loop <= 1); ++ ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 0, saverfb5r00); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 1, saverfb5r01); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 3, saverfb5r03); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 4, saverfb5r04); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 5, saverfb5r05); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 6, saverfb5r06); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 7, saverfb5r07); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 8, saverfb5r08); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 17, saverfb5r17); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 18, saverfb5r18); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 19, saverfb5r19); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 20, saverfb5r20); ++ ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 37, saverfb5r37); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 38, saverfb5r38); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 39, saverfb5r39); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 40, saverfb5r40); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 41, saverfb5r41); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 42, saverfb5r42); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 43, saverfb5r43); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 44, saverfb5r44); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 45, saverfb5r45); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 46, saverfb5r46); ++ ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 58, saverfb5r58); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 59, saverfb5r59); ++ ++ rt2800_bbp_write(rt2x00dev, 23, savebbpr23); ++ ++ rt2800_bbp_dcoc_write(rt2x00dev, 0, savebbp159r0); ++ rt2800_bbp_dcoc_write(rt2x00dev, 2, savebbp159r2); ++ ++ rt2800_bbp_read(rt2x00dev, 4, &bbp_val); ++ rt2x00_set_field8(&bbp_val, BBP4_BANDWIDTH, ++ 2 * test_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags)); ++ rt2800_bbp_write(rt2x00dev, 4, bbp_val); ++ ++ rt2800_register_write(rt2x00dev, RF_CONTROL0, MAC_RF_CONTROL0); ++ rt2800_register_write(rt2x00dev, RF_BYPASS0, MAC_RF_BYPASS0); ++} ++ ++static void rt2800_init_rfcsr_6352(struct rt2x00_dev *rt2x00dev) ++{ ++ /* Initialize RF central register to default value */ ++ rt2800_rfcsr_write(rt2x00dev, 0, 0x02); ++ rt2800_rfcsr_write(rt2x00dev, 1, 0x03); ++ rt2800_rfcsr_write(rt2x00dev, 2, 0x33); ++ rt2800_rfcsr_write(rt2x00dev, 3, 0xFF); ++ rt2800_rfcsr_write(rt2x00dev, 4, 0x0C); ++ rt2800_rfcsr_write(rt2x00dev, 5, 0x40); ++ rt2800_rfcsr_write(rt2x00dev, 6, 0x00); ++ rt2800_rfcsr_write(rt2x00dev, 7, 0x00); ++ rt2800_rfcsr_write(rt2x00dev, 8, 0x00); ++ rt2800_rfcsr_write(rt2x00dev, 9, 0x00); ++ rt2800_rfcsr_write(rt2x00dev, 10, 0x00); ++ rt2800_rfcsr_write(rt2x00dev, 11, 0x00); ++ rt2800_rfcsr_write(rt2x00dev, 12, rt2x00dev->freq_offset); ++ rt2800_rfcsr_write(rt2x00dev, 13, 0x00); ++ rt2800_rfcsr_write(rt2x00dev, 14, 0x40); ++ rt2800_rfcsr_write(rt2x00dev, 15, 0x22); ++ rt2800_rfcsr_write(rt2x00dev, 16, 0x4C); ++ rt2800_rfcsr_write(rt2x00dev, 17, 0x00); ++ rt2800_rfcsr_write(rt2x00dev, 18, 0x00); ++ rt2800_rfcsr_write(rt2x00dev, 19, 0x00); ++ rt2800_rfcsr_write(rt2x00dev, 20, 0xA0); ++ rt2800_rfcsr_write(rt2x00dev, 21, 0x12); ++ rt2800_rfcsr_write(rt2x00dev, 22, 0x07); ++ rt2800_rfcsr_write(rt2x00dev, 23, 0x13); ++ rt2800_rfcsr_write(rt2x00dev, 24, 0xFE); ++ rt2800_rfcsr_write(rt2x00dev, 25, 0x24); ++ rt2800_rfcsr_write(rt2x00dev, 26, 0x7A); ++ rt2800_rfcsr_write(rt2x00dev, 27, 0x00); ++ rt2800_rfcsr_write(rt2x00dev, 28, 0x00); ++ rt2800_rfcsr_write(rt2x00dev, 29, 0x05); ++ rt2800_rfcsr_write(rt2x00dev, 30, 0x00); ++ rt2800_rfcsr_write(rt2x00dev, 31, 0x00); ++ rt2800_rfcsr_write(rt2x00dev, 32, 0x00); ++ rt2800_rfcsr_write(rt2x00dev, 33, 0x00); ++ rt2800_rfcsr_write(rt2x00dev, 34, 0x00); ++ rt2800_rfcsr_write(rt2x00dev, 35, 0x00); ++ rt2800_rfcsr_write(rt2x00dev, 36, 0x00); ++ rt2800_rfcsr_write(rt2x00dev, 37, 0x00); ++ rt2800_rfcsr_write(rt2x00dev, 38, 0x00); ++ rt2800_rfcsr_write(rt2x00dev, 39, 0x00); ++ rt2800_rfcsr_write(rt2x00dev, 40, 0x00); ++ rt2800_rfcsr_write(rt2x00dev, 41, 0xD0); ++ rt2800_rfcsr_write(rt2x00dev, 42, 0x5B); ++ rt2800_rfcsr_write(rt2x00dev, 43, 0x00); ++ ++ rt2800_rfcsr_write(rt2x00dev, 11, 0x21); ++ if (rt2800_clk_is_20mhz(rt2x00dev)) ++ rt2800_rfcsr_write(rt2x00dev, 13, 0x03); ++ else ++ rt2800_rfcsr_write(rt2x00dev, 13, 0x00); ++ rt2800_rfcsr_write(rt2x00dev, 14, 0x7C); ++ rt2800_rfcsr_write(rt2x00dev, 16, 0x80); ++ rt2800_rfcsr_write(rt2x00dev, 17, 0x99); ++ rt2800_rfcsr_write(rt2x00dev, 18, 0x99); ++ rt2800_rfcsr_write(rt2x00dev, 19, 0x09); ++ rt2800_rfcsr_write(rt2x00dev, 20, 0x50); ++ rt2800_rfcsr_write(rt2x00dev, 21, 0xB0); ++ rt2800_rfcsr_write(rt2x00dev, 22, 0x00); ++ rt2800_rfcsr_write(rt2x00dev, 23, 0x06); ++ rt2800_rfcsr_write(rt2x00dev, 24, 0x00); ++ rt2800_rfcsr_write(rt2x00dev, 25, 0x00); ++ rt2800_rfcsr_write(rt2x00dev, 26, 0x5D); ++ rt2800_rfcsr_write(rt2x00dev, 27, 0x00); ++ rt2800_rfcsr_write(rt2x00dev, 28, 0x61); ++ rt2800_rfcsr_write(rt2x00dev, 29, 0xB5); ++ rt2800_rfcsr_write(rt2x00dev, 43, 0x02); ++ ++ rt2800_rfcsr_write(rt2x00dev, 28, 0x62); ++ rt2800_rfcsr_write(rt2x00dev, 29, 0xAD); ++ rt2800_rfcsr_write(rt2x00dev, 39, 0x80); ++ ++ /* Initialize RF channel register to default value */ ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 0, 0x03); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 1, 0x00); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 2, 0x00); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 3, 0x00); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 4, 0x00); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 5, 0x08); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 6, 0x00); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 7, 0x51); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 8, 0x53); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 9, 0x16); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 10, 0x61); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 11, 0x53); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 12, 0x22); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 13, 0x3D); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x06); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 15, 0x13); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 16, 0x22); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x27); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 18, 0x02); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 19, 0xA7); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 20, 0x01); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 21, 0x52); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 22, 0x80); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 23, 0xB3); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 24, 0x00); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 25, 0x00); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 26, 0x00); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 27, 0x00); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 28, 0x5C); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 29, 0x6B); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 30, 0x6B); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 31, 0x31); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 32, 0x5D); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 33, 0x00); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 34, 0xE6); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 35, 0x55); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 36, 0x00); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 37, 0xBB); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 38, 0xB3); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 39, 0xB3); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 40, 0x03); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 41, 0x00); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 42, 0x00); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0xB3); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0xD3); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0xD5); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 46, 0x07); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x68); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xEF); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 49, 0x1C); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x07); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0xA8); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0x85); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 57, 0x10); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x07); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0x6A); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0x85); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 61, 0x10); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 62, 0x1C); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 63, 0x00); ++ ++ rt2800_rfcsr_write_bank(rt2x00dev, 6, 45, 0xC5); ++ ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 9, 0x47); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 10, 0x71); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 11, 0x33); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x0E); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x23); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 19, 0xA4); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 20, 0x02); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 21, 0x12); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 28, 0x1C); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 29, 0xEB); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 32, 0x7D); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 34, 0xD6); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 36, 0x08); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 38, 0xB4); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0xD3); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0xB3); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0xD5); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 46, 0x27); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x69); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xFF); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x20); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x66); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xFF); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 57, 0x1C); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x20); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0x6B); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xF7); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 61, 0x09); ++ ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 10, 0x51); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x06); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 19, 0xA7); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 28, 0x2C); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x64); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 8, 0x51); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 9, 0x36); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 11, 0x53); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x16); ++ ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x6C); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xFC); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 49, 0x1F); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x27); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x66); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0x6B); ++ ++ /* Initialize RF channel register for DRQFN */ ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0xD3); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0xE3); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0xE5); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x28); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x68); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xF7); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x02); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xC7); ++ ++ /* Initialize RF DC calibration register to default value */ ++ rt2800_rfcsr_write_dccal(rt2x00dev, 0, 0x47); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 1, 0x00); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 2, 0x00); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 3, 0x00); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 4, 0x00); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 6, 0x10); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 7, 0x10); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 8, 0x04); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 9, 0x00); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 10, 0x07); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 11, 0x01); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 12, 0x07); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 13, 0x07); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 14, 0x07); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 15, 0x20); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 16, 0x22); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x00); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 18, 0x00); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 19, 0x00); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 20, 0x00); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 21, 0xF1); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 22, 0x11); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 23, 0x02); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 24, 0x41); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 25, 0x20); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 26, 0x00); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 27, 0xD7); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 28, 0xA2); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 29, 0x20); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 30, 0x49); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 31, 0x20); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 32, 0x04); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 33, 0xF1); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 34, 0xA1); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 35, 0x01); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 41, 0x00); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 42, 0x00); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 43, 0x00); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 44, 0x00); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 45, 0x00); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 46, 0x00); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 47, 0x3E); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 48, 0x3D); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 49, 0x3E); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 50, 0x3D); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 51, 0x3E); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 52, 0x3D); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 53, 0x00); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 54, 0x00); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 55, 0x00); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 56, 0x00); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 57, 0x00); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 58, 0x10); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x10); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 60, 0x0A); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 61, 0x00); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 62, 0x00); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 63, 0x00); ++ ++ rt2800_rfcsr_write_dccal(rt2x00dev, 3, 0x08); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 4, 0x04); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x20); ++ ++ rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C); ++ ++ rt2800_bw_filter_calibration(rt2x00dev, true); ++ rt2800_bw_filter_calibration(rt2x00dev, false); ++} ++ + static void rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev) + { + if (rt2800_is_305x_soc(rt2x00dev)) { +@@ -6941,6 +8279,9 @@ static void rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev) + case RT5592: + rt2800_init_rfcsr_5592(rt2x00dev); + break; ++ case RT6352: ++ rt2800_init_rfcsr_6352(rt2x00dev); ++ break; + } + } + +@@ -7307,7 +8648,8 @@ static int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev) + */ + if (rt2x00_rt(rt2x00dev, RT3290) || + rt2x00_rt(rt2x00dev, RT5390) || +- rt2x00_rt(rt2x00dev, RT5392)) ++ rt2x00_rt(rt2x00dev, RT5392) || ++ rt2x00_rt(rt2x00dev, RT6352)) + rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf); + else if (rt2x00_rt(rt2x00dev, RT3352)) + rf = RF3322; +@@ -7339,6 +8681,7 @@ static int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev) + case RF5390: + case RF5392: + case RF5592: ++ case RF7620: + break; + default: + rt2x00_err(rt2x00dev, "Invalid RF chipset 0x%04x detected\n", +@@ -7746,6 +9089,23 @@ static const struct rf_channel rf_vals_5592_xtal40[] = { + {196, 83, 0, 12, 1}, + }; + ++static const struct rf_channel rf_vals_7620[] = { ++ {1, 0x50, 0x99, 0x99, 1}, ++ {2, 0x50, 0x44, 0x44, 2}, ++ {3, 0x50, 0xEE, 0xEE, 2}, ++ {4, 0x50, 0x99, 0x99, 3}, ++ {5, 0x51, 0x44, 0x44, 0}, ++ {6, 0x51, 0xEE, 0xEE, 0}, ++ {7, 0x51, 0x99, 0x99, 1}, ++ {8, 0x51, 0x44, 0x44, 2}, ++ {9, 0x51, 0xEE, 0xEE, 2}, ++ {10, 0x51, 0x99, 0x99, 3}, ++ {11, 0x52, 0x44, 0x44, 0}, ++ {12, 0x52, 0xEE, 0xEE, 0}, ++ {13, 0x52, 0x99, 0x99, 1}, ++ {14, 0x52, 0x33, 0x33, 3}, ++}; ++ + static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev) + { + struct hw_mode_spec *spec = &rt2x00dev->spec; +@@ -7849,6 +9209,11 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev) + spec->channels = rf_vals_3x; + break; + ++ case RF7620: ++ spec->num_channels = ARRAY_SIZE(rf_vals_7620); ++ spec->channels = rf_vals_7620; ++ break; ++ + case RF3052: + case RF3053: + spec->num_channels = ARRAY_SIZE(rf_vals_3x); +@@ -7980,6 +9345,7 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev) + case RF5390: + case RF5392: + case RF5592: ++ case RF7620: + __set_bit(CAPABILITY_VCO_RECALIBRATION, &rt2x00dev->cap_flags); + break; + } +@@ -8024,6 +9390,9 @@ static int rt2800_probe_rt(struct rt2x00_dev *rt2x00dev) + return -ENODEV; + } + ++ if (rt == RT5390 && rt2x00_is_soc(rt2x00dev)) ++ rt = RT6352; ++ + rt2x00_set_rt(rt2x00dev, rt, rev); + + return 0; +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h +index d9ef260d542a..f357531d9488 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h ++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h +@@ -33,6 +33,10 @@ + struct rt2800_drv_data { + u8 calibration_bw20; + u8 calibration_bw40; ++ char rx_calibration_bw20; ++ char rx_calibration_bw40; ++ char tx_calibration_bw20; ++ char tx_calibration_bw40; + u8 bbp25; + u8 bbp26; + u8 txmixer_gain_24g; +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00.h b/drivers/net/wireless/ralink/rt2x00/rt2x00.h +index ce340bfd71a0..8fdd2f9726ee 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h ++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h +@@ -174,6 +174,7 @@ struct rt2x00_chip { + #define RT5390 0x5390 /* 2.4GHz */ + #define RT5392 0x5392 /* 2.4GHz */ + #define RT5592 0x5592 ++#define RT6352 0x6352 /* WSOC 2.4GHz */ + + u16 rf; + u16 rev; +-- +2.12.1 + diff --git a/package/kernel/mac80211/patches/021-01-rt2800-fix-LNA-gain-assignment-for-MT7620.patch b/package/kernel/mac80211/patches/021-01-rt2800-fix-LNA-gain-assignment-for-MT7620.patch new file mode 100644 index 0000000000..3270ea2c56 --- /dev/null +++ b/package/kernel/mac80211/patches/021-01-rt2800-fix-LNA-gain-assignment-for-MT7620.patch @@ -0,0 +1,54 @@ +From 0109238d62a99ea779a7e28e21868118e7b8d69d Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Mon, 10 Apr 2017 14:28:14 +0200 +Subject: [PATCH 1/2] rt2800: fix LNA gain assignment for MT7620 +To: Stanislaw Gruszka +Cc: Helmut Schaa , + linux-wireless@vger.kernel.org, + Kalle Valo + +The base value used for MT7620 differs from Rt5392 which resulted in +quite bad RX signal quality. Fix this by using the correct base value as +well as the LNA calibration values for HT20. + +Reported-by: Tom Psyborg +Signed-off-by: Daniel Golle +--- + drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 18 ++++++++++++++++-- + 1 file changed, 16 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +index ba06ac2d876d..7135519a638c 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +@@ -3806,11 +3806,25 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, + } + + if (rt2x00_rt(rt2x00dev, RT5592) || rt2x00_rt(rt2x00dev, RT6352)) { ++ reg = 0x10; ++ if (!conf_is_ht40(conf)) { ++ if (rt2x00_rt(rt2x00dev, RT6352) && ++ rt2x00_has_cap_external_lna_bg(rt2x00dev)) { ++ reg |= 0x5; ++ } else { ++ reg |= 0xa; ++ } ++ } + rt2800_bbp_write(rt2x00dev, 195, 141); +- rt2800_bbp_write(rt2x00dev, 196, conf_is_ht40(conf) ? 0x10 : 0x1a); ++ rt2800_bbp_write(rt2x00dev, 196, reg); + + /* AGC init */ +- reg = (rf->channel <= 14 ? 0x1c : 0x24) + 2 * rt2x00dev->lna_gain; ++ if (rt2x00_rt(rt2x00dev, RT6352)) ++ reg = 0x04; ++ else ++ reg = rf->channel <= 14 ? 0x1c : 0x24; ++ ++ reg += 2 * rt2x00dev->lna_gain; + rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg); + + rt2800_iq_calibrate(rt2x00dev, rf->channel); +-- +2.12.2 + diff --git a/package/kernel/mac80211/patches/021-02-rt2800-do-VCO-calibration-after-programming-ALC.patch b/package/kernel/mac80211/patches/021-02-rt2800-do-VCO-calibration-after-programming-ALC.patch new file mode 100644 index 0000000000..1dafb78f1c --- /dev/null +++ b/package/kernel/mac80211/patches/021-02-rt2800-do-VCO-calibration-after-programming-ALC.patch @@ -0,0 +1,34 @@ +From feb608c7986c14bab153f31f8e96f251072e6578 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Mon, 10 Apr 2017 15:33:20 +0200 +Subject: [PATCH 2/2] rt2800: do VCO calibration after programming ALC +To: Stanislaw Gruszka +Cc: Helmut Schaa , + linux-wireless@vger.kernel.org, + Kalle Valo + +Scanning fails if we don't do VCO calibration every time. +The vendor driver duplicates the VCO calibration function into the +channel switching logic, we can do the same with less duplication. + +Signed-off-by: Daniel Golle +--- + drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +index 7135519a638c..870bf315f98b 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +@@ -3407,6 +3407,8 @@ static void rt2800_config_alc(struct rt2x00_dev *rt2x00dev, + rt2800_rfcsr_write(rt2x00dev, 42, 0x5b); + } + rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, mac_sys_ctrl); ++ ++ rt2800_vco_calibration(rt2x00dev); + } + + static void rt2800_bbp_write_with_rx_chain(struct rt2x00_dev *rt2x00dev, +-- +2.12.2 + diff --git a/package/kernel/mac80211/patches/021-03-rt2800-fix-mt7620-vco-calibration-registers.patch b/package/kernel/mac80211/patches/021-03-rt2800-fix-mt7620-vco-calibration-registers.patch new file mode 100644 index 0000000000..708b0b2d31 --- /dev/null +++ b/package/kernel/mac80211/patches/021-03-rt2800-fix-mt7620-vco-calibration-registers.patch @@ -0,0 +1,50 @@ +From 02c452f317b4a4d06c433c294e66896a389731c1 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Tue, 18 Apr 2017 11:09:53 +0200 +Subject: [PATCH] rt2800: fix mt7620 vco calibration registers +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +To: Stanislaw Gruszka +Cc: Helmut Schaa , + linux-wireless@vger.kernel.org, + Kalle Valo , + Tom Psyborg + +Use register values from init LNA function instead of the ones from +restore LNA function. Apply register values based on rx path +configuration. + +Signed-off-by: Tomislav Požega +Signed-off-by: Daniel Golle +--- + drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +index 870bf315f98b..86cffee6876a 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +@@ -4932,7 +4932,7 @@ void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev) + rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin); + + if (rt2x00_rt(rt2x00dev, RT6352)) { +- if (rt2x00dev->default_ant.tx_chain_num == 1) { ++ if (rt2x00dev->default_ant.rx_chain_num == 1) { + rt2800_bbp_write(rt2x00dev, 91, 0x07); + rt2800_bbp_write(rt2x00dev, 95, 0x1A); + rt2800_bbp_write(rt2x00dev, 195, 128); +@@ -4953,8 +4953,8 @@ void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev) + } + + if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) { +- rt2800_bbp_write(rt2x00dev, 75, 0x60); +- rt2800_bbp_write(rt2x00dev, 76, 0x44); ++ rt2800_bbp_write(rt2x00dev, 75, 0x68); ++ rt2800_bbp_write(rt2x00dev, 76, 0x4C); + rt2800_bbp_write(rt2x00dev, 79, 0x1C); + rt2800_bbp_write(rt2x00dev, 80, 0x0C); + rt2800_bbp_write(rt2x00dev, 82, 0xB6); +-- +2.12.2 + diff --git a/package/kernel/mac80211/patches/021-04-rt2800-fix-mt7620-E2-channel-registers.patch b/package/kernel/mac80211/patches/021-04-rt2800-fix-mt7620-E2-channel-registers.patch new file mode 100644 index 0000000000..284a347f25 --- /dev/null +++ b/package/kernel/mac80211/patches/021-04-rt2800-fix-mt7620-E2-channel-registers.patch @@ -0,0 +1,41 @@ +From c426cb0ed15ee12dfdc8c53ddd1449ac617023cf Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Tue, 18 Apr 2017 11:45:37 +0200 +Subject: [PATCH] rt2800: fix mt7620 E2 channel registers +To: Stanislaw Gruszka +Cc: Helmut Schaa , + linux-wireless@vger.kernel.org, + Kalle Valo , + Tom Psyborg + +From: Tomislav Požega + +update RF register 47 and 54 values according to vendor driver + +Signed-off-by: Tomislav Požega +Signed-off-by: Daniel Golle +--- + drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +index 86cffee6876a..8585cdc3de53 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +@@ -8145,9 +8145,11 @@ static void rt2800_init_rfcsr_6352(struct rt2x00_dev *rt2x00dev) + rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0xB3); + rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0xD5); + rt2800_rfcsr_write_chanreg(rt2x00dev, 46, 0x27); +- rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x69); ++ rt2800_rfcsr_write_bank(rt2x00dev, 4, 47, 0x67); ++ rt2800_rfcsr_write_bank(rt2x00dev, 6, 47, 0x69); + rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xFF); +- rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x20); ++ rt2800_rfcsr_write_bank(rt2x00dev, 4, 54, 0x27); ++ rt2800_rfcsr_write_bank(rt2x00dev, 6, 54, 0x20); + rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x66); + rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xFF); + rt2800_rfcsr_write_chanreg(rt2x00dev, 57, 0x1C); +-- +2.12.2 + diff --git a/package/kernel/mac80211/patches/060-no_local_ssb_bcma.patch b/package/kernel/mac80211/patches/060-no_local_ssb_bcma.patch index 1fc52f9ab0..527938f015 100644 --- a/package/kernel/mac80211/patches/060-no_local_ssb_bcma.patch +++ b/package/kernel/mac80211/patches/060-no_local_ssb_bcma.patch @@ -1,6 +1,6 @@ ---- a/local-symbols -+++ b/local-symbols -@@ -383,45 +383,6 @@ USB_IPHETH= +--- a/.local-symbols ++++ b/.local-symbols +@@ -482,45 +482,6 @@ USB_IPHETH= USB_SIERRA_NET= USB_VL600= USB_NET_CH9200= @@ -48,7 +48,7 @@ NFC_NCI= --- a/drivers/net/wireless/broadcom/b43/main.c +++ b/drivers/net/wireless/broadcom/b43/main.c -@@ -2876,7 +2876,7 @@ static struct ssb_device *b43_ssb_gpio_d +@@ -2866,7 +2866,7 @@ static struct ssb_device *b43_ssb_gpio_d { struct ssb_bus *bus = dev->dev->sdev->bus; @@ -57,7 +57,7 @@ return (bus->chipco.dev ? bus->chipco.dev : bus->pcicore.dev); #else return bus->chipco.dev; -@@ -4893,7 +4893,7 @@ static int b43_wireless_core_init(struct +@@ -4883,7 +4883,7 @@ static int b43_wireless_core_init(struct } if (sprom->boardflags_lo & B43_BFL_XTAL_NOSLOW) hf |= B43_HF_DSCRQ; /* Disable slowclock requests from ucode. */ @@ -110,7 +110,7 @@ --- a/Kconfig.sources +++ b/Kconfig.sources @@ -9,9 +9,6 @@ source "$BACKPORT_DIR/drivers/net/wirele - #source "$BACKPORT_DIR/drivers/net/ethernet/Kconfig" + source "$BACKPORT_DIR/drivers/net/ethernet/Kconfig" source "$BACKPORT_DIR/drivers/net/usb/Kconfig" -source "$BACKPORT_DIR/drivers/ssb/Kconfig" @@ -118,15 +118,15 @@ - source "$BACKPORT_DIR/net/nfc/Kconfig" - #source "$BACKPORT_DIR/drivers/media/Kconfig" + source "$BACKPORT_DIR/drivers/media/Kconfig" --- a/Makefile.kernel +++ b/Makefile.kernel -@@ -39,8 +39,6 @@ obj-$(CPTCFG_MAC80211) += net/mac80211/ +@@ -38,8 +38,6 @@ obj-$(CPTCFG_MAC80211) += net/mac80211/ obj-$(CPTCFG_WLAN) += drivers/net/wireless/ - #obj-$(CPTCFG_BT) += net/bluetooth/ - #obj-$(CPTCFG_BT) += drivers/bluetooth/ + obj-$(CPTCFG_BT) += net/bluetooth/ + obj-$(CPTCFG_BT) += drivers/bluetooth/ -obj-$(CPTCFG_SSB) += drivers/ssb/ -obj-$(CPTCFG_BCMA) += drivers/bcma/ - #obj-$(CPTCFG_ETHERNET) += drivers/net/ethernet/ + obj-$(CPTCFG_ETHERNET) += drivers/net/ethernet/ obj-$(CPTCFG_USB_NET_RNDIS_WLAN) += drivers/net/usb/ obj-$(CPTCFG_NFC) += net/nfc/ diff --git a/package/kernel/mac80211/patches/080-ath10k_thermal_config.patch b/package/kernel/mac80211/patches/080-ath10k_thermal_config.patch index 796615b03c..e08fa32a3b 100644 --- a/package/kernel/mac80211/patches/080-ath10k_thermal_config.patch +++ b/package/kernel/mac80211/patches/080-ath10k_thermal_config.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath10k/Kconfig +++ b/drivers/net/wireless/ath/ath10k/Kconfig -@@ -65,6 +65,12 @@ config ATH10K_TRACING +@@ -48,6 +48,12 @@ config ATH10K_TRACING ---help--- Select this to ath10k use tracing infrastructure. diff --git a/package/kernel/mac80211/patches/090-remove-cred.patch b/package/kernel/mac80211/patches/090-remove-cred.patch new file mode 100644 index 0000000000..3adb2afb86 --- /dev/null +++ b/package/kernel/mac80211/patches/090-remove-cred.patch @@ -0,0 +1,15 @@ +This is only needed for kernel < 2.6.29 and conflicts with kernel 4.4.42 + +--- a/backport-include/linux/cred.h ++++ /dev/null +@@ -1,10 +0,0 @@ +-#ifndef __BACKPORT_LINUX_CRED_H +-#define __BACKPORT_LINUX_CRED_H +-#include_next +-#include +- +-#ifndef current_user_ns +-#define current_user_ns() (current->nsproxy->user_ns) +-#endif +- +-#endif /* __BACKPORT_LINUX_CRED_H */ diff --git a/package/kernel/mac80211/patches/100-remove-cryptoapi-dependencies.patch b/package/kernel/mac80211/patches/100-remove-cryptoapi-dependencies.patch index 0febc57b3f..95fea441a4 100644 --- a/package/kernel/mac80211/patches/100-remove-cryptoapi-dependencies.patch +++ b/package/kernel/mac80211/patches/100-remove-cryptoapi-dependencies.patch @@ -6,9 +6,9 @@ depends on CRYPTO_AES - select BPAUTO_CRYPTO_CCM - depends on CRYPTO_GCM - depends on CRYPTO_CMAC depends on CRC32 ---help--- + This option enables the hardware independent IEEE 802.11 --- a/net/mac80211/Makefile +++ b/net/mac80211/Makefile @@ -16,9 +16,7 @@ mac80211-y := \ @@ -43,118 +43,122 @@ - struct aead_request *aead_req; - int reqsize = sizeof(*aead_req) + crypto_aead_reqsize(tfm); - u8 *__aad; -+ int i; - +- - aead_req = kzalloc(reqsize + CCM_AAD_LEN, GFP_ATOMIC); - if (!aead_req) - return -ENOMEM; -+ crypto_cipher_encrypt_one(tfm, b, b_0); - +- - __aad = (u8 *)aead_req + reqsize; - memcpy(__aad, aad, CCM_AAD_LEN); -+ /* Extra Authenticate-only data (always two AES blocks) */ -+ for (i = 0; i < AES_BLOCK_SIZE; i++) -+ aad[i] ^= b[i]; -+ crypto_cipher_encrypt_one(tfm, b, aad); - +- - sg_init_table(sg, 3); - sg_set_buf(&sg[0], &__aad[2], be16_to_cpup((__be16 *)__aad)); - sg_set_buf(&sg[1], data, data_len); - sg_set_buf(&sg[2], mic, mic_len); -+ aad += AES_BLOCK_SIZE; - +- - aead_request_set_tfm(aead_req, tfm); - aead_request_set_crypt(aead_req, sg, sg, data_len, b_0); - aead_request_set_ad(aead_req, sg[0].length); -+ for (i = 0; i < AES_BLOCK_SIZE; i++) -+ aad[i] ^= b[i]; -+ crypto_cipher_encrypt_one(tfm, a, aad); ++ int i; - crypto_aead_encrypt(aead_req); - kzfree(aead_req); -+ /* Mask out bits from auth-only-b_0 */ -+ b_0[0] &= 0x07; ++ crypto_cipher_encrypt_one(tfm, b, b_0); - return 0; ++ /* Extra Authenticate-only data (always two AES blocks) */ ++ for (i = 0; i < AES_BLOCK_SIZE; i++) ++ aad[i] ^= b[i]; ++ crypto_cipher_encrypt_one(tfm, b, aad); ++ ++ aad += AES_BLOCK_SIZE; ++ ++ for (i = 0; i < AES_BLOCK_SIZE; i++) ++ aad[i] ^= b[i]; ++ crypto_cipher_encrypt_one(tfm, a, aad); ++ ++ /* Mask out bits from auth-only-b_0 */ ++ b_0[0] &= 0x07; ++ + /* S_0 is used to encrypt T (= MIC) */ + b_0[14] = 0; + b_0[15] = 0; + crypto_cipher_encrypt_one(tfm, s_0, b_0); - } - --int ieee80211_aes_ccm_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad, -- u8 *data, size_t data_len, u8 *mic, -- size_t mic_len) ++} ++ + +void ieee80211_aes_ccm_encrypt(struct crypto_cipher *tfm, u8 *b_0, u8 *aad, + u8 *data, size_t data_len, u8 *mic, + size_t mic_len) - { -- struct scatterlist sg[3]; -- struct aead_request *aead_req; -- int reqsize = sizeof(*aead_req) + crypto_aead_reqsize(tfm); -- u8 *__aad; -- int err; ++{ + int i, j, last_len, num_blocks; + u8 b[AES_BLOCK_SIZE]; + u8 s_0[AES_BLOCK_SIZE]; + u8 e[AES_BLOCK_SIZE]; + u8 *pos, *cpos; - -- if (data_len == 0) -- return -EINVAL; ++ + num_blocks = DIV_ROUND_UP(data_len, AES_BLOCK_SIZE); + last_len = data_len % AES_BLOCK_SIZE; + aes_ccm_prepare(tfm, b_0, aad, s_0, b, b); - -- aead_req = kzalloc(reqsize + CCM_AAD_LEN, GFP_ATOMIC); -- if (!aead_req) -- return -ENOMEM; ++ + /* Process payload blocks */ + pos = data; + cpos = data; + for (j = 1; j <= num_blocks; j++) { + int blen = (j == num_blocks && last_len) ? + last_len : AES_BLOCK_SIZE; - -- __aad = (u8 *)aead_req + reqsize; -- memcpy(__aad, aad, CCM_AAD_LEN); ++ + /* Authentication followed by encryption */ + for (i = 0; i < blen; i++) + b[i] ^= pos[i]; + crypto_cipher_encrypt_one(tfm, b, b); - -- sg_init_table(sg, 3); -- sg_set_buf(&sg[0], &__aad[2], be16_to_cpup((__be16 *)__aad)); -- sg_set_buf(&sg[1], data, data_len); -- sg_set_buf(&sg[2], mic, mic_len); ++ + b_0[14] = (j >> 8) & 0xff; + b_0[15] = j & 0xff; + crypto_cipher_encrypt_one(tfm, e, b_0); + for (i = 0; i < blen; i++) + *cpos++ = *pos++ ^ e[i]; + } ++ ++ for (i = 0; i < mic_len; i++) ++ mic[i] = b[i] ^ s_0[i]; + } +-int ieee80211_aes_ccm_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad, ++int ieee80211_aes_ccm_decrypt(struct crypto_cipher *tfm, u8 *b_0, u8 *aad, + u8 *data, size_t data_len, u8 *mic, + size_t mic_len) + { +- struct scatterlist sg[3]; +- struct aead_request *aead_req; +- int reqsize = sizeof(*aead_req) + crypto_aead_reqsize(tfm); +- u8 *__aad; +- int err; +- +- if (data_len == 0) +- return -EINVAL; +- +- aead_req = kzalloc(reqsize + CCM_AAD_LEN, GFP_ATOMIC); +- if (!aead_req) +- return -ENOMEM; +- +- __aad = (u8 *)aead_req + reqsize; +- memcpy(__aad, aad, CCM_AAD_LEN); +- +- sg_init_table(sg, 3); +- sg_set_buf(&sg[0], &__aad[2], be16_to_cpup((__be16 *)__aad)); +- sg_set_buf(&sg[1], data, data_len); +- sg_set_buf(&sg[2], mic, mic_len); +- - aead_request_set_tfm(aead_req, tfm); - aead_request_set_crypt(aead_req, sg, sg, data_len + mic_len, b_0); - aead_request_set_ad(aead_req, sg[0].length); -+ for (i = 0; i < mic_len; i++) -+ mic[i] = b[i] ^ s_0[i]; -+} - -- err = crypto_aead_decrypt(aead_req); -- kzfree(aead_req); -+int ieee80211_aes_ccm_decrypt(struct crypto_cipher *tfm, u8 *b_0, u8 *aad, -+ u8 *data, size_t data_len, u8 *mic, -+ size_t mic_len) -+{ + int i, j, last_len, num_blocks; + u8 *pos, *cpos; + u8 a[AES_BLOCK_SIZE]; + u8 b[AES_BLOCK_SIZE]; + u8 s_0[AES_BLOCK_SIZE]; - -- return err; ++ + num_blocks = DIV_ROUND_UP(data_len, AES_BLOCK_SIZE); + last_len = data_len % AES_BLOCK_SIZE; + aes_ccm_prepare(tfm, b_0, aad, s_0, a, b); @@ -181,7 +185,11 @@ + if ((mic[i] ^ s_0[i]) != a[i]) + return -1; + } -+ + +- err = crypto_aead_decrypt(aead_req); +- kzfree(aead_req); +- +- return err; + return 0; } @@ -194,12 +202,12 @@ { - struct crypto_aead *tfm; - int err; -- ++ struct crypto_cipher *tfm; + - tfm = crypto_alloc_aead("ccm(aes)", 0, CRYPTO_ALG_ASYNC); - if (IS_ERR(tfm)) - return tfm; -+ struct crypto_cipher *tfm; - +- - err = crypto_aead_setkey(tfm, key, key_len); - if (err) - goto free_aead; @@ -267,7 +275,7 @@ struct { --- a/net/mac80211/wpa.c +++ b/net/mac80211/wpa.c -@@ -306,7 +306,8 @@ ieee80211_crypto_tkip_decrypt(struct iee +@@ -305,7 +305,8 @@ ieee80211_crypto_tkip_decrypt(struct iee } @@ -277,7 +285,7 @@ { __le16 mask_fc; int a4_included, mgmt; -@@ -336,14 +337,8 @@ static void ccmp_special_blocks(struct s +@@ -335,14 +336,8 @@ static void ccmp_special_blocks(struct s else qos_tid = 0; @@ -294,7 +302,7 @@ /* Nonce: Nonce Flags | A2 | PN * Nonce Flags: Priority (b0..b3) | Management (b4) | Reserved (b5..b7) -@@ -351,6 +346,8 @@ static void ccmp_special_blocks(struct s +@@ -350,6 +345,8 @@ static void ccmp_special_blocks(struct s b_0[1] = qos_tid | (mgmt << 4); memcpy(&b_0[2], hdr->addr2, ETH_ALEN); memcpy(&b_0[8], pn, IEEE80211_CCMP_PN_LEN); @@ -303,7 +311,7 @@ /* AAD (extra authenticate-only data) / masked 802.11 header * FC | A1 | A2 | A3 | SC | [A4] | [QC] */ -@@ -407,7 +404,7 @@ static int ccmp_encrypt_skb(struct ieee8 +@@ -406,7 +403,7 @@ static int ccmp_encrypt_skb(struct ieee8 u8 *pos; u8 pn[6]; u64 pn64; @@ -312,7 +320,7 @@ u8 b_0[AES_BLOCK_SIZE]; if (info->control.hw_key && -@@ -462,9 +459,11 @@ static int ccmp_encrypt_skb(struct ieee8 +@@ -461,9 +458,11 @@ static int ccmp_encrypt_skb(struct ieee8 return 0; pos += IEEE80211_CCMP_HDR_LEN; @@ -327,7 +335,7 @@ } -@@ -537,7 +536,7 @@ ieee80211_crypto_ccmp_decrypt(struct iee +@@ -536,7 +535,7 @@ ieee80211_crypto_ccmp_decrypt(struct iee u8 aad[2 * AES_BLOCK_SIZE]; u8 b_0[AES_BLOCK_SIZE]; /* hardware didn't decrypt/verify MIC */ @@ -336,7 +344,7 @@ if (ieee80211_aes_ccm_decrypt( key->u.ccmp.tfm, b_0, aad, -@@ -639,7 +638,7 @@ static int gcmp_encrypt_skb(struct ieee8 +@@ -638,7 +637,7 @@ static int gcmp_encrypt_skb(struct ieee8 u8 *pos; u8 pn[6]; u64 pn64; @@ -345,7 +353,7 @@ u8 j_0[AES_BLOCK_SIZE]; if (info->control.hw_key && -@@ -696,8 +695,10 @@ static int gcmp_encrypt_skb(struct ieee8 +@@ -695,8 +694,10 @@ static int gcmp_encrypt_skb(struct ieee8 pos += IEEE80211_GCMP_HDR_LEN; gcmp_special_blocks(skb, pn, j_0, aad); @@ -358,7 +366,7 @@ } ieee80211_tx_result -@@ -1121,9 +1122,9 @@ ieee80211_crypto_aes_gmac_encrypt(struct +@@ -1120,9 +1121,9 @@ ieee80211_crypto_aes_gmac_encrypt(struct struct ieee80211_key *key = tx->key; struct ieee80211_mmie_16 *mmie; struct ieee80211_hdr *hdr; @@ -370,7 +378,7 @@ if (WARN_ON(skb_queue_len(&tx->skbs) != 1)) return TX_DROP; -@@ -1169,7 +1170,7 @@ ieee80211_crypto_aes_gmac_decrypt(struct +@@ -1168,7 +1169,7 @@ ieee80211_crypto_aes_gmac_decrypt(struct struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); struct ieee80211_key *key = rx->key; struct ieee80211_mmie_16 *mmie; diff --git a/package/kernel/mac80211/patches/110-mac80211_keep_keys_on_stop_ap.patch b/package/kernel/mac80211/patches/110-mac80211_keep_keys_on_stop_ap.patch index 005e3e5d5d..ff619129d9 100644 --- a/package/kernel/mac80211/patches/110-mac80211_keep_keys_on_stop_ap.patch +++ b/package/kernel/mac80211/patches/110-mac80211_keep_keys_on_stop_ap.patch @@ -2,7 +2,7 @@ Used for AP+STA support in OpenWrt - preserve AP mode keys across STA reconnects --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c -@@ -1056,7 +1056,6 @@ static int ieee80211_stop_ap(struct wiph +@@ -1014,7 +1014,6 @@ static int ieee80211_stop_ap(struct wiph sdata->u.ap.driver_smps_mode = IEEE80211_SMPS_OFF; __sta_info_flush(sdata, true); diff --git a/package/kernel/mac80211/patches/130-disable-fils.patch b/package/kernel/mac80211/patches/130-disable-fils.patch deleted file mode 100644 index 1f03589878..0000000000 --- a/package/kernel/mac80211/patches/130-disable-fils.patch +++ /dev/null @@ -1,32 +0,0 @@ -Disable FILS support, since it pulls in crypto hash support - ---- a/net/mac80211/fils_aead.h -+++ b/net/mac80211/fils_aead.h -@@ -10,7 +10,7 @@ - #ifndef FILS_AEAD_H - #define FILS_AEAD_H - --#if LINUX_VERSION_IS_GEQ(4,3,0) -+#if 0 /* LINUX_VERSION_IS_GEQ(4,3,0) */ - int fils_encrypt_assoc_req(struct sk_buff *skb, - struct ieee80211_mgd_assoc_data *assoc_data); - int fils_decrypt_assoc_resp(struct ieee80211_sub_if_data *sdata, ---- a/net/mac80211/fils_aead.c -+++ b/net/mac80211/fils_aead.c -@@ -1,4 +1,4 @@ --#if LINUX_VERSION_IS_GEQ(4,3,0) -+#if 0 /* LINUX_VERSION_IS_GEQ(4,3,0) */ - /* - * FILS AEAD for (Re)Association Request/Response frames - * Copyright 2016, Qualcomm Atheros, Inc. ---- a/net/mac80211/main.c -+++ b/net/mac80211/main.c -@@ -550,7 +550,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_ - NL80211_FEATURE_MAC_ON_CREATE | - NL80211_FEATURE_USERSPACE_MPM | - NL80211_FEATURE_FULL_AP_CLIENT_STATE; --#if LINUX_VERSION_IS_GEQ(4,3,0) -+#if 0 /* LINUX_VERSION_IS_GEQ(4,3,0) */ - wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_FILS_STA); - #endif - diff --git a/package/kernel/mac80211/patches/130-mac80211-hwsim-hrtimer-clock.patch b/package/kernel/mac80211/patches/130-mac80211-hwsim-hrtimer-clock.patch new file mode 100644 index 0000000000..828ed83cb7 --- /dev/null +++ b/package/kernel/mac80211/patches/130-mac80211-hwsim-hrtimer-clock.patch @@ -0,0 +1,11 @@ +--- a/drivers/net/wireless/mac80211_hwsim.c ++++ b/drivers/net/wireless/mac80211_hwsim.c +@@ -2678,7 +2678,7 @@ static int mac80211_hwsim_new_radio(stru + + tasklet_hrtimer_init(&data->beacon_timer, + mac80211_hwsim_beacon, +- CLOCK_MONOTONIC_RAW, HRTIMER_MODE_ABS); ++ CLOCK_MONOTONIC, HRTIMER_MODE_ABS); + + spin_lock_bh(&hwsim_radio_lock); + list_add_tail(&data->list, &hwsim_radios); diff --git a/package/kernel/mac80211/patches/131-Revert-mac80211-aes-cmac-switch-to-shash-CMAC-driver.patch b/package/kernel/mac80211/patches/131-Revert-mac80211-aes-cmac-switch-to-shash-CMAC-driver.patch deleted file mode 100644 index f2bee9b05c..0000000000 --- a/package/kernel/mac80211/patches/131-Revert-mac80211-aes-cmac-switch-to-shash-CMAC-driver.patch +++ /dev/null @@ -1,198 +0,0 @@ -From: Felix Fietkau -Date: Sat, 7 Oct 2017 09:37:28 +0200 -Subject: [PATCH] Revert "mac80211: aes-cmac: switch to shash CMAC - driver" - -This reverts commit 26717828b75dd5c46e97f7f4a9b937d038bb2852. -Reduces mac80211 dependencies for LEDE - -Signed-off-by: Felix Fietkau ---- - ---- a/net/mac80211/aes_cmac.c -+++ b/net/mac80211/aes_cmac.c -@@ -22,50 +22,126 @@ - #define CMAC_TLEN_256 16 /* CMAC TLen = 128 bits (16 octets) */ - #define AAD_LEN 20 - --static const u8 zero[CMAC_TLEN_256]; - --void ieee80211_aes_cmac(struct crypto_shash *tfm, const u8 *aad, -- const u8 *data, size_t data_len, u8 *mic) -+void gf_mulx(u8 *pad) - { -- SHASH_DESC_ON_STACK(desc, tfm); -- u8 out[AES_BLOCK_SIZE]; -+ int i, carry; - -- desc->tfm = tfm; -+ carry = pad[0] & 0x80; -+ for (i = 0; i < AES_BLOCK_SIZE - 1; i++) -+ pad[i] = (pad[i] << 1) | (pad[i + 1] >> 7); -+ pad[AES_BLOCK_SIZE - 1] <<= 1; -+ if (carry) -+ pad[AES_BLOCK_SIZE - 1] ^= 0x87; -+} - -- crypto_shash_init(desc); -- crypto_shash_update(desc, aad, AAD_LEN); -- crypto_shash_update(desc, data, data_len - CMAC_TLEN); -- crypto_shash_finup(desc, zero, CMAC_TLEN, out); -+void aes_cmac_vector(struct crypto_cipher *tfm, size_t num_elem, -+ const u8 *addr[], const size_t *len, u8 *mac, -+ size_t mac_len) -+{ -+ u8 cbc[AES_BLOCK_SIZE], pad[AES_BLOCK_SIZE]; -+ const u8 *pos, *end; -+ size_t i, e, left, total_len; - -- memcpy(mic, out, CMAC_TLEN); -+ memset(cbc, 0, AES_BLOCK_SIZE); -+ -+ total_len = 0; -+ for (e = 0; e < num_elem; e++) -+ total_len += len[e]; -+ left = total_len; -+ -+ e = 0; -+ pos = addr[0]; -+ end = pos + len[0]; -+ -+ while (left >= AES_BLOCK_SIZE) { -+ for (i = 0; i < AES_BLOCK_SIZE; i++) { -+ cbc[i] ^= *pos++; -+ if (pos >= end) { -+ e++; -+ pos = addr[e]; -+ end = pos + len[e]; -+ } -+ } -+ if (left > AES_BLOCK_SIZE) -+ crypto_cipher_encrypt_one(tfm, cbc, cbc); -+ left -= AES_BLOCK_SIZE; -+ } -+ -+ memset(pad, 0, AES_BLOCK_SIZE); -+ crypto_cipher_encrypt_one(tfm, pad, pad); -+ gf_mulx(pad); -+ -+ if (left || total_len == 0) { -+ for (i = 0; i < left; i++) { -+ cbc[i] ^= *pos++; -+ if (pos >= end) { -+ e++; -+ pos = addr[e]; -+ end = pos + len[e]; -+ } -+ } -+ cbc[left] ^= 0x80; -+ gf_mulx(pad); -+ } -+ -+ for (i = 0; i < AES_BLOCK_SIZE; i++) -+ pad[i] ^= cbc[i]; -+ crypto_cipher_encrypt_one(tfm, pad, pad); -+ memcpy(mac, pad, mac_len); - } - --void ieee80211_aes_cmac_256(struct crypto_shash *tfm, const u8 *aad, -+ -+void ieee80211_aes_cmac(struct crypto_cipher *tfm, const u8 *aad, -+ const u8 *data, size_t data_len, u8 *mic) -+{ -+ const u8 *addr[3]; -+ size_t len[3]; -+ u8 zero[CMAC_TLEN]; -+ -+ memset(zero, 0, CMAC_TLEN); -+ addr[0] = aad; -+ len[0] = AAD_LEN; -+ addr[1] = data; -+ len[1] = data_len - CMAC_TLEN; -+ addr[2] = zero; -+ len[2] = CMAC_TLEN; -+ -+ aes_cmac_vector(tfm, 3, addr, len, mic, CMAC_TLEN); -+} -+ -+void ieee80211_aes_cmac_256(struct crypto_cipher *tfm, const u8 *aad, - const u8 *data, size_t data_len, u8 *mic) - { -- SHASH_DESC_ON_STACK(desc, tfm); -+ const u8 *addr[3]; -+ size_t len[3]; -+ u8 zero[CMAC_TLEN_256]; - -- desc->tfm = tfm; -+ memset(zero, 0, CMAC_TLEN_256); -+ addr[0] = aad; -+ len[0] = AAD_LEN; -+ addr[1] = data; -+ len[1] = data_len - CMAC_TLEN_256; -+ addr[2] = zero; -+ len[2] = CMAC_TLEN_256; - -- crypto_shash_init(desc); -- crypto_shash_update(desc, aad, AAD_LEN); -- crypto_shash_update(desc, data, data_len - CMAC_TLEN_256); -- crypto_shash_finup(desc, zero, CMAC_TLEN_256, mic); -+ aes_cmac_vector(tfm, 3, addr, len, mic, CMAC_TLEN_256); - } - --struct crypto_shash *ieee80211_aes_cmac_key_setup(const u8 key[], -- size_t key_len) -+struct crypto_cipher *ieee80211_aes_cmac_key_setup(const u8 key[], -+ size_t key_len) - { -- struct crypto_shash *tfm; -+ struct crypto_cipher *tfm; - -- tfm = crypto_alloc_shash("cmac(aes)", 0, 0); -+ tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC); - if (!IS_ERR(tfm)) -- crypto_shash_setkey(tfm, key, key_len); -+ crypto_cipher_setkey(tfm, key, key_len); - - return tfm; - } - --void ieee80211_aes_cmac_key_free(struct crypto_shash *tfm) -+ -+void ieee80211_aes_cmac_key_free(struct crypto_cipher *tfm) - { -- crypto_free_shash(tfm); -+ crypto_free_cipher(tfm); - } ---- a/net/mac80211/aes_cmac.h -+++ b/net/mac80211/aes_cmac.h -@@ -10,14 +10,13 @@ - #define AES_CMAC_H - - #include --#include - --struct crypto_shash *ieee80211_aes_cmac_key_setup(const u8 key[], -- size_t key_len); --void ieee80211_aes_cmac(struct crypto_shash *tfm, const u8 *aad, -+struct crypto_cipher *ieee80211_aes_cmac_key_setup(const u8 key[], -+ size_t key_len); -+void ieee80211_aes_cmac(struct crypto_cipher *tfm, const u8 *aad, - const u8 *data, size_t data_len, u8 *mic); --void ieee80211_aes_cmac_256(struct crypto_shash *tfm, const u8 *aad, -+void ieee80211_aes_cmac_256(struct crypto_cipher *tfm, const u8 *aad, - const u8 *data, size_t data_len, u8 *mic); --void ieee80211_aes_cmac_key_free(struct crypto_shash *tfm); -+void ieee80211_aes_cmac_key_free(struct crypto_cipher *tfm); - - #endif /* AES_CMAC_H */ ---- a/net/mac80211/key.h -+++ b/net/mac80211/key.h -@@ -93,7 +93,7 @@ struct ieee80211_key { - } ccmp; - struct { - u8 rx_pn[IEEE80211_CMAC_PN_LEN]; -- struct crypto_shash *tfm; -+ struct crypto_cipher *tfm; - u32 replays; /* dot11RSNAStatsCMACReplays */ - u32 icverrors; /* dot11RSNAStatsCMACICVErrors */ - } aes_cmac; diff --git a/package/kernel/mac80211/patches/132-mac80211-remove-cmac-dependency.patch b/package/kernel/mac80211/patches/132-mac80211-remove-cmac-dependency.patch deleted file mode 100644 index 9d185e61e7..0000000000 --- a/package/kernel/mac80211/patches/132-mac80211-remove-cmac-dependency.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- a/net/mac80211/Kconfig -+++ b/net/mac80211/Kconfig -@@ -5,7 +5,6 @@ config MAC80211 - depends on CRYPTO - depends on CRYPTO_ARC4 - depends on CRYPTO_AES -- depends on CRYPTO_CMAC - depends on CRC32 - ---help--- - This option enables the hardware independent IEEE 802.11 diff --git a/package/kernel/mac80211/patches/150-disable_addr_notifier.patch b/package/kernel/mac80211/patches/150-disable_addr_notifier.patch index 42a692a1fc..ca1e53f8df 100644 --- a/package/kernel/mac80211/patches/150-disable_addr_notifier.patch +++ b/package/kernel/mac80211/patches/150-disable_addr_notifier.patch @@ -1,6 +1,6 @@ --- a/net/mac80211/main.c +++ b/net/mac80211/main.c -@@ -292,7 +292,7 @@ void ieee80211_restart_hw(struct ieee802 +@@ -291,7 +291,7 @@ void ieee80211_restart_hw(struct ieee802 } EXPORT_SYMBOL(ieee80211_restart_hw); @@ -9,7 +9,7 @@ static int ieee80211_ifa_changed(struct notifier_block *nb, unsigned long data, void *arg) { -@@ -351,7 +351,7 @@ static int ieee80211_ifa_changed(struct +@@ -350,7 +350,7 @@ static int ieee80211_ifa_changed(struct } #endif @@ -18,7 +18,7 @@ static int ieee80211_ifa6_changed(struct notifier_block *nb, unsigned long data, void *arg) { -@@ -1115,14 +1115,14 @@ int ieee80211_register_hw(struct ieee802 +@@ -1111,14 +1111,14 @@ int ieee80211_register_hw(struct ieee802 if (result) goto fail_flows; @@ -35,7 +35,7 @@ local->ifa6_notifier.notifier_call = ieee80211_ifa6_changed; result = register_inet6addr_notifier(&local->ifa6_notifier); if (result) -@@ -1131,13 +1131,13 @@ int ieee80211_register_hw(struct ieee802 +@@ -1127,13 +1127,13 @@ int ieee80211_register_hw(struct ieee802 return 0; @@ -52,7 +52,7 @@ fail_ifa: #endif ieee80211_txq_teardown_flows(local); -@@ -1167,10 +1167,10 @@ void ieee80211_unregister_hw(struct ieee +@@ -1163,10 +1163,10 @@ void ieee80211_unregister_hw(struct ieee tasklet_kill(&local->tx_pending_tasklet); tasklet_kill(&local->tasklet); diff --git a/package/kernel/mac80211/patches/210-ap_scan.patch b/package/kernel/mac80211/patches/210-ap_scan.patch index e9999e32b9..3b613bba0e 100644 --- a/package/kernel/mac80211/patches/210-ap_scan.patch +++ b/package/kernel/mac80211/patches/210-ap_scan.patch @@ -1,6 +1,6 @@ --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c -@@ -2212,7 +2212,7 @@ static int ieee80211_scan(struct wiphy * +@@ -2165,7 +2165,7 @@ static int ieee80211_scan(struct wiphy * * the frames sent while scanning on other channel will be * lost) */ diff --git a/package/kernel/mac80211/patches/301-ath9k_hw-issue-external-reset-for-QCA955x.patch b/package/kernel/mac80211/patches/301-ath9k_hw-issue-external-reset-for-QCA955x.patch index 34d7d3b1cf..5eb69b898d 100644 --- a/package/kernel/mac80211/patches/301-ath9k_hw-issue-external-reset-for-QCA955x.patch +++ b/package/kernel/mac80211/patches/301-ath9k_hw-issue-external-reset-for-QCA955x.patch @@ -29,6 +29,21 @@ Signed-off-by: Felix Fietkau - npend = ath9k_hw_numtxpending(ah, i); - if (npend) - break; +- } +- +- if (ah->external_reset && +- (npend || type == ATH9K_RESET_COLD)) { +- int reset_err = 0; +- +- ath_dbg(ath9k_hw_common(ah), RESET, +- "reset MAC via external reset\n"); +- +- reset_err = ah->external_reset(); +- if (reset_err) { +- ath_err(ath9k_hw_common(ah), +- "External reset failed, err=%d\n", +- reset_err); +- return false; + if (type == ATH9K_RESET_COLD) + return true; + @@ -44,47 +59,35 @@ Signed-off-by: Felix Fietkau + for (i = 0; i < AR_NUM_QCU; i++) { + if (ath9k_hw_numtxpending(ah, i)) + return true; -+ } - } - -- if (ah->external_reset && -- (npend || type == ATH9K_RESET_COLD)) { -- int reset_err = 0; + } ++ } ++ + return false; +} - -- ath_dbg(ath9k_hw_common(ah), RESET, -- "reset MAC via external reset\n"); ++ +static bool ath9k_hw_external_reset(struct ath_hw *ah, int type) +{ + int err; - -- reset_err = ah->external_reset(); -- if (reset_err) { -- ath_err(ath9k_hw_common(ah), -- "External reset failed, err=%d\n", -- reset_err); -- return false; -- } ++ + if (!ah->external_reset || !ath9k_hw_need_external_reset(ah, type)) + return true; - -- REG_WRITE(ah, AR_RTC_RESET, 1); ++ + ath_dbg(ath9k_hw_common(ah), RESET, + "reset MAC via external reset\n"); -+ + +- REG_WRITE(ah, AR_RTC_RESET, 1); + err = ah->external_reset(); + if (err) { + ath_err(ath9k_hw_common(ah), + "External reset failed, err=%d\n", err); + return false; -+ } -+ + } + + if (AR_SREV_9550(ah)) { + REG_WRITE(ah, AR_RTC_RESET, 0); + udelay(10); - } - ++ } ++ + REG_WRITE(ah, AR_RTC_RESET, 1); + udelay(10); + diff --git a/package/kernel/mac80211/patches/304-ath9k-force-rx_clear-when-disabling-rx.patch b/package/kernel/mac80211/patches/304-ath9k-force-rx_clear-when-disabling-rx.patch index 8aaccf49b4..eb6862db6d 100644 --- a/package/kernel/mac80211/patches/304-ath9k-force-rx_clear-when-disabling-rx.patch +++ b/package/kernel/mac80211/patches/304-ath9k-force-rx_clear-when-disabling-rx.patch @@ -12,7 +12,7 @@ Signed-off-by: Helmut Schaa --- a/drivers/net/wireless/ath/ath9k/mac.c +++ b/drivers/net/wireless/ath/ath9k/mac.c -@@ -678,13 +678,18 @@ void ath9k_hw_startpcureceive(struct ath +@@ -677,13 +677,18 @@ void ath9k_hw_startpcureceive(struct ath ath9k_ani_reset(ah, is_scanning); diff --git a/package/kernel/mac80211/patches/305-ath9k-limit-retries-for-powersave-response-frames.patch b/package/kernel/mac80211/patches/305-ath9k-limit-retries-for-powersave-response-frames.patch index 31825b819c..5923594be3 100644 --- a/package/kernel/mac80211/patches/305-ath9k-limit-retries-for-powersave-response-frames.patch +++ b/package/kernel/mac80211/patches/305-ath9k-limit-retries-for-powersave-response-frames.patch @@ -40,7 +40,7 @@ Signed-off-by: Felix Fietkau } static void ath_txq_skb_done(struct ath_softc *sc, struct ath_txq *txq, -@@ -1502,7 +1517,7 @@ ath_tx_form_burst(struct ath_softc *sc, +@@ -1522,7 +1537,7 @@ ath_tx_form_burst(struct ath_softc *sc, break; } @@ -49,7 +49,7 @@ Signed-off-by: Felix Fietkau } while (1); } -@@ -1532,7 +1547,7 @@ static bool ath_tx_sched_aggr(struct ath +@@ -1552,7 +1567,7 @@ static bool ath_tx_sched_aggr(struct ath return false; } @@ -58,7 +58,7 @@ Signed-off-by: Felix Fietkau if (aggr) aggr_len = ath_tx_form_aggr(sc, txq, tid, &bf_q, bf); else -@@ -1690,7 +1705,7 @@ void ath9k_release_buffered_frames(struc +@@ -1710,7 +1725,7 @@ void ath9k_release_buffered_frames(struc break; list_add_tail(&bf->list, &bf_q); @@ -67,7 +67,7 @@ Signed-off-by: Felix Fietkau if (bf_isampdu(bf)) { ath_tx_addto_baw(sc, tid, bf); bf->bf_state.bf_type &= ~BUF_AGGR; -@@ -2390,7 +2405,7 @@ int ath_tx_start(struct ieee80211_hw *hw +@@ -2410,7 +2425,7 @@ int ath_tx_start(struct ieee80211_hw *hw if (txctl->paprd) bf->bf_state.bfs_paprd_timestamp = jiffies; @@ -76,7 +76,7 @@ Signed-off-by: Felix Fietkau ath_tx_send_normal(sc, txq, tid, skb); out: -@@ -2429,7 +2444,7 @@ void ath_tx_cabq(struct ieee80211_hw *hw +@@ -2449,7 +2464,7 @@ void ath_tx_cabq(struct ieee80211_hw *hw break; bf->bf_lastbf = bf; @@ -85,7 +85,7 @@ Signed-off-by: Felix Fietkau ath_buf_set_rate(sc, bf, &info, fi->framelen, false); duration += info.rates[0].PktDuration; if (bf_tail) -@@ -2946,7 +2961,7 @@ int ath9k_tx99_send(struct ath_softc *sc +@@ -2968,7 +2983,7 @@ int ath9k_tx99_send(struct ath_softc *sc return -EINVAL; } diff --git a/package/kernel/mac80211/patches/306-Revert-ath9k-interpret-requested-txpower-in-EIRP-dom.patch b/package/kernel/mac80211/patches/306-Revert-ath9k-interpret-requested-txpower-in-EIRP-dom.patch index 35d07430eb..956ab83903 100644 --- a/package/kernel/mac80211/patches/306-Revert-ath9k-interpret-requested-txpower-in-EIRP-dom.patch +++ b/package/kernel/mac80211/patches/306-Revert-ath9k-interpret-requested-txpower-in-EIRP-dom.patch @@ -8,7 +8,7 @@ This reverts commit 71f5137bf010c6faffab50c0ec15374c59c4a411. --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c -@@ -2935,7 +2935,8 @@ void ath9k_hw_apply_txpower(struct ath_h +@@ -2931,7 +2931,8 @@ void ath9k_hw_apply_txpower(struct ath_h { struct ath_regulatory *reg = ath9k_hw_regulatory(ah); struct ieee80211_channel *channel; @@ -18,7 +18,7 @@ This reverts commit 71f5137bf010c6faffab50c0ec15374c59c4a411. if (!chan) return; -@@ -2943,10 +2944,15 @@ void ath9k_hw_apply_txpower(struct ath_h +@@ -2939,10 +2940,15 @@ void ath9k_hw_apply_txpower(struct ath_h channel = chan->chan; chan_pwr = min_t(int, channel->max_power * 2, MAX_RATE_POWER); new_pwr = min_t(int, chan_pwr, reg->power_limit); diff --git a/package/kernel/mac80211/patches/307-mac80211-add-hdrlen-to-ieee80211_tx_data.patch b/package/kernel/mac80211/patches/307-mac80211-add-hdrlen-to-ieee80211_tx_data.patch index baaca173c7..1a6fd8471c 100644 --- a/package/kernel/mac80211/patches/307-mac80211-add-hdrlen-to-ieee80211_tx_data.patch +++ b/package/kernel/mac80211/patches/307-mac80211-add-hdrlen-to-ieee80211_tx_data.patch @@ -21,7 +21,7 @@ Signed-off-by: Janusz Dziedzic --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c -@@ -921,7 +921,7 @@ ieee80211_tx_h_fragment(struct ieee80211 +@@ -925,7 +925,7 @@ ieee80211_tx_h_fragment(struct ieee80211 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); struct ieee80211_hdr *hdr = (void *)skb->data; int frag_threshold = tx->local->hw.wiphy->frag_threshold; @@ -30,7 +30,7 @@ Signed-off-by: Janusz Dziedzic int fragnum; /* no matter what happens, tx->skb moves to tx->skbs */ -@@ -942,8 +942,6 @@ ieee80211_tx_h_fragment(struct ieee80211 +@@ -946,8 +946,6 @@ ieee80211_tx_h_fragment(struct ieee80211 if (WARN_ON(info->flags & IEEE80211_TX_CTL_AMPDU)) return TX_DROP; @@ -39,7 +39,7 @@ Signed-off-by: Janusz Dziedzic /* internal error, why isn't DONTFRAG set? */ if (WARN_ON(skb->len + FCS_LEN <= frag_threshold)) return TX_DROP; -@@ -1175,6 +1173,8 @@ ieee80211_tx_prepare(struct ieee80211_su +@@ -1179,6 +1177,8 @@ ieee80211_tx_prepare(struct ieee80211_su hdr = (struct ieee80211_hdr *) skb->data; @@ -48,7 +48,7 @@ Signed-off-by: Janusz Dziedzic if (likely(sta)) { if (!IS_ERR(sta)) tx->sta = sta; -@@ -3434,6 +3434,7 @@ begin: +@@ -3437,6 +3437,7 @@ begin: tx.local = local; tx.skb = skb; tx.sdata = vif_to_sdata(info->control.vif); @@ -56,7 +56,7 @@ Signed-off-by: Janusz Dziedzic if (txq->sta) tx.sta = container_of(txq->sta, struct sta_info, sta); -@@ -3756,6 +3757,7 @@ ieee80211_build_data_template(struct iee +@@ -3731,6 +3732,7 @@ ieee80211_build_data_template(struct iee hdr = (void *)skb->data; tx.sta = sta_info_get(sdata, hdr->addr1); tx.skb = skb; @@ -66,7 +66,7 @@ Signed-off-by: Janusz Dziedzic rcu_read_unlock(); --- a/net/mac80211/util.c +++ b/net/mac80211/util.c -@@ -1232,6 +1232,7 @@ void ieee80211_send_auth(struct ieee8021 +@@ -1227,6 +1227,7 @@ void ieee80211_send_auth(struct ieee8021 struct ieee80211_local *local = sdata->local; struct sk_buff *skb; struct ieee80211_mgmt *mgmt; @@ -74,8 +74,8 @@ Signed-off-by: Janusz Dziedzic int err; /* 24 + 6 = header + auth_algo + auth_transaction + status_code */ -@@ -1255,8 +1256,10 @@ void ieee80211_send_auth(struct ieee8021 - skb_put_data(skb, extra, extra_len); +@@ -1251,8 +1252,10 @@ void ieee80211_send_auth(struct ieee8021 + memcpy(skb_put(skb, extra_len), extra, extra_len); if (auth_alg == WLAN_AUTH_SHARED_KEY && transaction == 3) { + hdrlen = ieee80211_hdrlen(mgmt->frame_control); @@ -155,7 +155,7 @@ Signed-off-by: Janusz Dziedzic size_t klen, u8 *data, size_t data_len); --- a/net/mac80211/wpa.c +++ b/net/mac80211/wpa.c -@@ -44,7 +44,7 @@ ieee80211_tx_h_michael_mic_add(struct ie +@@ -43,7 +43,7 @@ ieee80211_tx_h_michael_mic_add(struct ie skb->len < 24 || !ieee80211_is_data_present(hdr->frame_control)) return TX_CONTINUE; @@ -164,7 +164,7 @@ Signed-off-by: Janusz Dziedzic if (skb->len < hdrlen) return TX_DROP; -@@ -187,7 +187,6 @@ mic_fail_no_key: +@@ -186,7 +186,6 @@ mic_fail_no_key: static int tkip_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb) { @@ -172,7 +172,7 @@ Signed-off-by: Janusz Dziedzic struct ieee80211_key *key = tx->key; struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); unsigned int hdrlen; -@@ -202,7 +201,7 @@ static int tkip_encrypt_skb(struct ieee8 +@@ -201,7 +200,7 @@ static int tkip_encrypt_skb(struct ieee8 return 0; } @@ -181,7 +181,7 @@ Signed-off-by: Janusz Dziedzic len = skb->len - hdrlen; if (info->control.hw_key) -@@ -420,7 +419,7 @@ static int ccmp_encrypt_skb(struct ieee8 +@@ -419,7 +418,7 @@ static int ccmp_encrypt_skb(struct ieee8 return 0; } @@ -190,7 +190,7 @@ Signed-off-by: Janusz Dziedzic len = skb->len - hdrlen; if (info->control.hw_key) -@@ -653,7 +652,7 @@ static int gcmp_encrypt_skb(struct ieee8 +@@ -652,7 +651,7 @@ static int gcmp_encrypt_skb(struct ieee8 return 0; } @@ -199,7 +199,7 @@ Signed-off-by: Janusz Dziedzic len = skb->len - hdrlen; if (info->control.hw_key) -@@ -793,7 +792,6 @@ static ieee80211_tx_result +@@ -792,7 +791,6 @@ static ieee80211_tx_result ieee80211_crypto_cs_encrypt(struct ieee80211_tx_data *tx, struct sk_buff *skb) { @@ -207,7 +207,7 @@ Signed-off-by: Janusz Dziedzic struct ieee80211_key *key = tx->key; struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); int hdrlen; -@@ -809,8 +807,7 @@ ieee80211_crypto_cs_encrypt(struct ieee8 +@@ -808,8 +806,7 @@ ieee80211_crypto_cs_encrypt(struct ieee8 pskb_expand_head(skb, iv_len, 0, GFP_ATOMIC))) return TX_DROP; diff --git a/package/kernel/mac80211/patches/308-mac80211-add-NEED_ALIGNED4_SKBS-hw-flag.patch b/package/kernel/mac80211/patches/308-mac80211-add-NEED_ALIGNED4_SKBS-hw-flag.patch index 762458ba78..43455773f1 100644 --- a/package/kernel/mac80211/patches/308-mac80211-add-NEED_ALIGNED4_SKBS-hw-flag.patch +++ b/package/kernel/mac80211/patches/308-mac80211-add-NEED_ALIGNED4_SKBS-hw-flag.patch @@ -23,7 +23,7 @@ Signed-off-by: Janusz Dziedzic --- a/include/net/mac80211.h +++ b/include/net/mac80211.h -@@ -2056,6 +2056,9 @@ struct ieee80211_txq { +@@ -2043,6 +2043,9 @@ struct ieee80211_txq { * The stack will not do fragmentation. * The callback for @set_frag_threshold should be set as well. * @@ -33,7 +33,7 @@ Signed-off-by: Janusz Dziedzic * @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays */ enum ieee80211_hw_flags { -@@ -2098,6 +2101,7 @@ enum ieee80211_hw_flags { +@@ -2085,6 +2088,7 @@ enum ieee80211_hw_flags { IEEE80211_HW_TX_FRAG_LIST, IEEE80211_HW_REPORTS_LOW_ACK, IEEE80211_HW_SUPPORTS_TX_FRAG, @@ -53,7 +53,7 @@ Signed-off-by: Janusz Dziedzic --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h -@@ -1547,6 +1547,29 @@ ieee80211_vif_get_num_mcast_if(struct ie +@@ -1553,6 +1553,29 @@ ieee80211_vif_get_num_mcast_if(struct ie return -1; } @@ -85,7 +85,7 @@ Signed-off-by: Janusz Dziedzic unsigned int mpdu_len, --- a/net/mac80211/sta_info.h +++ b/net/mac80211/sta_info.h -@@ -290,7 +290,7 @@ struct ieee80211_fast_tx { +@@ -282,7 +282,7 @@ struct ieee80211_fast_tx { u8 hdr_len; u8 sa_offs, da_offs, pn_offs; u8 band; @@ -96,7 +96,7 @@ Signed-off-by: Janusz Dziedzic struct rcu_head rcu_head; --- a/net/mac80211/status.c +++ b/net/mac80211/status.c -@@ -642,9 +642,22 @@ void ieee80211_tx_monitor(struct ieee802 +@@ -693,9 +693,22 @@ void ieee80211_tx_monitor(struct ieee802 struct sk_buff *skb2; struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); struct ieee80211_sub_if_data *sdata; @@ -137,7 +137,7 @@ Signed-off-by: Janusz Dziedzic --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c -@@ -1172,8 +1172,7 @@ ieee80211_tx_prepare(struct ieee80211_su +@@ -1176,8 +1176,7 @@ ieee80211_tx_prepare(struct ieee80211_su info->flags &= ~IEEE80211_TX_INTFL_NEED_TXPROCESSING; hdr = (struct ieee80211_hdr *) skb->data; @@ -147,7 +147,7 @@ Signed-off-by: Janusz Dziedzic if (likely(sta)) { if (!IS_ERR(sta)) -@@ -2150,7 +2149,7 @@ netdev_tx_t ieee80211_monitor_start_xmit +@@ -2152,7 +2151,7 @@ netdev_tx_t ieee80211_monitor_start_xmit goto fail; hdr = (struct ieee80211_hdr *)(skb->data + len_rthdr); @@ -156,7 +156,7 @@ Signed-off-by: Janusz Dziedzic if (skb->len < len_rthdr + hdrlen) goto fail; -@@ -2368,7 +2367,7 @@ static struct sk_buff *ieee80211_build_h +@@ -2370,7 +2369,7 @@ static struct sk_buff *ieee80211_build_h struct ieee80211_chanctx_conf *chanctx_conf; struct ieee80211_sub_if_data *ap_sdata; enum nl80211_band band; @@ -165,7 +165,7 @@ Signed-off-by: Janusz Dziedzic if (IS_ERR(sta)) sta = NULL; -@@ -2588,6 +2587,9 @@ static struct sk_buff *ieee80211_build_h +@@ -2590,6 +2589,9 @@ static struct sk_buff *ieee80211_build_h hdrlen += 2; } @@ -175,7 +175,7 @@ Signed-off-by: Janusz Dziedzic /* * Drop unicast frames to unauthorised stations unless they are * EAPOL frames from the local station. -@@ -2668,6 +2670,7 @@ static struct sk_buff *ieee80211_build_h +@@ -2670,6 +2672,7 @@ static struct sk_buff *ieee80211_build_h skb_pull(skb, skip_header_bytes); head_need = hdrlen + encaps_len + meshhdrlen - skb_headroom(skb); @@ -183,7 +183,7 @@ Signed-off-by: Janusz Dziedzic /* * So we need to modify the skb header and hence need a copy of -@@ -2700,6 +2703,9 @@ static struct sk_buff *ieee80211_build_h +@@ -2702,6 +2705,9 @@ static struct sk_buff *ieee80211_build_h memcpy(skb_push(skb, meshhdrlen), &mesh_hdr, meshhdrlen); #endif @@ -193,7 +193,7 @@ Signed-off-by: Janusz Dziedzic if (ieee80211_is_data_qos(fc)) { __le16 *qos_control; -@@ -2875,6 +2881,9 @@ void ieee80211_check_fast_xmit(struct st +@@ -2877,6 +2883,9 @@ void ieee80211_check_fast_xmit(struct st fc |= cpu_to_le16(IEEE80211_STYPE_QOS_DATA); } @@ -203,7 +203,7 @@ Signed-off-by: Janusz Dziedzic /* We store the key here so there's no point in using rcu_dereference() * but that's fine because the code that changes the pointers will call * this function after doing so. For a single CPU that would be enough, -@@ -3461,7 +3470,7 @@ begin: +@@ -3464,7 +3473,7 @@ begin: if (tx.key && (tx.key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) @@ -214,7 +214,7 @@ Signed-off-by: Janusz Dziedzic tx.key, skb); --- a/net/mac80211/util.c +++ b/net/mac80211/util.c -@@ -1230,6 +1230,7 @@ void ieee80211_send_auth(struct ieee8021 +@@ -1225,6 +1225,7 @@ void ieee80211_send_auth(struct ieee8021 u32 tx_flags) { struct ieee80211_local *local = sdata->local; @@ -222,8 +222,8 @@ Signed-off-by: Janusz Dziedzic struct sk_buff *skb; struct ieee80211_mgmt *mgmt; unsigned int hdrlen; -@@ -1256,7 +1257,7 @@ void ieee80211_send_auth(struct ieee8021 - skb_put_data(skb, extra, extra_len); +@@ -1252,7 +1253,7 @@ void ieee80211_send_auth(struct ieee8021 + memcpy(skb_put(skb, extra_len), extra, extra_len); if (auth_alg == WLAN_AUTH_SHARED_KEY && transaction == 3) { - hdrlen = ieee80211_hdrlen(mgmt->frame_control); diff --git a/package/kernel/mac80211/patches/309-mac80211-minstrel-Enable-STBC-and-LDPC-for-VHT-Rates.patch b/package/kernel/mac80211/patches/309-mac80211-minstrel-Enable-STBC-and-LDPC-for-VHT-Rates.patch index 609b15b832..a62b1bb28e 100644 --- a/package/kernel/mac80211/patches/309-mac80211-minstrel-Enable-STBC-and-LDPC-for-VHT-Rates.patch +++ b/package/kernel/mac80211/patches/309-mac80211-minstrel-Enable-STBC-and-LDPC-for-VHT-Rates.patch @@ -10,7 +10,7 @@ Signed-off-by: Chaitanya TK --- a/include/linux/ieee80211.h +++ b/include/linux/ieee80211.h -@@ -1556,6 +1556,7 @@ struct ieee80211_vht_operation { +@@ -1553,6 +1553,7 @@ struct ieee80211_vht_operation { #define IEEE80211_VHT_CAP_RXSTBC_3 0x00000300 #define IEEE80211_VHT_CAP_RXSTBC_4 0x00000400 #define IEEE80211_VHT_CAP_RXSTBC_MASK 0x00000700 diff --git a/package/kernel/mac80211/patches/310-ath9k-fix-moredata-bit-in-PS-buffered-frame-release.patch b/package/kernel/mac80211/patches/310-ath9k-fix-moredata-bit-in-PS-buffered-frame-release.patch index c9c74bb836..b2a74ccbac 100644 --- a/package/kernel/mac80211/patches/310-ath9k-fix-moredata-bit-in-PS-buffered-frame-release.patch +++ b/package/kernel/mac80211/patches/310-ath9k-fix-moredata-bit-in-PS-buffered-frame-release.patch @@ -7,7 +7,7 @@ Signed-off-by: Felix Fietkau --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c -@@ -1674,6 +1674,22 @@ void ath_tx_aggr_wakeup(struct ath_softc +@@ -1694,6 +1694,22 @@ void ath_tx_aggr_wakeup(struct ath_softc } } @@ -30,7 +30,7 @@ Signed-off-by: Felix Fietkau void ath9k_release_buffered_frames(struct ieee80211_hw *hw, struct ieee80211_sta *sta, u16 tids, int nframes, -@@ -1704,6 +1720,7 @@ void ath9k_release_buffered_frames(struc +@@ -1724,6 +1740,7 @@ void ath9k_release_buffered_frames(struc if (!bf) break; @@ -38,7 +38,7 @@ Signed-off-by: Felix Fietkau list_add_tail(&bf->list, &bf_q); ath_set_rates(tid->an->vif, tid->an->sta, bf, true); if (bf_isampdu(bf)) { -@@ -1727,6 +1744,9 @@ void ath9k_release_buffered_frames(struc +@@ -1747,6 +1764,9 @@ void ath9k_release_buffered_frames(struc if (list_empty(&bf_q)) return; diff --git a/package/kernel/mac80211/patches/311-ath9k-clear-potentially-stale-EOSP-status-bit-in-int.patch b/package/kernel/mac80211/patches/311-ath9k-clear-potentially-stale-EOSP-status-bit-in-int.patch index 1893187e8a..9863dffc90 100644 --- a/package/kernel/mac80211/patches/311-ath9k-clear-potentially-stale-EOSP-status-bit-in-int.patch +++ b/package/kernel/mac80211/patches/311-ath9k-clear-potentially-stale-EOSP-status-bit-in-int.patch @@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c -@@ -984,7 +984,8 @@ ath_tx_get_tid_subframe(struct ath_softc +@@ -1004,7 +1004,8 @@ ath_tx_get_tid_subframe(struct ath_softc bf->bf_lastbf = bf; tx_info = IEEE80211_SKB_CB(skb); diff --git a/package/kernel/mac80211/patches/313-ath9k-fix-block-ack-window-tracking-issues.patch b/package/kernel/mac80211/patches/313-ath9k-fix-block-ack-window-tracking-issues.patch index 59de1dfe1a..fb8df08afe 100644 --- a/package/kernel/mac80211/patches/313-ath9k-fix-block-ack-window-tracking-issues.patch +++ b/package/kernel/mac80211/patches/313-ath9k-fix-block-ack-window-tracking-issues.patch @@ -75,7 +75,7 @@ Signed-off-by: Felix Fietkau ath_tx_complete_buf(sc, bf, txq, &bf_head, NULL, ts, -@@ -1026,11 +1034,14 @@ ath_tx_get_tid_subframe(struct ath_softc +@@ -1046,11 +1054,14 @@ ath_tx_get_tid_subframe(struct ath_softc INIT_LIST_HEAD(&bf_head); list_add(&bf->list, &bf_head); @@ -91,7 +91,7 @@ Signed-off-by: Felix Fietkau return bf; } -@@ -1088,8 +1099,6 @@ ath_tx_form_aggr(struct ath_softc *sc, s +@@ -1108,8 +1119,6 @@ ath_tx_form_aggr(struct ath_softc *sc, s bf->bf_next = NULL; /* link buffers of this frame to the aggregate */ @@ -100,7 +100,7 @@ Signed-off-by: Felix Fietkau bf->bf_state.ndelim = ndelim; list_add_tail(&bf->list, bf_q); -@@ -1725,10 +1734,8 @@ void ath9k_release_buffered_frames(struc +@@ -1745,10 +1754,8 @@ void ath9k_release_buffered_frames(struc ath9k_set_moredata(sc, bf, true); list_add_tail(&bf->list, &bf_q); ath_set_rates(tid->an->vif, tid->an->sta, bf, true); diff --git a/package/kernel/mac80211/patches/314-ath9k-rename-tx_complete_work-to-hw_check_work.patch b/package/kernel/mac80211/patches/314-ath9k-rename-tx_complete_work-to-hw_check_work.patch new file mode 100644 index 0000000000..5465df3ccf --- /dev/null +++ b/package/kernel/mac80211/patches/314-ath9k-rename-tx_complete_work-to-hw_check_work.patch @@ -0,0 +1,175 @@ +From: Felix Fietkau +Date: Wed, 25 Jan 2017 12:57:05 +0100 +Subject: [PATCH] ath9k: rename tx_complete_work to hw_check_work + +Also include common MAC alive check. This should make the hang checks +more reliable for modes where beacons are not sent and is used as a +starting point for further hang check improvements + +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/wireless/ath/ath9k/ath9k.h ++++ b/drivers/net/wireless/ath/ath9k/ath9k.h +@@ -108,7 +108,7 @@ int ath_descdma_setup(struct ath_softc * + #define ATH_AGGR_MIN_QDEPTH 2 + /* minimum h/w qdepth for non-aggregated traffic */ + #define ATH_NON_AGGR_MIN_QDEPTH 8 +-#define ATH_TX_COMPLETE_POLL_INT 1000 ++#define ATH_HW_CHECK_POLL_INT 1000 + #define ATH_TXFIFO_DEPTH 8 + #define ATH_TX_ERROR 0x01 + +@@ -745,7 +745,7 @@ void ath9k_csa_update(struct ath_softc * + #define ATH_PAPRD_TIMEOUT 100 /* msecs */ + #define ATH_PLL_WORK_INTERVAL 100 + +-void ath_tx_complete_poll_work(struct work_struct *work); ++void ath_hw_check_work(struct work_struct *work); + void ath_reset_work(struct work_struct *work); + bool ath_hw_check(struct ath_softc *sc); + void ath_hw_pll_work(struct work_struct *work); +@@ -1053,7 +1053,7 @@ struct ath_softc { + #ifdef CPTCFG_ATH9K_DEBUGFS + struct ath9k_debug debug; + #endif +- struct delayed_work tx_complete_work; ++ struct delayed_work hw_check_work; + struct delayed_work hw_pll_work; + struct timer_list sleep_timer; + +--- a/drivers/net/wireless/ath/ath9k/init.c ++++ b/drivers/net/wireless/ath/ath9k/init.c +@@ -681,6 +681,7 @@ static int ath9k_init_softc(u16 devid, s + INIT_WORK(&sc->hw_reset_work, ath_reset_work); + INIT_WORK(&sc->paprd_work, ath_paprd_calibrate); + INIT_DELAYED_WORK(&sc->hw_pll_work, ath_hw_pll_work); ++ INIT_DELAYED_WORK(&sc->hw_check_work, ath_hw_check_work); + + ath9k_init_channel_context(sc); + +--- a/drivers/net/wireless/ath/ath9k/link.c ++++ b/drivers/net/wireless/ath/ath9k/link.c +@@ -20,20 +20,13 @@ + * TX polling - checks if the TX engine is stuck somewhere + * and issues a chip reset if so. + */ +-void ath_tx_complete_poll_work(struct work_struct *work) ++static bool ath_tx_complete_check(struct ath_softc *sc) + { +- struct ath_softc *sc = container_of(work, struct ath_softc, +- tx_complete_work.work); + struct ath_txq *txq; + int i; +- bool needreset = false; +- + +- if (sc->tx99_state) { +- ath_dbg(ath9k_hw_common(sc->sc_ah), RESET, +- "skip tx hung detection on tx99\n"); +- return; +- } ++ if (sc->tx99_state) ++ return true; + + for (i = 0; i < IEEE80211_NUM_ACS; i++) { + txq = sc->tx.txq_map[i]; +@@ -41,25 +34,36 @@ void ath_tx_complete_poll_work(struct wo + ath_txq_lock(sc, txq); + if (txq->axq_depth) { + if (txq->axq_tx_inprogress) { +- needreset = true; + ath_txq_unlock(sc, txq); +- break; +- } else { +- txq->axq_tx_inprogress = true; ++ goto reset; + } ++ ++ txq->axq_tx_inprogress = true; + } + ath_txq_unlock(sc, txq); + } + +- if (needreset) { +- ath_dbg(ath9k_hw_common(sc->sc_ah), RESET, +- "tx hung, resetting the chip\n"); +- ath9k_queue_reset(sc, RESET_TYPE_TX_HANG); ++ return true; ++ ++reset: ++ ath_dbg(ath9k_hw_common(sc->sc_ah), RESET, ++ "tx hung, resetting the chip\n"); ++ ath9k_queue_reset(sc, RESET_TYPE_TX_HANG); ++ return false; ++ ++} ++ ++void ath_hw_check_work(struct work_struct *work) ++{ ++ struct ath_softc *sc = container_of(work, struct ath_softc, ++ hw_check_work.work); ++ ++ if (!ath_hw_check(sc) || ++ !ath_tx_complete_check(sc)) + return; +- } + +- ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, +- msecs_to_jiffies(ATH_TX_COMPLETE_POLL_INT)); ++ ieee80211_queue_delayed_work(sc->hw, &sc->hw_check_work, ++ msecs_to_jiffies(ATH_HW_CHECK_POLL_INT)); + } + + /* +--- a/drivers/net/wireless/ath/ath9k/main.c ++++ b/drivers/net/wireless/ath/ath9k/main.c +@@ -181,7 +181,7 @@ void ath9k_ps_restore(struct ath_softc * + static void __ath_cancel_work(struct ath_softc *sc) + { + cancel_work_sync(&sc->paprd_work); +- cancel_delayed_work_sync(&sc->tx_complete_work); ++ cancel_delayed_work_sync(&sc->hw_check_work); + cancel_delayed_work_sync(&sc->hw_pll_work); + + #ifdef CPTCFG_ATH9K_BTCOEX_SUPPORT +@@ -198,7 +198,8 @@ void ath_cancel_work(struct ath_softc *s + + void ath_restart_work(struct ath_softc *sc) + { +- ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, 0); ++ ieee80211_queue_delayed_work(sc->hw, &sc->hw_check_work, ++ ATH_HW_CHECK_POLL_INT); + + if (AR_SREV_9340(sc->sc_ah) || AR_SREV_9330(sc->sc_ah)) + ieee80211_queue_delayed_work(sc->hw, &sc->hw_pll_work, +@@ -2091,7 +2092,7 @@ void __ath9k_flush(struct ieee80211_hw * + int timeout; + bool drain_txq; + +- cancel_delayed_work_sync(&sc->tx_complete_work); ++ cancel_delayed_work_sync(&sc->hw_check_work); + + if (ah->ah_flags & AH_UNPLUGGED) { + ath_dbg(common, ANY, "Device has been unplugged!\n"); +@@ -2129,7 +2130,8 @@ void __ath9k_flush(struct ieee80211_hw * + ath9k_ps_restore(sc); + } + +- ieee80211_queue_delayed_work(hw, &sc->tx_complete_work, 0); ++ ieee80211_queue_delayed_work(hw, &sc->hw_check_work, ++ ATH_HW_CHECK_POLL_INT); + } + + static bool ath9k_tx_frames_pending(struct ieee80211_hw *hw) +--- a/drivers/net/wireless/ath/ath9k/xmit.c ++++ b/drivers/net/wireless/ath/ath9k/xmit.c +@@ -2916,8 +2916,6 @@ int ath_tx_init(struct ath_softc *sc, in + return error; + } + +- INIT_DELAYED_WORK(&sc->tx_complete_work, ath_tx_complete_poll_work); +- + if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) + error = ath_tx_edma_init(sc); + diff --git a/package/kernel/mac80211/patches/315-ath9k-adjust-tx-power-reduction-for-US-regulatory-do.patch b/package/kernel/mac80211/patches/315-ath9k-adjust-tx-power-reduction-for-US-regulatory-do.patch deleted file mode 100644 index 78083517bc..0000000000 --- a/package/kernel/mac80211/patches/315-ath9k-adjust-tx-power-reduction-for-US-regulatory-do.patch +++ /dev/null @@ -1,24 +0,0 @@ -From: Felix Fietkau -Date: Wed, 19 Jul 2017 08:49:31 +0200 -Subject: [PATCH] ath9k: adjust tx power reduction for US regulatory - domain - -FCC regulatory rules allow for up to 3 dBi antenna gain. Account for -this in the EEPROM based tx power reduction code. - -Signed-off-by: Felix Fietkau ---- - ---- a/drivers/net/wireless/ath/ath9k/hw.c -+++ b/drivers/net/wireless/ath/ath9k/hw.c -@@ -2954,6 +2954,10 @@ void ath9k_hw_apply_txpower(struct ath_h - if (ant_gain > max_gain) - ant_reduction = ant_gain - max_gain; - -+ /* FCC allows maximum antenna gain of 3 dBi */ -+ if (reg->region == NL80211_DFS_FCC) -+ ant_reduction = max_t(int, ant_reduction - 6, 0); -+ - ah->eep_ops->set_txpower(ah, chan, ctl, ant_reduction, new_pwr, test); - } - diff --git a/package/kernel/mac80211/patches/315-ath9k_hw-check-if-the-chip-failed-to-wake-up.patch b/package/kernel/mac80211/patches/315-ath9k_hw-check-if-the-chip-failed-to-wake-up.patch new file mode 100644 index 0000000000..b0cb74ad05 --- /dev/null +++ b/package/kernel/mac80211/patches/315-ath9k_hw-check-if-the-chip-failed-to-wake-up.patch @@ -0,0 +1,30 @@ +From: Felix Fietkau +Date: Wed, 25 Jan 2017 12:58:17 +0100 +Subject: [PATCH] ath9k_hw: check if the chip failed to wake up + +In an RFC patch, Sven Eckelmann and Simon Wunderlich reported: + +"QCA 802.11n chips (especially AR9330/AR9340) sometimes end up in a +state in which a read of AR_CFG always returns 0xdeadbeef. +This should not happen when when the power_mode of the device is +ATH9K_PM_AWAKE." + +Include the check for the default register state in the existing MAC +hang check. + +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/wireless/ath/ath9k/hw.c ++++ b/drivers/net/wireless/ath/ath9k/hw.c +@@ -1624,6 +1624,10 @@ bool ath9k_hw_check_alive(struct ath_hw + int count = 50; + u32 reg, last_val; + ++ /* Check if chip failed to wake up */ ++ if (REG_READ(ah, AR_CFG) == 0xdeadbeef) ++ return false; ++ + if (AR_SREV_9300(ah)) + return !ath9k_hw_detect_mac_hang(ah); + diff --git a/package/kernel/mac80211/patches/316-ath9k-fix-more-data-flag-for-buffered-multicast-pack.patch b/package/kernel/mac80211/patches/316-ath9k-fix-more-data-flag-for-buffered-multicast-pack.patch deleted file mode 100644 index 096eb56a2d..0000000000 --- a/package/kernel/mac80211/patches/316-ath9k-fix-more-data-flag-for-buffered-multicast-pack.patch +++ /dev/null @@ -1,41 +0,0 @@ -From: Felix Fietkau -Date: Sun, 23 Jul 2017 14:58:22 +0200 -Subject: [PATCH] ath9k: fix more-data flag for buffered multicast - packets - -The flag needs to be cleared for the last packet in the list, not the -first one. Fixes some issues with multicast packet loss for powersave -clients connected to an ath9k AP. - -Signed-off-by: Felix Fietkau ---- - ---- a/drivers/net/wireless/ath/ath9k/xmit.c -+++ b/drivers/net/wireless/ath/ath9k/xmit.c -@@ -2451,7 +2451,6 @@ void ath_tx_cabq(struct ieee80211_hw *hw - .txq = sc->beacon.cabq - }; - struct ath_tx_info info = {}; -- struct ieee80211_hdr *hdr; - struct ath_buf *bf_tail = NULL; - struct ath_buf *bf; - LIST_HEAD(bf_q); -@@ -2495,15 +2494,10 @@ void ath_tx_cabq(struct ieee80211_hw *hw - if (list_empty(&bf_q)) - return; - -- bf = list_first_entry(&bf_q, struct ath_buf, list); -- hdr = (struct ieee80211_hdr *) bf->bf_mpdu->data; -- -- if (hdr->frame_control & cpu_to_le16(IEEE80211_FCTL_MOREDATA)) { -- hdr->frame_control &= ~cpu_to_le16(IEEE80211_FCTL_MOREDATA); -- dma_sync_single_for_device(sc->dev, bf->bf_buf_addr, -- sizeof(*hdr), DMA_TO_DEVICE); -- } -+ bf = list_last_entry(&bf_q, struct ath_buf, list); -+ ath9k_set_moredata(sc, bf, false); - -+ bf = list_first_entry(&bf_q, struct ath_buf, list); - ath_txq_lock(sc, txctl.txq); - ath_tx_fill_desc(sc, bf, txctl.txq, 0); - ath_tx_txqaddbuf(sc, txctl.txq, &bf_q, false); diff --git a/package/kernel/mac80211/patches/316-ath9k-fix-race-condition-in-enabling-disabling-IRQs.patch b/package/kernel/mac80211/patches/316-ath9k-fix-race-condition-in-enabling-disabling-IRQs.patch new file mode 100644 index 0000000000..7a41206132 --- /dev/null +++ b/package/kernel/mac80211/patches/316-ath9k-fix-race-condition-in-enabling-disabling-IRQs.patch @@ -0,0 +1,197 @@ +From: Felix Fietkau +Date: Wed, 25 Jan 2017 15:10:37 +0100 +Subject: [PATCH] ath9k: fix race condition in enabling/disabling IRQs + +The code currently relies on refcounting to disable IRQs from within the +IRQ handler and re-enabling them again after the tasklet has run. + +However, due to race conditions sometimes the IRQ handler might be +called twice, or the tasklet may not run at all (if interrupted in the +middle of a reset). + +This can cause nasty imbalances in the irq-disable refcount which will +get the driver permanently stuck until the entire radio has been stopped +and started again (ath_reset will not recover from this). + +Instead of using this fragile logic, change the code to ensure that +running the irq handler during tasklet processing is safe, and leave the +refcount untouched. + +Cc: stable@vger.kernel.org +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/wireless/ath/ath9k/ath9k.h ++++ b/drivers/net/wireless/ath/ath9k/ath9k.h +@@ -998,6 +998,7 @@ struct ath_softc { + struct survey_info *cur_survey; + struct survey_info survey[ATH9K_NUM_CHANNELS]; + ++ spinlock_t intr_lock; + struct tasklet_struct intr_tq; + struct tasklet_struct bcon_tasklet; + struct ath_hw *sc_ah; +--- a/drivers/net/wireless/ath/ath9k/init.c ++++ b/drivers/net/wireless/ath/ath9k/init.c +@@ -669,6 +669,7 @@ static int ath9k_init_softc(u16 devid, s + common->bt_ant_diversity = 1; + + spin_lock_init(&common->cc_lock); ++ spin_lock_init(&sc->intr_lock); + spin_lock_init(&sc->sc_serial_rw); + spin_lock_init(&sc->sc_pm_lock); + spin_lock_init(&sc->chan_lock); +--- a/drivers/net/wireless/ath/ath9k/mac.c ++++ b/drivers/net/wireless/ath/ath9k/mac.c +@@ -810,21 +810,12 @@ void ath9k_hw_disable_interrupts(struct + } + EXPORT_SYMBOL(ath9k_hw_disable_interrupts); + +-void ath9k_hw_enable_interrupts(struct ath_hw *ah) ++static void __ath9k_hw_enable_interrupts(struct ath_hw *ah) + { + struct ath_common *common = ath9k_hw_common(ah); + u32 sync_default = AR_INTR_SYNC_DEFAULT; + u32 async_mask; + +- if (!(ah->imask & ATH9K_INT_GLOBAL)) +- return; +- +- if (!atomic_inc_and_test(&ah->intr_ref_cnt)) { +- ath_dbg(common, INTERRUPT, "Do not enable IER ref count %d\n", +- atomic_read(&ah->intr_ref_cnt)); +- return; +- } +- + if (AR_SREV_9340(ah) || AR_SREV_9550(ah) || AR_SREV_9531(ah) || + AR_SREV_9561(ah)) + sync_default &= ~AR_INTR_SYNC_HOST1_FATAL; +@@ -846,6 +837,39 @@ void ath9k_hw_enable_interrupts(struct a + ath_dbg(common, INTERRUPT, "AR_IMR 0x%x IER 0x%x\n", + REG_READ(ah, AR_IMR), REG_READ(ah, AR_IER)); + } ++ ++void ath9k_hw_resume_interrupts(struct ath_hw *ah) ++{ ++ struct ath_common *common = ath9k_hw_common(ah); ++ ++ if (!(ah->imask & ATH9K_INT_GLOBAL)) ++ return; ++ ++ if (atomic_read(&ah->intr_ref_cnt) != 0) { ++ ath_dbg(common, INTERRUPT, "Do not enable IER ref count %d\n", ++ atomic_read(&ah->intr_ref_cnt)); ++ return; ++ } ++ ++ __ath9k_hw_enable_interrupts(ah); ++} ++EXPORT_SYMBOL(ath9k_hw_resume_interrupts); ++ ++void ath9k_hw_enable_interrupts(struct ath_hw *ah) ++{ ++ struct ath_common *common = ath9k_hw_common(ah); ++ ++ if (!(ah->imask & ATH9K_INT_GLOBAL)) ++ return; ++ ++ if (!atomic_inc_and_test(&ah->intr_ref_cnt)) { ++ ath_dbg(common, INTERRUPT, "Do not enable IER ref count %d\n", ++ atomic_read(&ah->intr_ref_cnt)); ++ return; ++ } ++ ++ __ath9k_hw_enable_interrupts(ah); ++} + EXPORT_SYMBOL(ath9k_hw_enable_interrupts); + + void ath9k_hw_set_interrupts(struct ath_hw *ah) +--- a/drivers/net/wireless/ath/ath9k/mac.h ++++ b/drivers/net/wireless/ath/ath9k/mac.h +@@ -744,6 +744,7 @@ void ath9k_hw_set_interrupts(struct ath_ + void ath9k_hw_enable_interrupts(struct ath_hw *ah); + void ath9k_hw_disable_interrupts(struct ath_hw *ah); + void ath9k_hw_kill_interrupts(struct ath_hw *ah); ++void ath9k_hw_resume_interrupts(struct ath_hw *ah); + + void ar9002_hw_attach_mac_ops(struct ath_hw *ah); + +--- a/drivers/net/wireless/ath/ath9k/main.c ++++ b/drivers/net/wireless/ath/ath9k/main.c +@@ -374,21 +374,20 @@ void ath9k_tasklet(unsigned long data) + struct ath_common *common = ath9k_hw_common(ah); + enum ath_reset_type type; + unsigned long flags; +- u32 status = sc->intrstatus; ++ u32 status; + u32 rxmask; + ++ spin_lock_irqsave(&sc->intr_lock, flags); ++ status = sc->intrstatus; ++ sc->intrstatus = 0; ++ spin_unlock_irqrestore(&sc->intr_lock, flags); ++ + ath9k_ps_wakeup(sc); + spin_lock(&sc->sc_pcu_lock); + + if (status & ATH9K_INT_FATAL) { + type = RESET_TYPE_FATAL_INT; + ath9k_queue_reset(sc, type); +- +- /* +- * Increment the ref. counter here so that +- * interrupts are enabled in the reset routine. +- */ +- atomic_inc(&ah->intr_ref_cnt); + ath_dbg(common, RESET, "FATAL: Skipping interrupts\n"); + goto out; + } +@@ -404,11 +403,6 @@ void ath9k_tasklet(unsigned long data) + type = RESET_TYPE_BB_WATCHDOG; + ath9k_queue_reset(sc, type); + +- /* +- * Increment the ref. counter here so that +- * interrupts are enabled in the reset routine. +- */ +- atomic_inc(&ah->intr_ref_cnt); + ath_dbg(common, RESET, + "BB_WATCHDOG: Skipping interrupts\n"); + goto out; +@@ -421,7 +415,6 @@ void ath9k_tasklet(unsigned long data) + if ((sc->gtt_cnt >= MAX_GTT_CNT) && !ath9k_hw_check_alive(ah)) { + type = RESET_TYPE_TX_GTT; + ath9k_queue_reset(sc, type); +- atomic_inc(&ah->intr_ref_cnt); + ath_dbg(common, RESET, + "GTT: Skipping interrupts\n"); + goto out; +@@ -478,7 +471,7 @@ void ath9k_tasklet(unsigned long data) + ath9k_btcoex_handle_interrupt(sc, status); + + /* re-enable hardware interrupt */ +- ath9k_hw_enable_interrupts(ah); ++ ath9k_hw_resume_interrupts(ah); + out: + spin_unlock(&sc->sc_pcu_lock); + ath9k_ps_restore(sc); +@@ -542,7 +535,9 @@ irqreturn_t ath_isr(int irq, void *dev) + return IRQ_NONE; + + /* Cache the status */ +- sc->intrstatus = status; ++ spin_lock(&sc->intr_lock); ++ sc->intrstatus |= status; ++ spin_unlock(&sc->intr_lock); + + if (status & SCHED_INTR) + sched = true; +@@ -588,7 +583,7 @@ chip_reset: + + if (sched) { + /* turn off every interrupt */ +- ath9k_hw_disable_interrupts(ah); ++ ath9k_hw_kill_interrupts(ah); + tasklet_schedule(&sc->intr_tq); + } + diff --git a/package/kernel/mac80211/patches/317-Revert-ath10k-disable-wake_tx_queue-for-older-device.patch b/package/kernel/mac80211/patches/317-Revert-ath10k-disable-wake_tx_queue-for-older-device.patch deleted file mode 100644 index 5e18f285ab..0000000000 --- a/package/kernel/mac80211/patches/317-Revert-ath10k-disable-wake_tx_queue-for-older-device.patch +++ /dev/null @@ -1,27 +0,0 @@ -From: dave taht -Date: Wed, 5 Oct 2016 20:09:15 -0700 -Subject: [PATCH] Revert "ath10k: disable wake_tx_queue for older - devices" - -This reverts commit 4ca1807815aa6801aaced7fdefa9edacc2521767 -in the hope that we've fixed all the performance problems now. ---- - ---- a/drivers/net/wireless/ath/ath10k/mac.c -+++ b/drivers/net/wireless/ath/ath10k/mac.c -@@ -8286,15 +8286,6 @@ int ath10k_mac_register(struct ath10k *a - ath10k_warn(ar, "failed to initialise DFS pattern detector\n"); - } - -- /* Current wake_tx_queue implementation imposes a significant -- * performance penalty in some setups. The tx scheduling code needs -- * more work anyway so disable the wake_tx_queue unless firmware -- * supports the pull-push mechanism. -- */ -- if (!test_bit(ATH10K_FW_FEATURE_PEER_FLOW_CONTROL, -- ar->running_fw->fw_file.fw_features)) -- ar->ops->wake_tx_queue = NULL; -- - ret = ath10k_mac_init_rd(ar); - if (ret) { - ath10k_err(ar, "failed to derive regdom: %d\n", ret); diff --git a/package/kernel/mac80211/patches/318-0001-brcmfmac-check-brcmf_bus_get_memdump-result-for-erro.patch b/package/kernel/mac80211/patches/318-0001-brcmfmac-check-brcmf_bus_get_memdump-result-for-erro.patch new file mode 100644 index 0000000000..4ae4c606c5 --- /dev/null +++ b/package/kernel/mac80211/patches/318-0001-brcmfmac-check-brcmf_bus_get_memdump-result-for-erro.patch @@ -0,0 +1,52 @@ +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Mon, 30 Jan 2017 16:09:51 +0100 +Subject: [PATCH] brcmfmac: check brcmf_bus_get_memdump result for error +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This method may be unsupported (see: USB bus) or may just fail (see: +SDIO bus). +While at it rework logic in brcmf_sdio_bus_get_memdump function to avoid +too many conditional code nesting levels. + +Signed-off-by: Rafał Miłecki +Acked-by: Arend van Spriel +Signed-off-by: Kalle Valo +--- + +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c +@@ -32,16 +32,25 @@ static int brcmf_debug_create_memdump(st + { + void *dump; + size_t ramsize; ++ int err; + + ramsize = brcmf_bus_get_ramsize(bus); +- if (ramsize) { +- dump = vzalloc(len + ramsize); +- if (!dump) +- return -ENOMEM; +- memcpy(dump, data, len); +- brcmf_bus_get_memdump(bus, dump + len, ramsize); +- dev_coredumpv(bus->dev, dump, len + ramsize, GFP_KERNEL); ++ if (!ramsize) ++ return -ENOTSUPP; ++ ++ dump = vzalloc(len + ramsize); ++ if (!dump) ++ return -ENOMEM; ++ ++ memcpy(dump, data, len); ++ err = brcmf_bus_get_memdump(bus, dump + len, ramsize); ++ if (err) { ++ vfree(dump); ++ return err; + } ++ ++ dev_coredumpv(bus->dev, dump, len + ramsize, GFP_KERNEL); ++ + return 0; + } + diff --git a/package/kernel/mac80211/patches/319-0002-brcmfmac-be-more-verbose-when-PSM-s-watchdog-fires.patch b/package/kernel/mac80211/patches/319-0002-brcmfmac-be-more-verbose-when-PSM-s-watchdog-fires.patch new file mode 100644 index 0000000000..2a3b83864e --- /dev/null +++ b/package/kernel/mac80211/patches/319-0002-brcmfmac-be-more-verbose-when-PSM-s-watchdog-fires.patch @@ -0,0 +1,38 @@ +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Mon, 30 Jan 2017 16:09:52 +0100 +Subject: [PATCH] brcmfmac: be more verbose when PSM's watchdog fires +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +It's important to inform user so he knows things went wrong. He may also +want to get memory dump for further debugging purposes. + +Signed-off-by: Rafał Miłecki +Acked-by: Arend van Spriel +Signed-off-by: Kalle Valo +--- + +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c +@@ -58,10 +58,18 @@ static int brcmf_debug_psm_watchdog_noti + const struct brcmf_event_msg *evtmsg, + void *data) + { ++ int err; ++ + brcmf_dbg(TRACE, "enter: bsscfgidx=%d\n", ifp->bsscfgidx); + +- return brcmf_debug_create_memdump(ifp->drvr->bus_if, data, +- evtmsg->datalen); ++ brcmf_err("PSM's watchdog has fired!\n"); ++ ++ err = brcmf_debug_create_memdump(ifp->drvr->bus_if, data, ++ evtmsg->datalen); ++ if (err) ++ brcmf_err("Failed to get memory dump, %d\n", err); ++ ++ return err; + } + + void brcmf_debugfs_init(void) diff --git a/package/kernel/mac80211/patches/319-0003-brcmfmac-use-wiphy_read_of_freq_limits-to-respect-li.patch b/package/kernel/mac80211/patches/319-0003-brcmfmac-use-wiphy_read_of_freq_limits-to-respect-li.patch new file mode 100644 index 0000000000..6448bad5e9 --- /dev/null +++ b/package/kernel/mac80211/patches/319-0003-brcmfmac-use-wiphy_read_of_freq_limits-to-respect-li.patch @@ -0,0 +1,44 @@ +From 0f83ff69735651cc7a3d150466a5257ff829b62b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Tue, 17 Jan 2017 23:35:50 +0100 +Subject: [PATCH] brcmfmac: use wiphy_read_of_freq_limits to respect limits + from DT +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This new helper reads extra frequency limits specified in DT and +disables unavailable chanels. This is useful for devices (like home +routers) with chipsets limited e.g. by board design. + +In order to respect info read from DT we simply need to check for +IEEE80211_CHAN_DISABLED bit when constructing channel info. + +Signed-off-by: Rafał Miłecki +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +@@ -5908,6 +5908,9 @@ static int brcmf_construct_chaninfo(stru + continue; + } + ++ if (channel->orig_flags & IEEE80211_CHAN_DISABLED) ++ continue; ++ + /* assuming the chanspecs order is HT20, + * HT40 upper, HT40 lower, and VHT80. + */ +@@ -6509,6 +6512,9 @@ static int brcmf_setup_wiphy(struct wiph + wiphy->bands[NL80211_BAND_5GHZ] = band; + } + } ++ ++ wiphy_read_of_freq_limits(wiphy); ++ + return 0; + } + diff --git a/package/kernel/mac80211/patches/319-0004-brcmfmac-merge-two-brcmf_err-macros-into-one.patch b/package/kernel/mac80211/patches/319-0004-brcmfmac-merge-two-brcmf_err-macros-into-one.patch new file mode 100644 index 0000000000..defd5792ea --- /dev/null +++ b/package/kernel/mac80211/patches/319-0004-brcmfmac-merge-two-brcmf_err-macros-into-one.patch @@ -0,0 +1,43 @@ +From 9587a01a7ead9efc5032c16e0d9668de58be1186 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Thu, 2 Feb 2017 22:33:13 +0100 +Subject: [PATCH] brcmfmac: merge two brcmf_err macros into one +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This allows simplifying the code by adding a simple IS_ENABLED check for +CONFIG_BRCMDB symbol. + +Signed-off-by: Rafał Miłecki +Acked-by: Arend van Spriel +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h +@@ -45,20 +45,16 @@ + #undef pr_fmt + #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + ++#ifndef CPTCFG_BRCM_TRACING + /* Macro for error messages. net_ratelimit() is used when driver + * debugging is not selected. When debugging the driver error + * messages are as important as other tracing or even more so. + */ +-#ifndef CPTCFG_BRCM_TRACING +-#ifdef CPTCFG_BRCMDBG +-#define brcmf_err(fmt, ...) pr_err("%s: " fmt, __func__, ##__VA_ARGS__) +-#else + #define brcmf_err(fmt, ...) \ + do { \ +- if (net_ratelimit()) \ ++ if (IS_ENABLED(CPTCFG_BRCMDBG) || net_ratelimit()) \ + pr_err("%s: " fmt, __func__, ##__VA_ARGS__); \ + } while (0) +-#endif + #else + __printf(2, 3) + void __brcmf_err(const char *func, const char *fmt, ...); diff --git a/package/kernel/mac80211/patches/319-0005-brcmfmac-switch-to-C-function-__brcmf_err-for-printi.patch b/package/kernel/mac80211/patches/319-0005-brcmfmac-switch-to-C-function-__brcmf_err-for-printi.patch new file mode 100644 index 0000000000..5baf6960ec --- /dev/null +++ b/package/kernel/mac80211/patches/319-0005-brcmfmac-switch-to-C-function-__brcmf_err-for-printi.patch @@ -0,0 +1,69 @@ +From 087fa712a00685dac4bcc64b7c3dc8ae6bee8026 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Thu, 2 Feb 2017 22:33:14 +0100 +Subject: [PATCH] brcmfmac: switch to C function (__brcmf_err) for printing + errors +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This will allow extending code and using more detailed messages e.g. +with the help of dev_err. + +Signed-off-by: Rafał Miłecki +Acked-by: Arend van Spriel +Signed-off-by: Kalle Valo +--- + .../net/wireless/broadcom/brcm80211/brcmfmac/common.c | 16 ++++++++++++++++ + drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h | 6 +++--- + 2 files changed, 19 insertions(+), 3 deletions(-) + +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c +@@ -218,6 +218,22 @@ done: + return err; + } + ++#ifndef CPTCFG_BRCM_TRACING ++void __brcmf_err(const char *func, const char *fmt, ...) ++{ ++ struct va_format vaf; ++ va_list args; ++ ++ va_start(args, fmt); ++ ++ vaf.fmt = fmt; ++ vaf.va = &args; ++ pr_err("%s: %pV", func, &vaf); ++ ++ va_end(args); ++} ++#endif ++ + #if defined(CPTCFG_BRCM_TRACING) || defined(CPTCFG_BRCMDBG) + void __brcmf_dbg(u32 level, const char *func, const char *fmt, ...) + { +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h +@@ -45,6 +45,8 @@ + #undef pr_fmt + #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + ++__printf(2, 3) ++void __brcmf_err(const char *func, const char *fmt, ...); + #ifndef CPTCFG_BRCM_TRACING + /* Macro for error messages. net_ratelimit() is used when driver + * debugging is not selected. When debugging the driver error +@@ -53,11 +55,9 @@ + #define brcmf_err(fmt, ...) \ + do { \ + if (IS_ENABLED(CPTCFG_BRCMDBG) || net_ratelimit()) \ +- pr_err("%s: " fmt, __func__, ##__VA_ARGS__); \ ++ __brcmf_err(__func__, fmt, ##__VA_ARGS__); \ + } while (0) + #else +-__printf(2, 3) +-void __brcmf_err(const char *func, const char *fmt, ...); + #define brcmf_err(fmt, ...) \ + __brcmf_err(__func__, fmt, ##__VA_ARGS__) + #endif diff --git a/package/kernel/mac80211/patches/319-0006-brcmfmac-merge-two-remaining-brcmf_err-macros.patch b/package/kernel/mac80211/patches/319-0006-brcmfmac-merge-two-remaining-brcmf_err-macros.patch new file mode 100644 index 0000000000..3aaddb800d --- /dev/null +++ b/package/kernel/mac80211/patches/319-0006-brcmfmac-merge-two-remaining-brcmf_err-macros.patch @@ -0,0 +1,46 @@ +From d0630555650a394cf5743268820511f527a561a5 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Thu, 2 Feb 2017 22:33:15 +0100 +Subject: [PATCH] brcmfmac: merge two remaining brcmf_err macros +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Now we always have __brcmf_err function we can do perfectly fine with +just one macro. + +Signed-off-by: Rafał Miłecki +Acked-by: Arend van Spriel +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h | 14 +++++--------- + 1 file changed, 5 insertions(+), 9 deletions(-) + +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h +@@ -47,20 +47,16 @@ + + __printf(2, 3) + void __brcmf_err(const char *func, const char *fmt, ...); +-#ifndef CPTCFG_BRCM_TRACING +-/* Macro for error messages. net_ratelimit() is used when driver +- * debugging is not selected. When debugging the driver error +- * messages are as important as other tracing or even more so. ++/* Macro for error messages. When debugging / tracing the driver all error ++ * messages are important to us. + */ + #define brcmf_err(fmt, ...) \ + do { \ +- if (IS_ENABLED(CPTCFG_BRCMDBG) || net_ratelimit()) \ ++ if (IS_ENABLED(CPTCFG_BRCMDBG) || \ ++ IS_ENABLED(CPTCFG_BRCM_TRACING) || \ ++ net_ratelimit()) \ + __brcmf_err(__func__, fmt, ##__VA_ARGS__); \ + } while (0) +-#else +-#define brcmf_err(fmt, ...) \ +- __brcmf_err(__func__, fmt, ##__VA_ARGS__) +-#endif + + #if defined(DEBUG) || defined(CPTCFG_BRCM_TRACING) + __printf(3, 4) diff --git a/package/kernel/mac80211/patches/320-ath9k-clean-up-and-fix-ath_tx_count_airtime.patch b/package/kernel/mac80211/patches/320-ath9k-clean-up-and-fix-ath_tx_count_airtime.patch new file mode 100644 index 0000000000..a6a3bfca6d --- /dev/null +++ b/package/kernel/mac80211/patches/320-ath9k-clean-up-and-fix-ath_tx_count_airtime.patch @@ -0,0 +1,107 @@ +From: Felix Fietkau +Date: Sun, 12 Feb 2017 13:13:05 +0100 +Subject: [PATCH] ath9k: clean up and fix ath_tx_count_airtime + +ath_tx_count_airtime is doing a lot of unnecessary work: + +- Redundant station lookup +- Redundant rcu_read_lock/unlock +- Useless memcpy of bf->rates +- Useless NULL check of bf->bf_mpdu +- Redundant lookup of the skb tid + +Additionally, it tries to look up the mac80211 queue index from the txq, +which fails if the frame was delivered via the power save queue. + +This patch fixes all of these issues by passing down the right set of +pointers instead of doing extra work + +Cc: stable@vger.kernel.org +Fixes: 63fefa050477 ("ath9k: Introduce airtime fairness scheduling between stations") +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/wireless/ath/ath9k/xmit.c ++++ b/drivers/net/wireless/ath/ath9k/xmit.c +@@ -723,51 +723,31 @@ static bool bf_is_ampdu_not_probing(stru + return bf_isampdu(bf) && !(info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE); + } + +-static void ath_tx_count_airtime(struct ath_softc *sc, struct ath_txq *txq, +- struct ath_buf *bf, struct ath_tx_status *ts) ++static void ath_tx_count_airtime(struct ath_softc *sc, struct ath_node *an, ++ struct ath_atx_tid *tid, struct ath_buf *bf, ++ struct ath_tx_status *ts) + { +- struct ath_node *an; +- struct ath_acq *acq = &sc->cur_chan->acq[txq->mac80211_qnum]; +- struct sk_buff *skb; +- struct ieee80211_hdr *hdr; +- struct ieee80211_hw *hw = sc->hw; +- struct ieee80211_tx_rate rates[4]; +- struct ieee80211_sta *sta; +- int i; ++ struct ath_txq *txq = tid->txq; + u32 airtime = 0; +- +- skb = bf->bf_mpdu; +- if(!skb) +- return; +- +- hdr = (struct ieee80211_hdr *)skb->data; +- memcpy(rates, bf->rates, sizeof(rates)); +- +- rcu_read_lock(); +- +- sta = ieee80211_find_sta_by_ifaddr(hw, hdr->addr1, hdr->addr2); +- if(!sta) +- goto exit; +- +- +- an = (struct ath_node *) sta->drv_priv; ++ int i; + + airtime += ts->duration * (ts->ts_longretry + 1); ++ for(i = 0; i < ts->ts_rateindex; i++) { ++ int rate_dur = ath9k_hw_get_duration(sc->sc_ah, bf->bf_desc, i); ++ airtime += rate_dur * bf->rates[i].count; ++ } + +- for(i=0; i < ts->ts_rateindex; i++) +- airtime += ath9k_hw_get_duration(sc->sc_ah, bf->bf_desc, i) * rates[i].count; ++ if (sc->airtime_flags & AIRTIME_USE_TX) { ++ int q = txq->mac80211_qnum; ++ struct ath_acq *acq = &sc->cur_chan->acq[q]; + +- if (!!(sc->airtime_flags & AIRTIME_USE_TX)) { + spin_lock_bh(&acq->lock); +- an->airtime_deficit[txq->mac80211_qnum] -= airtime; +- if (an->airtime_deficit[txq->mac80211_qnum] <= 0) +- __ath_tx_queue_tid(sc, ath_get_skb_tid(sc, an, skb)); ++ an->airtime_deficit[q] -= airtime; ++ if (an->airtime_deficit[q] <= 0) ++ __ath_tx_queue_tid(sc, tid); + spin_unlock_bh(&acq->lock); + } + ath_debug_airtime(sc, an, 0, airtime); +- +-exit: +- rcu_read_unlock(); + } + + static void ath_tx_process_buffer(struct ath_softc *sc, struct ath_txq *txq, +@@ -791,13 +771,13 @@ static void ath_tx_process_buffer(struct + + ts->duration = ath9k_hw_get_duration(sc->sc_ah, bf->bf_desc, + ts->ts_rateindex); +- ath_tx_count_airtime(sc, txq, bf, ts); + + hdr = (struct ieee80211_hdr *) bf->bf_mpdu->data; + sta = ieee80211_find_sta_by_ifaddr(hw, hdr->addr1, hdr->addr2); + if (sta) { + struct ath_node *an = (struct ath_node *)sta->drv_priv; + tid = ath_get_skb_tid(sc, an, bf->bf_mpdu); ++ ath_tx_count_airtime(sc, an, tid, bf, ts); + if (ts->ts_status & (ATH9K_TXERR_FILT | ATH9K_TXERR_XRETRY)) + tid->clear_ps_filter = true; + } diff --git a/package/kernel/mac80211/patches/321-mac80211-fix-CSA-in-IBSS-mode.patch b/package/kernel/mac80211/patches/321-mac80211-fix-CSA-in-IBSS-mode.patch new file mode 100644 index 0000000000..13765b2900 --- /dev/null +++ b/package/kernel/mac80211/patches/321-mac80211-fix-CSA-in-IBSS-mode.patch @@ -0,0 +1,34 @@ +From: Koen Vandeputte +Date: Wed, 8 Feb 2017 15:29:45 +0100 +Subject: [PATCH] mac80211: fix CSA in IBSS mode +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Add the missing IBSS capability flag during capability init as it needs +to be inserted into the generated beacon in order for CSA to work. + +Signed-off-by: Piotr Gawlowicz +Signed-off-by: Mikołaj Chwalisz +Tested-by: Koen Vandeputte +--- + +--- a/net/mac80211/ibss.c ++++ b/net/mac80211/ibss.c +@@ -487,14 +487,14 @@ int ieee80211_ibss_csa_beacon(struct iee + struct beacon_data *presp, *old_presp; + struct cfg80211_bss *cbss; + const struct cfg80211_bss_ies *ies; +- u16 capability = 0; ++ u16 capability = WLAN_CAPABILITY_IBSS; + u64 tsf; + int ret = 0; + + sdata_assert_lock(sdata); + + if (ifibss->privacy) +- capability = WLAN_CAPABILITY_PRIVACY; ++ capability |= WLAN_CAPABILITY_PRIVACY; + + cbss = cfg80211_get_bss(sdata->local->hw.wiphy, ifibss->chandef.chan, + ifibss->bssid, ifibss->ssid, diff --git a/package/kernel/mac80211/patches/322-mac80211-don-t-handle-filtered-frames-within-a-BA-se.patch b/package/kernel/mac80211/patches/322-mac80211-don-t-handle-filtered-frames-within-a-BA-se.patch new file mode 100644 index 0000000000..66e1bfb4c1 --- /dev/null +++ b/package/kernel/mac80211/patches/322-mac80211-don-t-handle-filtered-frames-within-a-BA-se.patch @@ -0,0 +1,28 @@ +From: Felix Fietkau +Date: Wed, 22 Feb 2017 16:13:17 +0100 +Subject: [PATCH] mac80211: don't handle filtered frames within a BA session + +When running a BA session, the driver (or the hardware) already takes +care of retransmitting failed frames, since it has to keep the receiver +reorder window in sync. + +Adding another layer of retransmit around that does not improve +anything. In fact, it can only lead to some strong reordering with huge +latency. + +Cc: stable@vger.kernel.org +Signed-off-by: Felix Fietkau +--- + +--- a/net/mac80211/status.c ++++ b/net/mac80211/status.c +@@ -51,7 +51,8 @@ static void ieee80211_handle_filtered_fr + struct ieee80211_hdr *hdr = (void *)skb->data; + int ac; + +- if (info->flags & IEEE80211_TX_CTL_NO_PS_BUFFER) { ++ if (info->flags & (IEEE80211_TX_CTL_NO_PS_BUFFER | ++ IEEE80211_TX_CTL_AMPDU)) { + ieee80211_free_txskb(&local->hw, skb); + return; + } diff --git a/package/kernel/mac80211/patches/314-ath9k_hw-fix-channel-maximum-power-level-test.patch b/package/kernel/mac80211/patches/324-ath9k_hw-fix-channel-maximum-power-level-test.patch similarity index 100% rename from package/kernel/mac80211/patches/314-ath9k_hw-fix-channel-maximum-power-level-test.patch rename to package/kernel/mac80211/patches/324-ath9k_hw-fix-channel-maximum-power-level-test.patch diff --git a/package/kernel/mac80211/patches/325-mac80211-unconditionally-start-new-netdev-queues-wit.patch b/package/kernel/mac80211/patches/325-mac80211-unconditionally-start-new-netdev-queues-wit.patch new file mode 100644 index 0000000000..ff7bbcb645 --- /dev/null +++ b/package/kernel/mac80211/patches/325-mac80211-unconditionally-start-new-netdev-queues-wit.patch @@ -0,0 +1,29 @@ +From: Johannes Berg +Date: Wed, 29 Mar 2017 14:15:24 +0200 +Subject: [PATCH] mac80211: unconditionally start new netdev queues with iTXQ + support + +When internal mac80211 TXQs aren't supported, netdev queues must +always started out started even when driver queues are stopped +while the interface is added. This is necessary because with the +internal TXQ support netdev queues are never stopped and packet +scheduling/dropping is done in mac80211. + +Cc: stable@vger.kernel.org # 4.9+ +Fixes: 80a83cfc434b1 ("mac80211: skip netdev queue control with software queuing") +Reported-and-tested-by: Sven Eckelmann +Signed-off-by: Johannes Berg +--- + +--- a/net/mac80211/iface.c ++++ b/net/mac80211/iface.c +@@ -727,7 +727,8 @@ int ieee80211_do_open(struct wireless_de + ieee80211_recalc_ps(local); + + if (sdata->vif.type == NL80211_IFTYPE_MONITOR || +- sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { ++ sdata->vif.type == NL80211_IFTYPE_AP_VLAN || ++ local->ops->wake_tx_queue) { + /* XXX: for AP_VLAN, actually track AP queues */ + netif_tx_start_all_queues(dev); + } else if (dev) { diff --git a/package/kernel/mac80211/patches/326-brcmfmac-add-length-check-in-brcmf_cfg80211_escan_ha.patch b/package/kernel/mac80211/patches/326-brcmfmac-add-length-check-in-brcmf_cfg80211_escan_ha.patch new file mode 100644 index 0000000000..63c867a80c --- /dev/null +++ b/package/kernel/mac80211/patches/326-brcmfmac-add-length-check-in-brcmf_cfg80211_escan_ha.patch @@ -0,0 +1,63 @@ +From: Arend Van Spriel +Date: Tue, 12 Sep 2017 10:47:53 +0200 +Subject: [PATCH] brcmfmac: add length check in brcmf_cfg80211_escan_handler() + +Upon handling the firmware notification for scans the length was +checked properly and may result in corrupting kernel heap memory +due to buffer overruns. This fix addresses CVE-2017-0786. + +Cc: stable@vger.kernel.org # v4.0.x +Cc: Kevin Cernekee +Reviewed-by: Hante Meuleman +Reviewed-by: Pieter-Paul Giesberts +Reviewed-by: Franky Lin +Signed-off-by: Arend van Spriel +Signed-off-by: Kalle Valo +--- + +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +@@ -3088,6 +3088,7 @@ brcmf_cfg80211_escan_handler(struct brcm + struct brcmf_cfg80211_info *cfg = ifp->drvr->config; + s32 status; + struct brcmf_escan_result_le *escan_result_le; ++ u32 escan_buflen; + struct brcmf_bss_info_le *bss_info_le; + struct brcmf_bss_info_le *bss = NULL; + u32 bi_length; +@@ -3104,11 +3105,23 @@ brcmf_cfg80211_escan_handler(struct brcm + + if (status == BRCMF_E_STATUS_PARTIAL) { + brcmf_dbg(SCAN, "ESCAN Partial result\n"); ++ if (e->datalen < sizeof(*escan_result_le)) { ++ brcmf_err("invalid event data length\n"); ++ goto exit; ++ } + escan_result_le = (struct brcmf_escan_result_le *) data; + if (!escan_result_le) { + brcmf_err("Invalid escan result (NULL pointer)\n"); + goto exit; + } ++ escan_buflen = le32_to_cpu(escan_result_le->buflen); ++ if (escan_buflen > BRCMF_ESCAN_BUF_SIZE || ++ escan_buflen > e->datalen || ++ escan_buflen < sizeof(*escan_result_le)) { ++ brcmf_err("Invalid escan buffer length: %d\n", ++ escan_buflen); ++ goto exit; ++ } + if (le16_to_cpu(escan_result_le->bss_count) != 1) { + brcmf_err("Invalid bss_count %d: ignoring\n", + escan_result_le->bss_count); +@@ -3125,9 +3138,8 @@ brcmf_cfg80211_escan_handler(struct brcm + } + + bi_length = le32_to_cpu(bss_info_le->length); +- if (bi_length != (le32_to_cpu(escan_result_le->buflen) - +- WL_ESCAN_RESULTS_FIXED_SIZE)) { +- brcmf_err("Invalid bss_info length %d: ignoring\n", ++ if (bi_length != escan_buflen - WL_ESCAN_RESULTS_FIXED_SIZE) { ++ brcmf_err("Ignoring invalid bss_info length: %d\n", + bi_length); + goto exit; + } diff --git a/package/kernel/mac80211/patches/328-mac80211-use-constant-time-comparison-with-keys.patch b/package/kernel/mac80211/patches/328-mac80211-use-constant-time-comparison-with-keys.patch deleted file mode 100644 index 03e8201902..0000000000 --- a/package/kernel/mac80211/patches/328-mac80211-use-constant-time-comparison-with-keys.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 2bdd713b92a9cade239d3c7d15205a09f556624d Mon Sep 17 00:00:00 2001 -From: "Jason A. Donenfeld" -Date: Tue, 17 Oct 2017 20:32:07 +0200 -Subject: [PATCH] mac80211: use constant time comparison with keys - -Otherwise we risk leaking information via timing side channel. - -Fixes: fdf7cb4185b6 ("mac80211: accept key reinstall without changing anything") -Signed-off-by: Jason A. Donenfeld -Signed-off-by: Johannes Berg ---- - net/mac80211/key.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - ---- a/net/mac80211/key.c -+++ b/net/mac80211/key.c -@@ -19,6 +19,7 @@ - #include - #include - #include -+#include - #include - #include "ieee80211_i.h" - #include "driver-ops.h" -@@ -635,7 +636,7 @@ int ieee80211_key_link(struct ieee80211_ - * new version of the key to avoid nonce reuse or replay issues. - */ - if (old_key && key->conf.keylen == old_key->conf.keylen && -- !memcmp(key->conf.key, old_key->conf.key, key->conf.keylen)) { -+ !crypto_memneq(key->conf.key, old_key->conf.key, key->conf.keylen)) { - ieee80211_key_free_unused(key); - ret = 0; - goto out; diff --git a/package/kernel/mac80211/patches/329-mac80211-don-t-compare-TKIP-TX-MIC-key-in-reinstall.patch b/package/kernel/mac80211/patches/329-mac80211-don-t-compare-TKIP-TX-MIC-key-in-reinstall.patch deleted file mode 100644 index 1eaf51de72..0000000000 --- a/package/kernel/mac80211/patches/329-mac80211-don-t-compare-TKIP-TX-MIC-key-in-reinstall.patch +++ /dev/null @@ -1,73 +0,0 @@ -From cfbb0d90a7abb289edc91833d0905931f8805f12 Mon Sep 17 00:00:00 2001 -From: Johannes Berg -Date: Tue, 24 Oct 2017 21:12:13 +0200 -Subject: [PATCH] mac80211: don't compare TKIP TX MIC key in reinstall prevention - -For the reinstall prevention, the code I had added compares the -whole key. It turns out though that iwlwifi firmware doesn't -provide the TKIP TX MIC key as it's not needed in client mode, -and thus the comparison will always return false. - -For client mode, thus always zero out the TX MIC key part before -doing the comparison in order to avoid accepting the reinstall -of the key with identical encryption and RX MIC key, but not the -same TX MIC key (since the supplicant provides the real one.) - -Fixes: fdf7cb4185b6 ("mac80211: accept key reinstall without changing anything") -Signed-off-by: Johannes Berg ---- - net/mac80211/key.c | 36 ++++++++++++++++++++++++++++++++++-- - 1 file changed, 34 insertions(+), 2 deletions(-) - ---- a/net/mac80211/key.c -+++ b/net/mac80211/key.c -@@ -610,6 +610,39 @@ void ieee80211_key_free_unused(struct ie - ieee80211_key_free_common(key); - } - -+static bool ieee80211_key_identical(struct ieee80211_sub_if_data *sdata, -+ struct ieee80211_key *old, -+ struct ieee80211_key *new) -+{ -+ u8 tkip_old[WLAN_KEY_LEN_TKIP], tkip_new[WLAN_KEY_LEN_TKIP]; -+ u8 *tk_old, *tk_new; -+ -+ if (!old || new->conf.keylen != old->conf.keylen) -+ return false; -+ -+ tk_old = old->conf.key; -+ tk_new = new->conf.key; -+ -+ /* -+ * In station mode, don't compare the TX MIC key, as it's never used -+ * and offloaded rekeying may not care to send it to the host. This -+ * is the case in iwlwifi, for example. -+ */ -+ if (sdata->vif.type == NL80211_IFTYPE_STATION && -+ new->conf.cipher == WLAN_CIPHER_SUITE_TKIP && -+ new->conf.keylen == WLAN_KEY_LEN_TKIP && -+ !(new->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE)) { -+ memcpy(tkip_old, tk_old, WLAN_KEY_LEN_TKIP); -+ memcpy(tkip_new, tk_new, WLAN_KEY_LEN_TKIP); -+ memset(tkip_old + NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY, 0, 8); -+ memset(tkip_new + NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY, 0, 8); -+ tk_old = tkip_old; -+ tk_new = tkip_new; -+ } -+ -+ return !crypto_memneq(tk_old, tk_new, new->conf.keylen); -+} -+ - int ieee80211_key_link(struct ieee80211_key *key, - struct ieee80211_sub_if_data *sdata, - struct sta_info *sta) -@@ -635,8 +668,7 @@ int ieee80211_key_link(struct ieee80211_ - * Silently accept key re-installation without really installing the - * new version of the key to avoid nonce reuse or replay issues. - */ -- if (old_key && key->conf.keylen == old_key->conf.keylen && -- !crypto_memneq(key->conf.key, old_key->conf.key, key->conf.keylen)) { -+ if (ieee80211_key_identical(sdata, old_key, key)) { - ieee80211_key_free_unused(key); - ret = 0; - goto out; diff --git a/package/kernel/mac80211/patches/402-ath_regd_optional.patch b/package/kernel/mac80211/patches/402-ath_regd_optional.patch index fae9b55529..c8ede7f583 100644 --- a/package/kernel/mac80211/patches/402-ath_regd_optional.patch +++ b/package/kernel/mac80211/patches/402-ath_regd_optional.patch @@ -27,7 +27,7 @@ if (!IS_ENABLED(CPTCFG_ATH_REG_DYNAMIC_USER_REG_HINTS)) return false; if (!dynamic_country_user_possible(reg)) -@@ -345,6 +351,9 @@ ath_reg_apply_beaconing_flags(struct wip +@@ -341,6 +347,9 @@ ath_reg_apply_beaconing_flags(struct wip struct ieee80211_channel *ch; unsigned int i; @@ -37,7 +37,7 @@ for (band = 0; band < NUM_NL80211_BANDS; band++) { if (!wiphy->bands[band]) continue; -@@ -378,6 +387,9 @@ ath_reg_apply_ir_flags(struct wiphy *wip +@@ -374,6 +383,9 @@ ath_reg_apply_ir_flags(struct wiphy *wip { struct ieee80211_supported_band *sband; @@ -47,7 +47,7 @@ sband = wiphy->bands[NL80211_BAND_2GHZ]; if (!sband) return; -@@ -407,6 +419,9 @@ static void ath_reg_apply_radar_flags(st +@@ -402,6 +414,9 @@ static void ath_reg_apply_radar_flags(st struct ieee80211_channel *ch; unsigned int i; @@ -57,7 +57,7 @@ if (!wiphy->bands[NL80211_BAND_5GHZ]) return; -@@ -544,6 +559,11 @@ void ath_reg_notifier_apply(struct wiphy +@@ -539,6 +554,11 @@ void ath_reg_notifier_apply(struct wiphy ath_reg_dyn_country(wiphy, reg, request); break; } @@ -69,7 +69,7 @@ } EXPORT_SYMBOL(ath_reg_notifier_apply); -@@ -639,6 +659,10 @@ ath_regd_init_wiphy(struct ath_regulator +@@ -634,6 +654,10 @@ ath_regd_init_wiphy(struct ath_regulator const struct ieee80211_regdomain *regd; wiphy->reg_notifier = reg_notifier; @@ -80,7 +80,7 @@ wiphy->regulatory_flags |= REGULATORY_STRICT_REG | REGULATORY_CUSTOM_REG; -@@ -767,10 +791,7 @@ ath_regd_init(struct ath_regulatory *reg +@@ -762,10 +786,7 @@ ath_regd_init(struct ath_regulatory *reg if (r) return r; @@ -104,9 +104,9 @@ config ATH_DEBUG bool "Atheros wireless debugging" ---help--- ---- a/local-symbols -+++ b/local-symbols -@@ -82,6 +82,7 @@ ADM8211= +--- a/.local-symbols ++++ b/.local-symbols +@@ -130,6 +130,7 @@ ADM8211= ATH_COMMON= WLAN_VENDOR_ATH= ATH_DEBUG= diff --git a/package/kernel/mac80211/patches/404-regd_no_assoc_hints.patch b/package/kernel/mac80211/patches/404-regd_no_assoc_hints.patch index 457c0cb28c..469da90160 100644 --- a/package/kernel/mac80211/patches/404-regd_no_assoc_hints.patch +++ b/package/kernel/mac80211/patches/404-regd_no_assoc_hints.patch @@ -1,6 +1,6 @@ --- a/net/wireless/reg.c +++ b/net/wireless/reg.c -@@ -2497,6 +2497,8 @@ void regulatory_hint_country_ie(struct w +@@ -2398,6 +2398,8 @@ void regulatory_hint_country_ie(struct w enum environment_cap env = ENVIRON_ANY; struct regulatory_request *request = NULL, *lr; @@ -9,7 +9,7 @@ /* IE len must be evenly divisible by 2 */ if (country_ie_len & 0x01) return; -@@ -2703,6 +2705,7 @@ static void restore_regulatory_settings( +@@ -2604,6 +2606,7 @@ static void restore_regulatory_settings( void regulatory_hint_disconnect(void) { diff --git a/package/kernel/mac80211/patches/406-ath_relax_default_regd.patch b/package/kernel/mac80211/patches/406-ath_relax_default_regd.patch index 44e8f3281c..35b0f2b76e 100644 --- a/package/kernel/mac80211/patches/406-ath_relax_default_regd.patch +++ b/package/kernel/mac80211/patches/406-ath_relax_default_regd.patch @@ -39,7 +39,7 @@ bool ath_is_world_regd(struct ath_regulatory *reg) { return is_wwr_sku(ath_regd_get_eepromRD(reg)); -@@ -663,6 +671,9 @@ ath_regd_init_wiphy(struct ath_regulator +@@ -658,6 +666,9 @@ ath_regd_init_wiphy(struct ath_regulator if (IS_ENABLED(CPTCFG_ATH_USER_REGD)) return 0; diff --git a/package/kernel/mac80211/patches/440-ath5k_channel_bw_debugfs.patch b/package/kernel/mac80211/patches/440-ath5k_channel_bw_debugfs.patch index 3ae01a5c35..1d249a9723 100644 --- a/package/kernel/mac80211/patches/440-ath5k_channel_bw_debugfs.patch +++ b/package/kernel/mac80211/patches/440-ath5k_channel_bw_debugfs.patch @@ -109,7 +109,7 @@ drivers/net/wireless/ath/ath5k/debug.c | 86 ++++++++++++++++++++++++++++++++ /* debugfs: queues etc */ -@@ -1012,6 +1103,9 @@ ath5k_debug_init_device(struct ath5k_hw +@@ -1009,6 +1100,9 @@ ath5k_debug_init_device(struct ath5k_hw debugfs_create_file("beacon", S_IWUSR | S_IRUSR, phydir, ah, &fops_beacon); diff --git a/package/kernel/mac80211/patches/500-ath9k_eeprom_debugfs.patch b/package/kernel/mac80211/patches/500-ath9k_eeprom_debugfs.patch index b6dc45cd96..f21eed18c3 100644 --- a/package/kernel/mac80211/patches/500-ath9k_eeprom_debugfs.patch +++ b/package/kernel/mac80211/patches/500-ath9k_eeprom_debugfs.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -1374,6 +1374,53 @@ void ath9k_deinit_debug(struct ath_softc +@@ -1315,6 +1315,53 @@ void ath9k_deinit_debug(struct ath_softc ath9k_cmn_spectral_deinit_debug(&sc->spec_priv); } @@ -54,7 +54,7 @@ int ath9k_init_debug(struct ath_hw *ah) { struct ath_common *common = ath9k_hw_common(ah); -@@ -1393,6 +1440,8 @@ int ath9k_init_debug(struct ath_hw *ah) +@@ -1334,6 +1381,8 @@ int ath9k_init_debug(struct ath_hw *ah) ath9k_tx99_init_debug(sc); ath9k_cmn_spectral_init_debug(&sc->spec_priv, sc->debug.debugfs_phy); diff --git a/package/kernel/mac80211/patches/501-ath9k_ahb_init.patch b/package/kernel/mac80211/patches/501-ath9k_ahb_init.patch index 53225dbc36..d076e3c2eb 100644 --- a/package/kernel/mac80211/patches/501-ath9k_ahb_init.patch +++ b/package/kernel/mac80211/patches/501-ath9k_ahb_init.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c -@@ -1088,23 +1088,23 @@ static int __init ath9k_init(void) +@@ -1086,23 +1086,23 @@ static int __init ath9k_init(void) { int error; diff --git a/package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch b/package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch index 2ebb73d689..c98072bac9 100644 --- a/package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch +++ b/package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -1421,6 +1421,52 @@ static const struct file_operations fops +@@ -1362,6 +1362,52 @@ static const struct file_operations fops .owner = THIS_MODULE }; @@ -53,7 +53,7 @@ int ath9k_init_debug(struct ath_hw *ah) { struct ath_common *common = ath9k_hw_common(ah); -@@ -1442,6 +1488,8 @@ int ath9k_init_debug(struct ath_hw *ah) +@@ -1383,6 +1429,8 @@ int ath9k_init_debug(struct ath_hw *ah) debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc, &fops_eeprom); @@ -74,7 +74,7 @@ --- a/drivers/net/wireless/ath/ath9k/common.c +++ b/drivers/net/wireless/ath/ath9k/common.c -@@ -297,11 +297,13 @@ EXPORT_SYMBOL(ath9k_cmn_get_hw_crypto_ke +@@ -296,11 +296,13 @@ EXPORT_SYMBOL(ath9k_cmn_get_hw_crypto_ke /* * Update internal channel flags. */ @@ -89,7 +89,7 @@ ichan->channel = chan->center_freq; ichan->chan = chan; -@@ -309,7 +311,19 @@ static void ath9k_cmn_update_ichannel(st +@@ -308,7 +310,19 @@ static void ath9k_cmn_update_ichannel(st if (chan->band == NL80211_BAND_5GHZ) flags |= CHANNEL_5GHZ; @@ -110,7 +110,7 @@ case NL80211_CHAN_WIDTH_5: flags |= CHANNEL_QUARTER; break; -@@ -342,10 +356,11 @@ struct ath9k_channel *ath9k_cmn_get_chan +@@ -341,10 +355,11 @@ struct ath9k_channel *ath9k_cmn_get_chan struct cfg80211_chan_def *chandef) { struct ieee80211_channel *curchan = chandef->chan; diff --git a/package/kernel/mac80211/patches/513-ath9k_add_pci_ids.patch b/package/kernel/mac80211/patches/513-ath9k_add_pci_ids.patch index fdeaed05e8..59daf4fe11 100644 --- a/package/kernel/mac80211/patches/513-ath9k_add_pci_ids.patch +++ b/package/kernel/mac80211/patches/513-ath9k_add_pci_ids.patch @@ -20,7 +20,7 @@ #define AR9160_DEVID_PCI 0x0027 --- a/drivers/net/wireless/ath/ath9k/pci.c +++ b/drivers/net/wireless/ath/ath9k/pci.c -@@ -773,6 +773,7 @@ static const struct pci_device_id ath_pc +@@ -763,6 +763,7 @@ static const struct pci_device_id ath_pc .driver_data = ATH9K_PCI_BT_ANT_DIV }, #endif diff --git a/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch b/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch index 72857a0dbf..9a0f6f5dbd 100644 --- a/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch +++ b/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch @@ -1,6 +1,6 @@ --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h -@@ -2750,6 +2750,7 @@ struct cfg80211_pmk_conf { +@@ -2660,6 +2660,7 @@ struct cfg80211_nan_func { * (as advertised by the nl80211 feature flag.) * @get_tx_power: store the current TX power into the dbm variable; * return 0 if successful @@ -8,7 +8,7 @@ * * @set_wds_peer: set the WDS peer for a WDS interface * -@@ -3041,6 +3042,7 @@ struct cfg80211_ops { +@@ -2940,6 +2941,7 @@ struct cfg80211_ops { enum nl80211_tx_power_setting type, int mbm); int (*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev, int *dbm); @@ -18,7 +18,7 @@ const u8 *addr); --- a/include/net/mac80211.h +++ b/include/net/mac80211.h -@@ -1338,6 +1338,7 @@ enum ieee80211_smps_mode { +@@ -1325,6 +1325,7 @@ enum ieee80211_smps_mode { * * @power_level: requested transmit power (in dBm), backward compatibility * value only that is set to the minimum of all interfaces @@ -26,7 +26,7 @@ * * @chandef: the channel definition to tune to * @radar_enabled: whether radar detection is enabled -@@ -1358,6 +1359,7 @@ enum ieee80211_smps_mode { +@@ -1345,6 +1346,7 @@ enum ieee80211_smps_mode { struct ieee80211_conf { u32 flags; int power_level, dynamic_ps_timeout; @@ -36,9 +36,9 @@ u8 ps_dtim_period; --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h -@@ -2149,6 +2149,9 @@ enum nl80211_commands { - * @NL80211_ATTR_PMKR0_NAME: PMK-R0 Name for offloaded FT. - * @NL80211_ATTR_PORT_AUTHORIZED: (reserved) +@@ -2002,6 +2002,9 @@ enum nl80211_commands { + * u32 attribute with an &enum nl80211_timeout_reason value. This is used, + * e.g., with %NL80211_CMD_CONNECT event. * + * @NL80211_ATTR_WIPHY_ANTENNA_GAIN: Configured antenna gain. Used to reduce + * transmit power to stay within regulatory limits. u32, dBi. @@ -46,9 +46,9 @@ * @NUM_NL80211_ATTR: total number of nl80211_attrs available * @NL80211_ATTR_MAX: highest attribute number currently defined * @__NL80211_ATTR_AFTER_LAST: internal use -@@ -2575,6 +2578,8 @@ enum nl80211_attrs { - NL80211_ATTR_PMKR0_NAME, - NL80211_ATTR_PORT_AUTHORIZED, +@@ -2413,6 +2416,8 @@ enum nl80211_attrs { + + NL80211_ATTR_TIMEOUT_REASON, + NL80211_ATTR_WIPHY_ANTENNA_GAIN, + @@ -57,7 +57,7 @@ __NL80211_ATTR_AFTER_LAST, --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c -@@ -2444,6 +2444,19 @@ static int ieee80211_get_tx_power(struct +@@ -2396,6 +2396,19 @@ static int ieee80211_get_tx_power(struct return 0; } @@ -77,7 +77,7 @@ static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev, const u8 *addr) { -@@ -3717,6 +3730,7 @@ const struct cfg80211_ops mac80211_confi +@@ -3627,6 +3640,7 @@ const struct cfg80211_ops mac80211_confi .set_wiphy_params = ieee80211_set_wiphy_params, .set_tx_power = ieee80211_set_tx_power, .get_tx_power = ieee80211_get_tx_power, @@ -87,7 +87,7 @@ CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd) --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h -@@ -1347,6 +1347,7 @@ struct ieee80211_local { +@@ -1370,6 +1370,7 @@ struct ieee80211_local { int dynamic_ps_forced_timeout; int user_power_level; /* in dBm, for all interfaces */ @@ -119,7 +119,7 @@ if (local->hw.conf.power_level != power) { changed |= IEEE80211_CONF_CHANGE_POWER; local->hw.conf.power_level = power; -@@ -592,6 +598,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_ +@@ -589,6 +595,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_ IEEE80211_RADIOTAP_MCS_HAVE_BW; local->hw.radiotap_vht_details = IEEE80211_RADIOTAP_VHT_KNOWN_GI | IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH; @@ -129,15 +129,15 @@ local->user_power_level = IEEE80211_UNSET_POWER_LEVEL; --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c -@@ -420,6 +420,7 @@ static const struct nla_policy nl80211_p - [NL80211_ATTR_FILS_CACHE_ID] = { .len = 2 }, - [NL80211_ATTR_PMK] = { .type = NLA_BINARY, .len = PMK_MAX_LEN }, - [NL80211_ATTR_SCHED_SCAN_MULTI] = { .type = NLA_FLAG }, +@@ -424,6 +424,7 @@ static const struct nla_policy nl80211_p + .len = sizeof(struct nl80211_bss_select_rssi_adjust) + }, + [NL80211_ATTR_TIMEOUT_REASON] = { .type = NLA_U32 }, + [NL80211_ATTR_WIPHY_ANTENNA_GAIN] = { .type = NLA_U32 }, }; /* policy for the key attributes */ -@@ -2395,6 +2396,20 @@ static int nl80211_set_wiphy(struct sk_b +@@ -2385,6 +2386,20 @@ static int nl80211_set_wiphy(struct sk_b if (result) return result; } diff --git a/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch b/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch index 9084ea7db3..b3b51b4433 100644 --- a/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch +++ b/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch @@ -103,8 +103,7 @@ + GFP_KERNEL); + if (!led) + return -ENOMEM; - -- ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, val); ++ + led->gpio = gpio = (struct gpio_led *) (led + 1); + _name = (char *) (led->gpio + 1); + @@ -117,7 +116,8 @@ + ret = ath_add_led(sc, led); + if (unlikely(ret < 0)) + kfree(led); -+ + +- ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, val); + return ret; } @@ -125,11 +125,11 @@ { - if (!sc->led_registered) - return; -- -- ath_led_brightness(&sc->led_cdev, LED_OFF); -- led_classdev_unregister(&sc->led_cdev); + struct ath_led *led; +- ath_led_brightness(&sc->led_cdev, LED_OFF); +- led_classdev_unregister(&sc->led_cdev); +- - ath9k_hw_gpio_free(sc->sc_ah, sc->sc_ah->led_pin); + while (!list_empty(&sc->leds)) { + led = list_first_entry(&sc->leds, struct ath_led, list); @@ -181,7 +181,7 @@ --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c -@@ -1000,7 +1000,7 @@ int ath9k_init_device(u16 devid, struct +@@ -998,7 +998,7 @@ int ath9k_init_device(u16 devid, struct #ifdef CPTCFG_MAC80211_LEDS /* must be initialized before ieee80211_register_hw */ @@ -192,7 +192,7 @@ #endif --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -1466,6 +1466,61 @@ static const struct file_operations fops +@@ -1407,6 +1407,61 @@ static const struct file_operations fops .llseek = default_llseek, }; @@ -254,7 +254,7 @@ int ath9k_init_debug(struct ath_hw *ah) { -@@ -1490,6 +1545,10 @@ int ath9k_init_debug(struct ath_hw *ah) +@@ -1431,6 +1486,10 @@ int ath9k_init_debug(struct ath_hw *ah) &fops_eeprom); debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, sc, &fops_chanbw); diff --git a/package/kernel/mac80211/patches/531-ath9k_extra_platform_leds.patch b/package/kernel/mac80211/patches/531-ath9k_extra_platform_leds.patch index 8ed7ad8a09..35d8e8bd42 100644 --- a/package/kernel/mac80211/patches/531-ath9k_extra_platform_leds.patch +++ b/package/kernel/mac80211/patches/531-ath9k_extra_platform_leds.patch @@ -56,21 +56,16 @@ INIT_LIST_HEAD(&sc->leds); -@@ -134,6 +155,17 @@ void ath_init_leds(struct ath_softc *sc) +@@ -144,6 +165,12 @@ void ath_init_leds(struct ath_softc *sc) - ath_fill_led_pin(sc); - -+ if (pdata && pdata->leds && pdata->num_leds) -+ for (i = 0; i < pdata->num_leds; i++) { -+ if (pdata->leds[i].gpio == sc->sc_ah->led_pin) -+ sc->sc_ah->led_pin = -1; + ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger, + !sc->sc_ah->config.led_active_high); + -+ ath_create_platform_led(sc, &pdata->leds[i]); -+ } -+ -+ if (sc->sc_ah->led_pin < 0) ++ if (!pdata) + return; + - snprintf(led_name, sizeof(led_name), "ath9k-%s", - wiphy_name(sc->hw->wiphy)); ++ for (i = 0; i < pdata->num_leds; i++) ++ ath_create_platform_led(sc, &pdata->leds[i]); + } + #endif diff --git a/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch b/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch index 7cf589485e..3e687792da 100644 --- a/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch +++ b/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -1522,6 +1522,50 @@ static const struct file_operations fops +@@ -1463,6 +1463,50 @@ static const struct file_operations fops #endif @@ -51,7 +51,7 @@ int ath9k_init_debug(struct ath_hw *ah) { struct ath_common *common = ath9k_hw_common(ah); -@@ -1549,6 +1593,8 @@ int ath9k_init_debug(struct ath_hw *ah) +@@ -1490,6 +1534,8 @@ int ath9k_init_debug(struct ath_hw *ah) debugfs_create_file("gpio_led", S_IWUSR, sc->debug.debugfs_phy, sc, &fops_gpio_led); #endif @@ -75,16 +75,16 @@ struct ath9k_hw_version { u32 magic; u16 devid; -@@ -806,6 +812,8 @@ struct ath_hw { +@@ -805,6 +811,8 @@ struct ath_hw { + u32 rfkill_polarity; u32 ah_flags; - s16 nf_override; + unsigned long diag; + bool reset_power_on; bool htc_reset_init; -@@ -1068,6 +1076,7 @@ void ath9k_hw_check_nav(struct ath_hw *a +@@ -1067,6 +1075,7 @@ void ath9k_hw_check_nav(struct ath_hw *a bool ath9k_hw_check_alive(struct ath_hw *ah); bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode); diff --git a/package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch b/package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch index f9d3251c22..6f7370203b 100644 --- a/package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch +++ b/package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch @@ -18,7 +18,7 @@ void (*spectral_scan_trigger)(struct ath_hw *ah); --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c -@@ -1945,6 +1945,26 @@ void ar9003_hw_init_rate_txpower(struct +@@ -1947,6 +1947,26 @@ void ar9003_hw_init_rate_txpower(struct } } @@ -45,7 +45,7 @@ void ar9003_hw_attach_phy_ops(struct ath_hw *ah) { struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah); -@@ -1981,6 +2001,7 @@ void ar9003_hw_attach_phy_ops(struct ath +@@ -1983,6 +2003,7 @@ void ar9003_hw_attach_phy_ops(struct ath priv_ops->set_radar_params = ar9003_hw_set_radar_params; priv_ops->fast_chan_change = ar9003_hw_fast_chan_change; @@ -65,8 +65,8 @@ } static const struct ieee80211_iface_limit if_limits[] = { -@@ -960,6 +961,18 @@ static void ath9k_set_hw_capab(struct at - wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); +@@ -958,6 +959,18 @@ static void ath9k_set_hw_capab(struct at + SET_IEEE80211_PERM_ADDR(hw, common->macaddr); } +static void ath_get_initial_entropy(struct ath_softc *sc) @@ -84,7 +84,7 @@ int ath9k_init_device(u16 devid, struct ath_softc *sc, const struct ath_bus_ops *bus_ops) { -@@ -1005,6 +1018,8 @@ int ath9k_init_device(u16 devid, struct +@@ -1003,6 +1016,8 @@ int ath9k_init_device(u16 devid, struct ARRAY_SIZE(ath9k_tpt_blink)); #endif diff --git a/package/kernel/mac80211/patches/546-ath9k_platform_led_name.patch b/package/kernel/mac80211/patches/546-ath9k_platform_led_name.patch new file mode 100644 index 0000000000..ced72c6c69 --- /dev/null +++ b/package/kernel/mac80211/patches/546-ath9k_platform_led_name.patch @@ -0,0 +1,39 @@ +From: Michal Cieslakiewicz +Date: Sun, 31 Jan 2016 20:45:57 +0100 +Subject: [PATCH v4 1/8] mac80211: ath9k: enable platform WLAN LED name + +Enable platform-supplied WLAN LED name for ath9k device. It replaces generic +'ath9k-phy*' label with string set during platform initialization. + +Signed-off-by: Michal Cieslakiewicz +--- + drivers/net/wireless/ath/ath9k/gpio.c | 10 +++++++--- + include/linux/ath9k_platform.h | 1 + + 2 files changed, 8 insertions(+), 3 deletions(-) + +--- a/drivers/net/wireless/ath/ath9k/gpio.c ++++ b/drivers/net/wireless/ath/ath9k/gpio.c +@@ -155,8 +155,11 @@ void ath_init_leds(struct ath_softc *sc) + + ath_fill_led_pin(sc); + +- snprintf(led_name, sizeof(led_name), "ath9k-%s", +- wiphy_name(sc->hw->wiphy)); ++ if (pdata && pdata->led_name) ++ strncpy(led_name, pdata->led_name, sizeof(led_name)); ++ else ++ snprintf(led_name, sizeof(led_name), "ath9k-%s", ++ wiphy_name(sc->hw->wiphy)); + + if (ath9k_led_blink) + trigger = sc->led_default_trigger; +--- a/include/linux/ath9k_platform.h ++++ b/include/linux/ath9k_platform.h +@@ -49,6 +49,7 @@ struct ath9k_platform_data { + + int num_leds; + const struct gpio_led *leds; ++ const char *led_name; + }; + + #endif /* _LINUX_ATH9K_PLATFORM_H */ diff --git a/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch b/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch index 31dac29ad7..d4269282d9 100644 --- a/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch +++ b/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch @@ -196,7 +196,7 @@ Signed-off-by: Felix Fietkau return 0; } -@@ -136,17 +264,24 @@ void ath_deinit_leds(struct ath_softc *s +@@ -136,12 +264,18 @@ void ath_deinit_leds(struct ath_softc *s while (!list_empty(&sc->leds)) { led = list_first_entry(&sc->leds, struct ath_led, list); @@ -215,31 +215,18 @@ Signed-off-by: Felix Fietkau } void ath_init_leds(struct ath_softc *sc) - { - struct ath9k_platform_data *pdata = sc->dev->platform_data; -+ struct device_node *np = sc->dev->of_node; - char led_name[32]; - const char *trigger; - int i; -@@ -156,6 +291,15 @@ void ath_init_leds(struct ath_softc *sc) - if (AR_SREV_9100(sc->sc_ah)) - return; +@@ -158,6 +292,8 @@ void ath_init_leds(struct ath_softc *sc) -+ if (!np) -+ ath9k_register_gpio_chip(sc); -+ -+ /* setup gpio controller only if requested and skip the led_pin setup */ -+ if (of_property_read_bool(np, "gpio-controller")) { -+ ath9k_register_gpio_chip(sc); -+ return; -+ } -+ ath_fill_led_pin(sc); - if (pdata && pdata->leds && pdata->num_leds) -@@ -180,6 +324,7 @@ void ath_init_leds(struct ath_softc *sc) - ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger, - !sc->sc_ah->config.led_active_high); ++ ath9k_register_gpio_chip(sc); ++ + if (pdata && pdata->led_name) + strncpy(led_name, pdata->led_name, sizeof(led_name)); + else +@@ -178,6 +314,7 @@ void ath_init_leds(struct ath_softc *sc) + for (i = 0; i < pdata->num_leds; i++) + ath_create_platform_led(sc, &pdata->leds[i]); } + #endif diff --git a/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch b/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch index f3fead0a1a..f40bac93c3 100644 --- a/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch +++ b/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch @@ -117,20 +117,29 @@ Signed-off-by: Felix Fietkau while (!list_empty(&sc->leds)) { led = list_first_entry(&sc->leds, struct ath_led, list); #ifdef CONFIG_GPIOLIB -@@ -301,6 +370,7 @@ void ath_init_leds(struct ath_softc *sc) - } - +@@ -293,6 +362,7 @@ void ath_init_leds(struct ath_softc *sc) ath_fill_led_pin(sc); + + ath9k_register_gpio_chip(sc); + ath9k_init_buttons(sc); - if (pdata && pdata->leds && pdata->num_leds) - for (i = 0; i < pdata->num_leds; i++) { + if (pdata && pdata->led_name) + strncpy(led_name, pdata->led_name, sizeof(led_name)); +@@ -308,7 +378,7 @@ void ath_init_leds(struct ath_softc *sc) + ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger, + !sc->sc_ah->config.led_active_high); + +- if (!pdata) ++ if (!pdata || !pdata->leds || !pdata->num_leds) + return; + + for (i = 0; i < pdata->num_leds; i++) --- a/include/linux/ath9k_platform.h +++ b/include/linux/ath9k_platform.h -@@ -49,6 +49,10 @@ struct ath9k_platform_data { - +@@ -50,6 +50,10 @@ struct ath9k_platform_data { int num_leds; const struct gpio_led *leds; + const char *led_name; + + unsigned num_btns; + const struct gpio_keys_button *btns; diff --git a/package/kernel/mac80211/patches/551-ath9k_ubnt_uap_plus_hsr.patch b/package/kernel/mac80211/patches/551-ath9k_ubnt_uap_plus_hsr.patch index 6d541d6a57..45284c71ee 100644 --- a/package/kernel/mac80211/patches/551-ath9k_ubnt_uap_plus_hsr.patch +++ b/package/kernel/mac80211/patches/551-ath9k_ubnt_uap_plus_hsr.patch @@ -375,7 +375,7 @@ --- a/include/linux/ath9k_platform.h +++ b/include/linux/ath9k_platform.h -@@ -53,6 +53,8 @@ struct ath9k_platform_data { +@@ -54,6 +54,8 @@ struct ath9k_platform_data { unsigned num_btns; const struct gpio_keys_button *btns; unsigned btn_poll_interval; @@ -384,9 +384,9 @@ }; #endif /* _LINUX_ATH9K_PLATFORM_H */ ---- a/local-symbols -+++ b/local-symbols -@@ -109,6 +109,7 @@ ATH9K_WOW= +--- a/.local-symbols ++++ b/.local-symbols +@@ -157,6 +157,7 @@ ATH9K_WOW= ATH9K_RFKILL= ATH9K_CHANNEL_CONTEXT= ATH9K_PCOEM= diff --git a/package/kernel/mac80211/patches/600-02-rt2x00-rt2800lib-enable-support-for-RT3883.patch b/package/kernel/mac80211/patches/600-02-rt2x00-rt2800lib-enable-support-for-RT3883.patch index 5127c5cfe4..2325f37670 100644 --- a/package/kernel/mac80211/patches/600-02-rt2x00-rt2800lib-enable-support-for-RT3883.patch +++ b/package/kernel/mac80211/patches/600-02-rt2x00-rt2800lib-enable-support-for-RT3883.patch @@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -9403,6 +9403,7 @@ static int rt2800_probe_rt(struct rt2x00 +@@ -9379,6 +9379,7 @@ static int rt2800_probe_rt(struct rt2x00 case RT3390: case RT3572: case RT3593: diff --git a/package/kernel/mac80211/patches/600-03-rt2x00-rt2800lib-add-rf_vals-for-RF3853.patch b/package/kernel/mac80211/patches/600-03-rt2x00-rt2800lib-add-rf_vals-for-RF3853.patch index 60e57c1bae..9775664deb 100644 --- a/package/kernel/mac80211/patches/600-03-rt2x00-rt2800lib-add-rf_vals-for-RF3853.patch +++ b/package/kernel/mac80211/patches/600-03-rt2x00-rt2800lib-add-rf_vals-for-RF3853.patch @@ -31,7 +31,7 @@ Signed-off-by: Gabor Juhos #define RF5362 0x5362 --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -8981,6 +8981,66 @@ static const struct rf_channel rf_vals_3 +@@ -8957,6 +8957,66 @@ static const struct rf_channel rf_vals_3 {14, 0xF0, 2, 0x18}, }; @@ -98,7 +98,7 @@ Signed-off-by: Gabor Juhos static const struct rf_channel rf_vals_5592_xtal20[] = { /* Channel, N, K, mod, R */ {1, 482, 4, 10, 3}, -@@ -9244,6 +9304,11 @@ static int rt2800_probe_hw_mode(struct r +@@ -9220,6 +9280,11 @@ static int rt2800_probe_hw_mode(struct r spec->channels = rf_vals_3x; break; @@ -108,5 +108,5 @@ Signed-off-by: Gabor Juhos + break; + case RF5592: - reg = rt2800_register_read(rt2x00dev, MAC_DEBUG_INDEX); + rt2800_register_read(rt2x00dev, MAC_DEBUG_INDEX, ®); if (rt2x00_get_field32(reg, MAC_DEBUG_INDEX_XTAL)) { diff --git a/package/kernel/mac80211/patches/600-04-rt2x00-rt2800lib-enable-VCO-calibration-for-RF3853.patch b/package/kernel/mac80211/patches/600-04-rt2x00-rt2800lib-enable-VCO-calibration-for-RF3853.patch index def2c397fd..5737e015c1 100644 --- a/package/kernel/mac80211/patches/600-04-rt2x00-rt2800lib-enable-VCO-calibration-for-RF3853.patch +++ b/package/kernel/mac80211/patches/600-04-rt2x00-rt2800lib-enable-VCO-calibration-for-RF3853.patch @@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -4881,6 +4881,7 @@ void rt2800_vco_calibration(struct rt2x0 +@@ -4855,6 +4855,7 @@ void rt2800_vco_calibration(struct rt2x0 case RF3053: case RF3070: case RF3290: @@ -18,7 +18,7 @@ Signed-off-by: Gabor Juhos case RF5350: case RF5360: case RF5362: -@@ -9426,6 +9427,7 @@ static int rt2800_probe_hw_mode(struct r +@@ -9402,6 +9403,7 @@ static int rt2800_probe_hw_mode(struct r case RF3053: case RF3070: case RF3290: diff --git a/package/kernel/mac80211/patches/600-05-rt2x00-rt2800lib-add-channel-configuration-function-.patch b/package/kernel/mac80211/patches/600-05-rt2x00-rt2800lib-add-channel-configuration-function-.patch index 1d6e312037..afcb6bdf4a 100644 --- a/package/kernel/mac80211/patches/600-05-rt2x00-rt2800lib-add-channel-configuration-function-.patch +++ b/package/kernel/mac80211/patches/600-05-rt2x00-rt2800lib-add-channel-configuration-function-.patch @@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -2713,6 +2713,211 @@ static void rt2800_config_channel_rf3053 +@@ -2709,6 +2709,211 @@ static void rt2800_config_channel_rf3053 } } @@ -50,7 +50,7 @@ Signed-off-by: Gabor Juhos + + rt2800_rfcsr_write(rt2x00dev, 13, 0x12); + -+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 1); ++ rt2800_rfcsr_read(rt2x00dev, 1, &rfcsr); + rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 0); + rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 0); + rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 0); @@ -87,7 +87,7 @@ Signed-off-by: Gabor Juhos + + rt2800_freq_cal_mode1(rt2x00dev); + -+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 30); ++ rt2800_rfcsr_read(rt2x00dev, 30, &rfcsr); + if (!conf_is_ht40(conf)) + rfcsr &= ~(0x06); + else @@ -110,7 +110,7 @@ Signed-off-by: Gabor Juhos + rt2800_rfcsr_write(rt2x00dev, 34, 0x20); + + /* loopback RF_BS */ -+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 36); ++ rt2800_rfcsr_read(rt2x00dev, 36, &rfcsr); + if (rf->channel <= 14) + rt2x00_set_field8(&rfcsr, RFCSR36_RF_BS, 1); + else @@ -158,13 +158,13 @@ Signed-off-by: Gabor Juhos + + rt2800_rfcsr_write(rt2x00dev, 50, 0x86); + -+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 51); ++ rt2800_rfcsr_read(rt2x00dev, 51, &rfcsr); + if (rf->channel <= 14) + rt2800_rfcsr_write(rt2x00dev, 51, 0x75); + else + rt2800_rfcsr_write(rt2x00dev, 51, 0x51); + -+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 52); ++ rt2800_rfcsr_read(rt2x00dev, 52, &rfcsr); + if (rf->channel <= 14) + rt2800_rfcsr_write(rt2x00dev, 52, 0x45); + else @@ -194,25 +194,25 @@ Signed-off-by: Gabor Juhos + ((info->default_power2 & 0xe0) >> 1); + rt2800_bbp_write(rt2x00dev, 109, bbp); + -+ bbp = rt2800_bbp_read(rt2x00dev, 110); ++ rt2800_bbp_read(rt2x00dev, 110, &bbp); + bbp &= 0x0f; + bbp |= (info->default_power3 & 0xe0) >> 1; + rt2800_bbp_write(rt2x00dev, 110, bbp); + -+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 57); ++ rt2800_rfcsr_read(rt2x00dev, 57, &rfcsr); + if (rf->channel <= 14) + rt2800_rfcsr_write(rt2x00dev, 57, 0x6e); + else + rt2800_rfcsr_write(rt2x00dev, 57, 0x3e); + + /* Enable RF tuning */ -+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 3); ++ rt2800_rfcsr_read(rt2x00dev, 3, &rfcsr); + rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1); + rt2800_rfcsr_write(rt2x00dev, 3, rfcsr); + + udelay(2000); + -+ bbp = rt2800_bbp_read(rt2x00dev, 49); ++ rt2800_bbp_read(rt2x00dev, 49, &bbp); + /* clear update flag */ + rt2800_bbp_write(rt2x00dev, 49, bbp & 0xfe); + rt2800_bbp_write(rt2x00dev, 49, bbp); @@ -223,7 +223,7 @@ Signed-off-by: Gabor Juhos #define POWER_BOUND 0x27 #define POWER_BOUND_5G 0x2b -@@ -3570,6 +3775,9 @@ static void rt2800_config_channel(struct +@@ -3565,6 +3770,9 @@ static void rt2800_config_channel(struct case RF3322: rt2800_config_channel_rf3322(rt2x00dev, conf, rf, info); break; diff --git a/package/kernel/mac80211/patches/600-06-rt2x00-rt2800lib-enable-RF3853-support.patch b/package/kernel/mac80211/patches/600-06-rt2x00-rt2800lib-enable-RF3853-support.patch index 6476dc107b..9579016595 100644 --- a/package/kernel/mac80211/patches/600-06-rt2x00-rt2800lib-enable-RF3853-support.patch +++ b/package/kernel/mac80211/patches/600-06-rt2x00-rt2800lib-enable-RF3853-support.patch @@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -8906,6 +8906,7 @@ static int rt2800_init_eeprom(struct rt2 +@@ -8882,6 +8882,7 @@ static int rt2800_init_eeprom(struct rt2 case RF3290: case RF3320: case RF3322: diff --git a/package/kernel/mac80211/patches/600-07-rt2x00-rt2800lib-add-MAC-register-initialization-for.patch b/package/kernel/mac80211/patches/600-07-rt2x00-rt2800lib-add-MAC-register-initialization-for.patch index 0a931e2026..08b54f6726 100644 --- a/package/kernel/mac80211/patches/600-07-rt2x00-rt2800lib-add-MAC-register-initialization-for.patch +++ b/package/kernel/mac80211/patches/600-07-rt2x00-rt2800lib-add-MAC-register-initialization-for.patch @@ -35,7 +35,7 @@ Signed-off-by: Gabor Juhos #define RX_FILTER_CFG 0x1400 --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -5509,6 +5509,12 @@ static int rt2800_init_registers(struct +@@ -5485,6 +5485,12 @@ static int rt2800_init_registers(struct rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000); } @@ -48,7 +48,7 @@ Signed-off-by: Gabor Juhos } else if (rt2x00_rt(rt2x00dev, RT5390) || rt2x00_rt(rt2x00dev, RT5392) || rt2x00_rt(rt2x00dev, RT6352)) { -@@ -5722,6 +5728,11 @@ static int rt2800_init_registers(struct +@@ -5698,6 +5704,11 @@ static int rt2800_init_registers(struct reg = rt2x00_rt(rt2x00dev, RT5592) ? 0x00000082 : 0x00000002; rt2800_register_write(rt2x00dev, TXOP_HLDR_ET, reg); @@ -57,6 +57,6 @@ Signed-off-by: Gabor Juhos + rt2800_register_write(rt2x00dev, TX_FBK_CFG_3S_1, 0x16151413); + } + - reg = rt2800_register_read(rt2x00dev, TX_RTS_CFG); + rt2800_register_read(rt2x00dev, TX_RTS_CFG, ®); rt2x00_set_field32(®, TX_RTS_CFG_AUTO_RTS_RETRY_LIMIT, 7); rt2x00_set_field32(®, TX_RTS_CFG_RTS_THRES, diff --git a/package/kernel/mac80211/patches/600-09-rt2x00-rt2800lib-add-BBP-register-initialization-for.patch b/package/kernel/mac80211/patches/600-09-rt2x00-rt2800lib-add-BBP-register-initialization-for.patch index 99f57bcd33..ced3645aef 100644 --- a/package/kernel/mac80211/patches/600-09-rt2x00-rt2800lib-add-BBP-register-initialization-for.patch +++ b/package/kernel/mac80211/patches/600-09-rt2x00-rt2800lib-add-BBP-register-initialization-for.patch @@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -6349,6 +6349,47 @@ static void rt2800_init_bbp_3593(struct +@@ -6325,6 +6325,47 @@ static void rt2800_init_bbp_3593(struct rt2800_bbp_write(rt2x00dev, 103, 0xc0); } @@ -59,7 +59,7 @@ Signed-off-by: Gabor Juhos static void rt2800_init_bbp_53xx(struct rt2x00_dev *rt2x00dev) { int ant, div_mode; -@@ -6792,6 +6833,9 @@ static void rt2800_init_bbp(struct rt2x0 +@@ -6769,6 +6810,9 @@ static void rt2800_init_bbp(struct rt2x0 case RT3593: rt2800_init_bbp_3593(rt2x00dev); return; diff --git a/package/kernel/mac80211/patches/600-10-rt2x00-rt2800lib-add-RFCSR-initialization-for-RT3883.patch b/package/kernel/mac80211/patches/600-10-rt2x00-rt2800lib-add-RFCSR-initialization-for-RT3883.patch index c0f1f5863b..08e4ffe9ba 100644 --- a/package/kernel/mac80211/patches/600-10-rt2x00-rt2800lib-add-RFCSR-initialization-for-RT3883.patch +++ b/package/kernel/mac80211/patches/600-10-rt2x00-rt2800lib-add-RFCSR-initialization-for-RT3883.patch @@ -21,7 +21,7 @@ Signed-off-by: Gabor Juhos #define RFCSR2_TX2_EN_MT7620 FIELD8(0x20) --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -7707,6 +7707,144 @@ static void rt2800_init_rfcsr_5350(struc +@@ -7685,6 +7685,144 @@ static void rt2800_init_rfcsr_5350(struc rt2800_rfcsr_write(rt2x00dev, 63, 0x00); } @@ -134,7 +134,7 @@ Signed-off-by: Gabor Juhos + rt2800_rfcsr_write(rt2x00dev, 33, 0x32); + } + -+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 2); ++ rt2800_rfcsr_read(rt2x00dev, 2, &rfcsr); + rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_BP, 0); + rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_EN, 1); + rt2800_rfcsr_write(rt2x00dev, 2, rfcsr); @@ -142,23 +142,23 @@ Signed-off-by: Gabor Juhos + rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_EN, 0); + rt2800_rfcsr_write(rt2x00dev, 2, rfcsr); + -+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 1); ++ rt2800_rfcsr_read(rt2x00dev, 1, &rfcsr); + rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1); + rt2800_rfcsr_write(rt2x00dev, 1, rfcsr); + -+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 6); ++ rt2800_rfcsr_read(rt2x00dev, 6, &rfcsr); + rfcsr |= 0xc0; + rt2800_rfcsr_write(rt2x00dev, 6, rfcsr); + -+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 22); ++ rt2800_rfcsr_read(rt2x00dev, 22, &rfcsr); + rfcsr |= 0x20; + rt2800_rfcsr_write(rt2x00dev, 22, rfcsr); + -+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 46); ++ rt2800_rfcsr_read(rt2x00dev, 46, &rfcsr); + rfcsr |= 0x20; + rt2800_rfcsr_write(rt2x00dev, 46, rfcsr); + -+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 20); ++ rt2800_rfcsr_read(rt2x00dev, 20, &rfcsr); + rfcsr &= ~0xee; + rt2800_rfcsr_write(rt2x00dev, 20, rfcsr); +} @@ -166,7 +166,7 @@ Signed-off-by: Gabor Juhos static void rt2800_init_rfcsr_5390(struct rt2x00_dev *rt2x00dev) { rt2800_rf_init_calibration(rt2x00dev, 2); -@@ -8549,6 +8687,9 @@ static void rt2800_init_rfcsr(struct rt2 +@@ -8525,6 +8663,9 @@ static void rt2800_init_rfcsr(struct rt2 case RT3390: rt2800_init_rfcsr_3390(rt2x00dev); break; diff --git a/package/kernel/mac80211/patches/600-11-rt2x00-rt2800lib-use-the-extended-EEPROM-map-for-RT3.patch b/package/kernel/mac80211/patches/600-11-rt2x00-rt2800lib-use-the-extended-EEPROM-map-for-RT3.patch index e74f399e65..0e9496c056 100644 --- a/package/kernel/mac80211/patches/600-11-rt2x00-rt2800lib-use-the-extended-EEPROM-map-for-RT3.patch +++ b/package/kernel/mac80211/patches/600-11-rt2x00-rt2800lib-use-the-extended-EEPROM-map-for-RT3.patch @@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -381,7 +381,8 @@ static unsigned int rt2800_eeprom_word_i +@@ -376,7 +376,8 @@ static unsigned int rt2800_eeprom_word_i wiphy_name(rt2x00dev->hw->wiphy), word)) return 0; diff --git a/package/kernel/mac80211/patches/600-12-rt2x00-rt2800lib-force-rf-type-to-RF3853-on-RT3883.patch b/package/kernel/mac80211/patches/600-12-rt2x00-rt2800lib-force-rf-type-to-RF3853-on-RT3883.patch index 2e917c8ebf..c03527b4f7 100644 --- a/package/kernel/mac80211/patches/600-12-rt2x00-rt2800lib-force-rf-type-to-RF3853-on-RT3883.patch +++ b/package/kernel/mac80211/patches/600-12-rt2x00-rt2800lib-force-rf-type-to-RF3853-on-RT3883.patch @@ -10,8 +10,8 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -9083,6 +9083,8 @@ static int rt2800_init_eeprom(struct rt2 - rf = rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID); +@@ -9059,6 +9059,8 @@ static int rt2800_init_eeprom(struct rt2 + rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf); else if (rt2x00_rt(rt2x00dev, RT3352)) rf = RF3322; + else if (rt2x00_rt(rt2x00dev, RT3883)) diff --git a/package/kernel/mac80211/patches/600-13-rt2x00-rt2800lib-add-channel-configuration-code-for-.patch b/package/kernel/mac80211/patches/600-13-rt2x00-rt2800lib-add-channel-configuration-code-for-.patch index 0bb2d33577..04574db7c1 100644 --- a/package/kernel/mac80211/patches/600-13-rt2x00-rt2800lib-add-channel-configuration-code-for-.patch +++ b/package/kernel/mac80211/patches/600-13-rt2x00-rt2800lib-add-channel-configuration-code-for-.patch @@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -3738,6 +3738,36 @@ static char rt2800_txpower_to_dev(struct +@@ -3733,6 +3733,36 @@ static char rt2800_txpower_to_dev(struct return clamp_t(char, txpower, MIN_A_TXPOWER, MAX_A_TXPOWER); } @@ -47,7 +47,7 @@ Signed-off-by: Gabor Juhos static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, struct ieee80211_conf *conf, struct rf_channel *rf, -@@ -3756,6 +3786,12 @@ static void rt2800_config_channel(struct +@@ -3751,6 +3781,12 @@ static void rt2800_config_channel(struct rt2800_txpower_to_dev(rt2x00dev, rf->channel, info->default_power3); @@ -60,7 +60,7 @@ Signed-off-by: Gabor Juhos switch (rt2x00dev->chip.rf) { case RF2020: case RF3020: -@@ -3860,6 +3896,15 @@ static void rt2800_config_channel(struct +@@ -3855,6 +3891,15 @@ static void rt2800_config_channel(struct rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain); rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain); rt2800_bbp_write(rt2x00dev, 77, 0x98); @@ -76,7 +76,7 @@ Signed-off-by: Gabor Juhos } else { rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain); rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain); -@@ -3873,6 +3918,7 @@ static void rt2800_config_channel(struct +@@ -3868,6 +3913,7 @@ static void rt2800_config_channel(struct !rt2x00_rt(rt2x00dev, RT6352)) { if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) { rt2800_bbp_write(rt2x00dev, 82, 0x62); @@ -84,7 +84,7 @@ Signed-off-by: Gabor Juhos rt2800_bbp_write(rt2x00dev, 75, 0x46); } else { if (rt2x00_rt(rt2x00dev, RT3593)) -@@ -3881,19 +3927,22 @@ static void rt2800_config_channel(struct +@@ -3876,19 +3922,22 @@ static void rt2800_config_channel(struct rt2800_bbp_write(rt2x00dev, 82, 0x84); rt2800_bbp_write(rt2x00dev, 75, 0x50); } @@ -110,7 +110,7 @@ Signed-off-by: Gabor Juhos rt2800_bbp_write(rt2x00dev, 83, 0x9a); if (rt2x00_has_cap_external_lna_a(rt2x00dev)) -@@ -4019,6 +4068,23 @@ static void rt2800_config_channel(struct +@@ -4011,6 +4060,23 @@ static void rt2800_config_channel(struct rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg); diff --git a/package/kernel/mac80211/patches/600-14-rt2x00-rt2800lib-fix-txpower_to_dev-function-for-RT3.patch b/package/kernel/mac80211/patches/600-14-rt2x00-rt2800lib-fix-txpower_to_dev-function-for-RT3.patch index 56157510eb..3412a3e133 100644 --- a/package/kernel/mac80211/patches/600-14-rt2x00-rt2800lib-fix-txpower_to_dev-function-for-RT3.patch +++ b/package/kernel/mac80211/patches/600-14-rt2x00-rt2800lib-fix-txpower_to_dev-function-for-RT3.patch @@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -3725,13 +3725,15 @@ static char rt2800_txpower_to_dev(struct +@@ -3720,13 +3720,15 @@ static char rt2800_txpower_to_dev(struct unsigned int channel, char txpower) { diff --git a/package/kernel/mac80211/patches/600-15-rt2x00-rt2800lib-use-correct-txpower-calculation-fun.patch b/package/kernel/mac80211/patches/600-15-rt2x00-rt2800lib-use-correct-txpower-calculation-fun.patch index c1409bcfa3..8d1df8cf77 100644 --- a/package/kernel/mac80211/patches/600-15-rt2x00-rt2800lib-use-correct-txpower-calculation-fun.patch +++ b/package/kernel/mac80211/patches/600-15-rt2x00-rt2800lib-use-correct-txpower-calculation-fun.patch @@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -5111,7 +5111,8 @@ static void rt2800_config_txpower(struct +@@ -5085,7 +5085,8 @@ static void rt2800_config_txpower(struct struct ieee80211_channel *chan, int power_level) { diff --git a/package/kernel/mac80211/patches/600-16-rt2x00-rt2800lib-hardcode-txmixer-gain-values-to-zer.patch b/package/kernel/mac80211/patches/600-16-rt2x00-rt2800lib-hardcode-txmixer-gain-values-to-zer.patch index a4ccb28518..9aeb41fe6b 100644 --- a/package/kernel/mac80211/patches/600-16-rt2x00-rt2800lib-hardcode-txmixer-gain-values-to-zer.patch +++ b/package/kernel/mac80211/patches/600-16-rt2x00-rt2800lib-hardcode-txmixer-gain-values-to-zer.patch @@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -8965,7 +8965,8 @@ static u8 rt2800_get_txmixer_gain_24g(st +@@ -8941,7 +8941,8 @@ static u8 rt2800_get_txmixer_gain_24g(st { u16 word; @@ -20,8 +20,8 @@ Signed-off-by: Gabor Juhos + rt2x00_rt(rt2x00dev, RT3883)) return 0; - word = rt2800_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_BG); -@@ -8979,7 +8980,8 @@ static u8 rt2800_get_txmixer_gain_5g(str + rt2800_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_BG, &word); +@@ -8955,7 +8956,8 @@ static u8 rt2800_get_txmixer_gain_5g(str { u16 word; @@ -30,4 +30,4 @@ Signed-off-by: Gabor Juhos + rt2x00_rt(rt2x00dev, RT3883)) return 0; - word = rt2800_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_A); + rt2800_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_A, &word); diff --git a/package/kernel/mac80211/patches/600-17-rt2x00-rt2800lib-use-correct-RT-XWI-size-for-RT3883.patch b/package/kernel/mac80211/patches/600-17-rt2x00-rt2800lib-use-correct-RT-XWI-size-for-RT3883.patch index 197aabd7bc..9d12c76255 100644 --- a/package/kernel/mac80211/patches/600-17-rt2x00-rt2800lib-use-correct-RT-XWI-size-for-RT3883.patch +++ b/package/kernel/mac80211/patches/600-17-rt2x00-rt2800lib-use-correct-RT-XWI-size-for-RT3883.patch @@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -591,6 +591,7 @@ void rt2800_get_txwi_rxwi_size(struct rt +@@ -587,6 +587,7 @@ void rt2800_get_txwi_rxwi_size(struct rt { switch (rt2x00dev->chip.rt) { case RT3593: diff --git a/package/kernel/mac80211/patches/600-18-rt2x00-rt2800lib-fix-antenna-configuration-for-RT388.patch b/package/kernel/mac80211/patches/600-18-rt2x00-rt2800lib-fix-antenna-configuration-for-RT388.patch index 24c0ef91b0..cd212f9d8d 100644 --- a/package/kernel/mac80211/patches/600-18-rt2x00-rt2800lib-fix-antenna-configuration-for-RT388.patch +++ b/package/kernel/mac80211/patches/600-18-rt2x00-rt2800lib-fix-antenna-configuration-for-RT388.patch @@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -2017,7 +2017,8 @@ void rt2800_config_ant(struct rt2x00_dev +@@ -2013,7 +2013,8 @@ void rt2800_config_ant(struct rt2x00_dev rt2800_bbp_write(rt2x00dev, 3, r3); rt2800_bbp_write(rt2x00dev, 1, r1); diff --git a/package/kernel/mac80211/patches/600-19-rt2x00-rt2800lib-fix-LNA-gain-configuration-for-RT38.patch b/package/kernel/mac80211/patches/600-19-rt2x00-rt2800lib-fix-LNA-gain-configuration-for-RT38.patch index 52733ffeb9..30ea12a5cd 100644 --- a/package/kernel/mac80211/patches/600-19-rt2x00-rt2800lib-fix-LNA-gain-configuration-for-RT38.patch +++ b/package/kernel/mac80211/patches/600-19-rt2x00-rt2800lib-fix-LNA-gain-configuration-for-RT38.patch @@ -10,23 +10,23 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -2040,7 +2040,8 @@ static void rt2800_config_lna_gain(struc - eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_LNA); +@@ -2036,7 +2036,8 @@ static void rt2800_config_lna_gain(struc + rt2800_eeprom_read(rt2x00dev, EEPROM_LNA, &eeprom); lna_gain = rt2x00_get_field16(eeprom, EEPROM_LNA_A0); } else if (libconf->rf.channel <= 128) { - if (rt2x00_rt(rt2x00dev, RT3593)) { + if (rt2x00_rt(rt2x00dev, RT3593) || + rt2x00_rt(rt2x00dev, RT3883)) { - eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2); + rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2, &eeprom); lna_gain = rt2x00_get_field16(eeprom, EEPROM_EXT_LNA2_A1); -@@ -2050,7 +2051,8 @@ static void rt2800_config_lna_gain(struc +@@ -2046,7 +2047,8 @@ static void rt2800_config_lna_gain(struc EEPROM_RSSI_BG2_LNA_A1); } } else { - if (rt2x00_rt(rt2x00dev, RT3593)) { + if (rt2x00_rt(rt2x00dev, RT3593) || + rt2x00_rt(rt2x00dev, RT3883)) { - eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2); + rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2, &eeprom); lna_gain = rt2x00_get_field16(eeprom, EEPROM_EXT_LNA2_A2); diff --git a/package/kernel/mac80211/patches/600-20-rt2x00-rt2800lib-fix-VGC-setup-for-RT3883.patch b/package/kernel/mac80211/patches/600-20-rt2x00-rt2800lib-fix-VGC-setup-for-RT3883.patch index 301928d283..70c33a1d20 100644 --- a/package/kernel/mac80211/patches/600-20-rt2x00-rt2800lib-fix-VGC-setup-for-RT3883.patch +++ b/package/kernel/mac80211/patches/600-20-rt2x00-rt2800lib-fix-VGC-setup-for-RT3883.patch @@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -5364,7 +5364,8 @@ static u8 rt2800_get_default_vgc(struct +@@ -5338,7 +5338,8 @@ static u8 rt2800_get_default_vgc(struct else vgc = 0x2e + rt2x00dev->lna_gain; } else { /* 5GHZ band */ @@ -20,7 +20,7 @@ Signed-off-by: Gabor Juhos vgc = 0x20 + (rt2x00dev->lna_gain * 5) / 3; else if (rt2x00_rt(rt2x00dev, RT5592)) vgc = 0x24 + (2 * rt2x00dev->lna_gain); -@@ -5384,7 +5385,8 @@ static inline void rt2800_set_vgc(struct +@@ -5358,7 +5359,8 @@ static inline void rt2800_set_vgc(struct { if (qual->vgc_level != vgc_level) { if (rt2x00_rt(rt2x00dev, RT3572) || @@ -30,7 +30,7 @@ Signed-off-by: Gabor Juhos rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, vgc_level); } else if (rt2x00_rt(rt2x00dev, RT5592)) { -@@ -5431,6 +5433,11 @@ void rt2800_link_tuner(struct rt2x00_dev +@@ -5405,6 +5407,11 @@ void rt2800_link_tuner(struct rt2x00_dev } break; diff --git a/package/kernel/mac80211/patches/600-21-rt2x00-rt2800lib-fix-EEPROM-LNA-validation-for-RT388.patch b/package/kernel/mac80211/patches/600-21-rt2x00-rt2800lib-fix-EEPROM-LNA-validation-for-RT388.patch index 4bbc7ae44e..a2cfd896eb 100644 --- a/package/kernel/mac80211/patches/600-21-rt2x00-rt2800lib-fix-EEPROM-LNA-validation-for-RT388.patch +++ b/package/kernel/mac80211/patches/600-21-rt2x00-rt2800lib-fix-EEPROM-LNA-validation-for-RT388.patch @@ -10,8 +10,8 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -9098,7 +9098,8 @@ static int rt2800_validate_eeprom(struct - word = rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2); +@@ -9074,7 +9074,8 @@ static int rt2800_validate_eeprom(struct + rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2, &word); if (abs(rt2x00_get_field16(word, EEPROM_RSSI_BG2_OFFSET2)) > 10) rt2x00_set_field16(&word, EEPROM_RSSI_BG2_OFFSET2, 0); - if (!rt2x00_rt(rt2x00dev, RT3593)) { @@ -20,8 +20,8 @@ Signed-off-by: Gabor Juhos if (rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0x00 || rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0xff) rt2x00_set_field16(&word, EEPROM_RSSI_BG2_LNA_A1, -@@ -9118,7 +9119,8 @@ static int rt2800_validate_eeprom(struct - word = rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A2); +@@ -9094,7 +9095,8 @@ static int rt2800_validate_eeprom(struct + rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A2, &word); if (abs(rt2x00_get_field16(word, EEPROM_RSSI_A2_OFFSET2)) > 10) rt2x00_set_field16(&word, EEPROM_RSSI_A2_OFFSET2, 0); - if (!rt2x00_rt(rt2x00dev, RT3593)) { @@ -30,13 +30,13 @@ Signed-off-by: Gabor Juhos if (rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0x00 || rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0xff) rt2x00_set_field16(&word, EEPROM_RSSI_A2_LNA_A2, -@@ -9126,7 +9128,8 @@ static int rt2800_validate_eeprom(struct +@@ -9102,7 +9104,8 @@ static int rt2800_validate_eeprom(struct } rt2800_eeprom_write(rt2x00dev, EEPROM_RSSI_A2, word); - if (rt2x00_rt(rt2x00dev, RT3593)) { + if (rt2x00_rt(rt2x00dev, RT3593) || + rt2x00_rt(rt2x00dev, RT3883)) { - word = rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2); + rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2, &word); if (rt2x00_get_field16(word, EEPROM_EXT_LNA2_A1) == 0x00 || rt2x00_get_field16(word, EEPROM_EXT_LNA2_A1) == 0xff) diff --git a/package/kernel/mac80211/patches/600-22-rt2x00-rt2800lib-fix-txpower-compensation-for-RT3883.patch b/package/kernel/mac80211/patches/600-22-rt2x00-rt2800lib-fix-txpower-compensation-for-RT3883.patch index e752efd0ea..ac8b219efd 100644 --- a/package/kernel/mac80211/patches/600-22-rt2x00-rt2800lib-fix-txpower-compensation-for-RT3883.patch +++ b/package/kernel/mac80211/patches/600-22-rt2x00-rt2800lib-fix-txpower-compensation-for-RT3883.patch @@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -4354,6 +4354,9 @@ static u8 rt2800_compensate_txpower(stru +@@ -4332,6 +4332,9 @@ static u8 rt2800_compensate_txpower(stru if (rt2x00_rt(rt2x00dev, RT3593)) return min_t(u8, txpower, 0xc); diff --git a/package/kernel/mac80211/patches/600-23-rt2x00-rt2800mmio-add-a-workaround-for-spurious-TX_F.patch b/package/kernel/mac80211/patches/600-23-rt2x00-rt2800mmio-add-a-workaround-for-spurious-TX_F.patch index 342174f8d5..7d8d2f5e13 100644 --- a/package/kernel/mac80211/patches/600-23-rt2x00-rt2800mmio-add-a-workaround-for-spurious-TX_F.patch +++ b/package/kernel/mac80211/patches/600-23-rt2x00-rt2800mmio-add-a-workaround-for-spurious-TX_F.patch @@ -12,7 +12,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c -@@ -424,9 +424,9 @@ void rt2800mmio_autowake_tasklet(unsigne +@@ -415,9 +415,9 @@ void rt2800mmio_autowake_tasklet(unsigne } EXPORT_SYMBOL_GPL(rt2800mmio_autowake_tasklet); @@ -24,12 +24,12 @@ Signed-off-by: Gabor Juhos int i; /* -@@ -447,29 +447,77 @@ static void rt2800mmio_txstatus_interrup +@@ -438,29 +438,77 @@ static void rt2800mmio_txstatus_interrup * Since we have only one producer and one consumer we don't * need to lock the kfifo. */ - for (i = 0; i < rt2x00dev->tx->limit; i++) { -- status = rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO); +- rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO, &status); - - if (!rt2x00_get_field32(status, TX_STA_FIFO_VALID)) - break; @@ -47,7 +47,7 @@ Signed-off-by: Gabor Juhos + if (++i >= rt2x00dev->tx->limit) + break; + -+ status = rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO); ++ rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO, &status); + } while (rt2x00_get_field32(status, TX_STA_FIFO_VALID)); /* Schedule the tasklet for processing the tx status. */ @@ -87,7 +87,7 @@ Signed-off-by: Gabor Juhos - /* Read status and ACK all interrupts */ + /* Read status */ - reg = rt2x00mmio_register_read(rt2x00dev, INT_SOURCE_CSR); + rt2x00mmio_register_read(rt2x00dev, INT_SOURCE_CSR, ®); + + if (rt2x00_get_field32(reg, INT_SOURCE_CSR_TX_FIFO_STATUS)) { + /* Due to unknown reason the hardware generates a @@ -96,7 +96,7 @@ Signed-off-by: Gabor Juhos + * here to see if we have to process the actual + * request. + */ -+ txstatus = rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO); ++ rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO, &txstatus); + if (rt2800mmio_txstatus_is_spurious(rt2x00dev, txstatus)) { + /* Remove the TX_FIFO_STATUS bit so it won't be + * processed in this turn. The hardware will @@ -111,7 +111,7 @@ Signed-off-by: Gabor Juhos rt2x00mmio_register_write(rt2x00dev, INT_SOURCE_CSR, reg); if (!reg) -@@ -486,7 +534,7 @@ irqreturn_t rt2800mmio_interrupt(int irq +@@ -477,7 +525,7 @@ irqreturn_t rt2800mmio_interrupt(int irq mask = ~reg; if (rt2x00_get_field32(reg, INT_SOURCE_CSR_TX_FIFO_STATUS)) { diff --git a/package/kernel/mac80211/patches/602-rt2x00-introduce-rt2x00eeprom.patch b/package/kernel/mac80211/patches/602-rt2x00-introduce-rt2x00eeprom.patch index 5ad99995c2..435cc96fc5 100644 --- a/package/kernel/mac80211/patches/602-rt2x00-introduce-rt2x00eeprom.patch +++ b/package/kernel/mac80211/patches/602-rt2x00-introduce-rt2x00eeprom.patch @@ -1,6 +1,6 @@ ---- a/local-symbols -+++ b/local-symbols -@@ -291,6 +291,7 @@ RT2X00_LIB_FIRMWARE= +--- a/.local-symbols ++++ b/.local-symbols +@@ -336,6 +336,7 @@ RT2X00_LIB_FIRMWARE= RT2X00_LIB_CRYPTO= RT2X00_LIB_LEDS= RT2X00_LIB_DEBUGFS= @@ -55,9 +55,9 @@ +#include "rt2800.h" + struct rt2800_ops { - u32 (*register_read)(struct rt2x00_dev *rt2x00dev, - const unsigned int offset); -@@ -145,6 +147,15 @@ static inline int rt2800_read_eeprom(str + void (*register_read)(struct rt2x00_dev *rt2x00dev, + const unsigned int offset, u32 *value); +@@ -147,6 +149,15 @@ static inline int rt2800_read_eeprom(str { const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv; @@ -127,7 +127,7 @@ DECLARE_KFIFO_PTR(txstatus_fifo, u32); --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -@@ -1421,6 +1421,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de +@@ -1418,6 +1418,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de INIT_DELAYED_WORK(&rt2x00dev->autowakeup_work, rt2x00lib_autowakeup); INIT_WORK(&rt2x00dev->sleep_work, rt2x00lib_sleep); @@ -138,7 +138,7 @@ /* * Let the driver probe the device to detect the capabilities. */ -@@ -1562,6 +1566,11 @@ void rt2x00lib_remove_dev(struct rt2x00_ +@@ -1556,6 +1560,11 @@ void rt2x00lib_remove_dev(struct rt2x00_ * Free the driver data. */ kfree(rt2x00dev->drv_data); diff --git a/package/kernel/mac80211/patches/606-rt2x00-allow_disabling_bands_through_platform_data.patch b/package/kernel/mac80211/patches/606-rt2x00-allow_disabling_bands_through_platform_data.patch index 202dfc0b89..c3cd2f4341 100644 --- a/package/kernel/mac80211/patches/606-rt2x00-allow_disabling_bands_through_platform_data.patch +++ b/package/kernel/mac80211/patches/606-rt2x00-allow_disabling_bands_through_platform_data.patch @@ -12,7 +12,7 @@ #endif /* _RT2X00_PLATFORM_H */ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -@@ -1026,6 +1026,22 @@ static int rt2x00lib_probe_hw_modes(stru +@@ -1023,6 +1023,22 @@ static int rt2x00lib_probe_hw_modes(stru unsigned int num_rates; unsigned int i; diff --git a/package/kernel/mac80211/patches/607-rt2x00-add_platform_data_mac_addr.patch b/package/kernel/mac80211/patches/607-rt2x00-add_platform_data_mac_addr.patch index b8b0188040..bca7be8533 100644 --- a/package/kernel/mac80211/patches/607-rt2x00-add_platform_data_mac_addr.patch +++ b/package/kernel/mac80211/patches/607-rt2x00-add_platform_data_mac_addr.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -@@ -1004,8 +1004,13 @@ static void rt2x00lib_rate(struct ieee80 +@@ -1001,8 +1001,13 @@ static void rt2x00lib_rate(struct ieee80 void rt2x00lib_set_mac_address(struct rt2x00_dev *rt2x00dev, u8 *eeprom_mac_addr) { diff --git a/package/kernel/mac80211/patches/608-rt2x00-allow_disabling_bands_through_dts.patch b/package/kernel/mac80211/patches/608-rt2x00-allow_disabling_bands_through_dts.patch index ca66aa8e3b..724e626ca9 100644 --- a/package/kernel/mac80211/patches/608-rt2x00-allow_disabling_bands_through_dts.patch +++ b/package/kernel/mac80211/patches/608-rt2x00-allow_disabling_bands_through_dts.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -@@ -1030,6 +1030,16 @@ static int rt2x00lib_probe_hw_modes(stru +@@ -1027,6 +1027,16 @@ static int rt2x00lib_probe_hw_modes(stru struct ieee80211_rate *rates; unsigned int num_rates; unsigned int i; diff --git a/package/kernel/mac80211/patches/610-rt2x00-change-led-polarity-from-OF.patch b/package/kernel/mac80211/patches/610-rt2x00-change-led-polarity-from-OF.patch index ad70aa7826..0236683d5f 100644 --- a/package/kernel/mac80211/patches/610-rt2x00-change-led-polarity-from-OF.patch +++ b/package/kernel/mac80211/patches/610-rt2x00-change-led-polarity-from-OF.patch @@ -8,7 +8,7 @@ #include "rt2x00.h" #include "rt2800lib.h" -@@ -9285,6 +9286,17 @@ static int rt2800_init_eeprom(struct rt2 +@@ -9261,6 +9262,17 @@ static int rt2800_init_eeprom(struct rt2 rt2800_init_led(rt2x00dev, &rt2x00dev->led_assoc, LED_TYPE_ASSOC); rt2800_init_led(rt2x00dev, &rt2x00dev->led_qual, LED_TYPE_QUALITY); diff --git a/package/kernel/mac80211/patches/611-rt2x00-add-AP+STA-support.patch b/package/kernel/mac80211/patches/611-rt2x00-add-AP+STA-support.patch index 062b18a63b..5ef5fc8def 100644 --- a/package/kernel/mac80211/patches/611-rt2x00-add-AP+STA-support.patch +++ b/package/kernel/mac80211/patches/611-rt2x00-add-AP+STA-support.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -@@ -1361,7 +1361,7 @@ static inline void rt2x00lib_set_if_comb +@@ -1358,7 +1358,7 @@ static inline void rt2x00lib_set_if_comb */ if_limit = &rt2x00dev->if_limits_ap; if_limit->max = rt2x00dev->ops->max_ap_intf; diff --git a/package/kernel/mac80211/patches/650-rt2x00-add-support-for-external-PA-on-MT7620.patch b/package/kernel/mac80211/patches/650-rt2x00-add-support-for-external-PA-on-MT7620.patch deleted file mode 100644 index 9fad80b672..0000000000 --- a/package/kernel/mac80211/patches/650-rt2x00-add-support-for-external-PA-on-MT7620.patch +++ /dev/null @@ -1,118 +0,0 @@ -From 9782a7f7488443568fa4d6088b73c9aff7eb8510 Mon Sep 17 00:00:00 2001 -From: Daniel Golle -Date: Wed, 19 Apr 2017 16:14:53 +0200 -Subject: [PATCH] rt2x00: add support for external PA on MT7620 -To: Stanislaw Gruszka -Cc: Helmut Schaa , - linux-wireless@vger.kernel.org, - Kalle Valo - -Signed-off-by: Daniel Golle ---- - drivers/net/wireless/ralink/rt2x00/rt2800.h | 1 + - drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 70 +++++++++++++++++++++++++- - 2 files changed, 70 insertions(+), 1 deletion(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h -@@ -2749,6 +2749,7 @@ enum rt2800_eeprom_word { - #define EEPROM_NIC_CONF2_RX_STREAM FIELD16(0x000f) - #define EEPROM_NIC_CONF2_TX_STREAM FIELD16(0x00f0) - #define EEPROM_NIC_CONF2_CRYSTAL FIELD16(0x0600) -+#define EEPROM_NIC_CONF2_EXTERNAL_PA FIELD16(0xc000) - - /* - * EEPROM LNA ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -4120,6 +4120,61 @@ static void rt2800_config_channel(struct - rt2800_iq_calibrate(rt2x00dev, rf->channel); - } - -+ if (rt2x00_rt(rt2x00dev, RT6352)) { -+ if (test_bit(CAPABILITY_EXTERNAL_PA_TX0, -+ &rt2x00dev->cap_flags)) { -+ rt2x00_warn(rt2x00dev, "Using incomplete support for " \ -+ "external PA\n"); -+ reg = rt2800_register_read(rt2x00dev, RF_CONTROL3); -+ reg |= 0x00000101; -+ rt2800_register_write(rt2x00dev, RF_CONTROL3, reg); -+ -+ reg = rt2800_register_read(rt2x00dev, RF_BYPASS3); -+ reg |= 0x00000101; -+ rt2800_register_write(rt2x00dev, RF_BYPASS3, reg); -+ -+ rt2800_rfcsr_write_bank(rt2x00dev, 4, 43, 0x73); -+ rt2800_rfcsr_write_bank(rt2x00dev, 6, 43, 0x73); -+ rt2800_rfcsr_write_bank(rt2x00dev, 4, 44, 0x73); -+ rt2800_rfcsr_write_bank(rt2x00dev, 6, 44, 0x73); -+ rt2800_rfcsr_write_bank(rt2x00dev, 4, 45, 0x73); -+ rt2800_rfcsr_write_bank(rt2x00dev, 6, 45, 0x73); -+ rt2800_rfcsr_write_bank(rt2x00dev, 4, 46, 0x27); -+ rt2800_rfcsr_write_bank(rt2x00dev, 6, 46, 0x27); -+ rt2800_rfcsr_write_bank(rt2x00dev, 4, 47, 0xC8); -+ rt2800_rfcsr_write_bank(rt2x00dev, 6, 47, 0xC8); -+ rt2800_rfcsr_write_bank(rt2x00dev, 4, 48, 0xA4); -+ rt2800_rfcsr_write_bank(rt2x00dev, 6, 48, 0xA4); -+ rt2800_rfcsr_write_bank(rt2x00dev, 4, 49, 0x05); -+ rt2800_rfcsr_write_bank(rt2x00dev, 6, 49, 0x05); -+ rt2800_rfcsr_write_bank(rt2x00dev, 4, 54, 0x27); -+ rt2800_rfcsr_write_bank(rt2x00dev, 6, 54, 0x27); -+ rt2800_rfcsr_write_bank(rt2x00dev, 4, 55, 0xC8); -+ rt2800_rfcsr_write_bank(rt2x00dev, 6, 55, 0xC8); -+ rt2800_rfcsr_write_bank(rt2x00dev, 4, 56, 0xA4); -+ rt2800_rfcsr_write_bank(rt2x00dev, 6, 56, 0xA4); -+ rt2800_rfcsr_write_bank(rt2x00dev, 4, 57, 0x05); -+ rt2800_rfcsr_write_bank(rt2x00dev, 6, 57, 0x05); -+ rt2800_rfcsr_write_bank(rt2x00dev, 4, 58, 0x27); -+ rt2800_rfcsr_write_bank(rt2x00dev, 6, 58, 0x27); -+ rt2800_rfcsr_write_bank(rt2x00dev, 4, 59, 0xC8); -+ rt2800_rfcsr_write_bank(rt2x00dev, 6, 59, 0xC8); -+ rt2800_rfcsr_write_bank(rt2x00dev, 4, 60, 0xA4); -+ rt2800_rfcsr_write_bank(rt2x00dev, 6, 60, 0xA4); -+ rt2800_rfcsr_write_bank(rt2x00dev, 4, 61, 0x05); -+ rt2800_rfcsr_write_bank(rt2x00dev, 6, 61, 0x05); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 05, 0x00); -+ rt2800_rfcsr_write_bank(rt2x00dev, 7, 05, 0x00); -+ -+ rt2800_register_write(rt2x00dev, TX0_RF_GAIN_CORRECT, -+ 0x36303636); -+ rt2800_register_write(rt2x00dev, TX0_RF_GAIN_ATTEN, -+ 0x6C6C6B6C); -+ rt2800_register_write(rt2x00dev, TX1_RF_GAIN_ATTEN, -+ 0x6C6C6B6C); -+ } -+ } -+ - bbp = rt2800_bbp_read(rt2x00dev, 4); - rt2x00_set_field8(&bbp, BBP4_BANDWIDTH, 2 * conf_is_ht40(conf)); - rt2800_bbp_write(rt2x00dev, 4, bbp); -@@ -9314,7 +9369,8 @@ static int rt2800_init_eeprom(struct rt2 - */ - eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1); - -- if (rt2x00_rt(rt2x00dev, RT3352)) { -+ if (rt2x00_rt(rt2x00dev, RT3352) || -+ rt2x00_rt(rt2x00dev, RT6352)) { - if (rt2x00_get_field16(eeprom, - EEPROM_NIC_CONF1_EXTERNAL_TX0_PA_3352)) - __set_bit(CAPABILITY_EXTERNAL_PA_TX0, -@@ -9325,6 +9381,18 @@ static int rt2800_init_eeprom(struct rt2 - &rt2x00dev->cap_flags); - } - -+ eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF2); -+ -+ if (rt2x00_rt(rt2x00dev, RT6352) && eeprom != 0 && eeprom != 0xffff) { -+ if (rt2x00_get_field16(eeprom, -+ EEPROM_NIC_CONF2_EXTERNAL_PA)) { -+ __set_bit(CAPABILITY_EXTERNAL_PA_TX0, -+ &rt2x00dev->cap_flags); -+ __set_bit(CAPABILITY_EXTERNAL_PA_TX1, -+ &rt2x00dev->cap_flags); -+ } -+ } -+ - return 0; - } - diff --git a/package/kernel/mac80211/patches/651-rt2x00-remove-unneccesary-code.patch b/package/kernel/mac80211/patches/651-rt2x00-remove-unneccesary-code.patch deleted file mode 100644 index 475fcbc223..0000000000 --- a/package/kernel/mac80211/patches/651-rt2x00-remove-unneccesary-code.patch +++ /dev/null @@ -1,132 +0,0 @@ -From pozega.tomislav@gmail.com Thu May 18 12:42:27 2017 -Return-path: -Envelope-to: daniel@makrotopia.org -Delivery-date: Thu, 18 May 2017 12:42:27 +0200 -Received: from mail by fudo.makrotopia.org with sa-checked (Exim 4.88) - (envelope-from ) - id 1dBIsy-00088b-PU - for daniel@makrotopia.org; Thu, 18 May 2017 12:42:27 +0200 -X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on fudo.makrotopia.org -X-Spam-Level: -X-Spam-Status: No, score=-0.8 required=2.5 tests=DKIM_SIGNED,DKIM_VALID, - DKIM_VALID_AU,FREEMAIL_FROM,HTML_MESSAGE,RCVD_IN_DNSWL_LOW shortcircuit=no - autolearn=ham autolearn_force=no version=3.4.1 -Received: from mail-oi0-x22a.google.com ([2607:f8b0:4003:c06::22a]) - by fudo.makrotopia.org with esmtps (TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128) - (Exim 4.88) - (envelope-from ) - id 1dBIsv-00088Q-Dq - for daniel@makrotopia.org; Thu, 18 May 2017 12:42:24 +0200 -Received: by mail-oi0-x22a.google.com with SMTP id w10so48782189oif.0 - for ; Thu, 18 May 2017 03:42:21 -0700 (PDT) -DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=gmail.com; s=20161025; - h=mime-version:from:date:message-id:subject:to; - bh=9dF7PHDassYY74+N6dAhmsL/B9i5oG3SEuMzHuazhJo=; - b=cBGJ44v+o4ASyCPmHCBRMmRYnJCv4Gx6lzDiScKn0XqYmNHYpZTPg5cAY1GZFUhHdz - 9QT5fzhJKFikBliSuJc/7/pI8KzvyEAdvawiWA7/5fbeiTZ+zjJnzRVGezqkYDKxjR6u - 7TsoJxR2/oFwo7bOFlThhee+Nwf7qaX8AVal7JdkqovekX79JQ5vsKAa4LapDp7Cl0wr - KCh0WRUHGEgpTLJFyQ3ThPmLqc8bhmu+6/V/LJ53VOY7uksZHMhvaKkk9vDCoOuPnBMK - Cj2/c7z9RTErz/xlHg6HxnBe/pPc31XUsuPJUleOEdZASczPsreEEKacKCONVlP1wjAB - iOkA== -X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=1e100.net; s=20161025; - h=x-gm-message-state:mime-version:from:date:message-id:subject:to; - bh=9dF7PHDassYY74+N6dAhmsL/B9i5oG3SEuMzHuazhJo=; - b=LJAe4ZwS9aNJypROW7j+I9aNfRBWyDYy0c8ABnDbLrIoF9P2AA/Vs/Cli5f7GjaAxr - 1JCx602ach+7R7QjQq/nqNmLuhRCfSvB0TGrq4R4v+CJ4ADO541+PddnFiU1dlIXQRP2 - TE2FOydSO0FGJBMg+kY0eFiidBtYj1T5x7IHAhQzufiuiF6/1xZS8h61CYJjLzt/aR5y - JxOxsVvu3W2YQ0T5wKmAPlKtarFH6ZZgs446bRYt1MX5KAWzIoBM1+IPMMv7lSCpCaDR - fwH05aDyaJW2IzXH5R9Tq7gGYycYjx/SnO7JupJXJVvOzKgBJxp60JwJhCfqCwESDuuD - 8nNA== -X-Gm-Message-State: AODbwcDOpdFZgbxAxFsVsqFdCBN3pRGDvEclZ1heVg2byNZ9BuG5kqJg - GvZ9x4NGt0v8lVGa3esDw0N1KiJENg== -X-Received: by 10.157.17.217 with SMTP id y25mr1310632oty.137.1495104134863; - Thu, 18 May 2017 03:42:14 -0700 (PDT) -MIME-Version: 1.0 -Received: by 10.157.0.105 with HTTP; Thu, 18 May 2017 03:42:14 -0700 (PDT) -From: Tom Psyborg -Date: Thu, 18 May 2017 12:42:14 +0200 -Message-ID: -Subject: [PATCH] rt2x00: remove unneccesary code -To: linux-wireless , - Linux Kernel Mailing List , Arnd Bergmann , - Jes Sorensen , Stanislaw Gruszka , - David Miller , Helmut Schaa , - Kalle Valo , Daniel Golle , - Mathias Kresin , Johannes Berg , - Serge Vasilugin , Roman Yeryomin , - Networking -Content-Type: multipart/alternative; boundary="94eb2c1905d2dc6361054fca0e62" -Status: RO -Content-Length: 11079 -Lines: 178 - ---94eb2c1905d2dc6361054fca0e62 -Content-Type: text/plain; charset="UTF-8" -Content-Transfer-Encoding: quoted-printable - -Use chanreg and dccal helpers to reduce the size of ePA code. - -Signed-off-by: Tomislav Po=C5=BEega -Signed-off-by: Daniel Golle -[daniel@makrotopia.org: fixed white-space so patch applies] ---- - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -4133,38 +4133,22 @@ static void rt2800_config_channel(struct - reg |= 0x00000101; - rt2800_register_write(rt2x00dev, RF_BYPASS3, reg); - -- rt2800_rfcsr_write_bank(rt2x00dev, 4, 43, 0x73); -- rt2800_rfcsr_write_bank(rt2x00dev, 6, 43, 0x73); -- rt2800_rfcsr_write_bank(rt2x00dev, 4, 44, 0x73); -- rt2800_rfcsr_write_bank(rt2x00dev, 6, 44, 0x73); -- rt2800_rfcsr_write_bank(rt2x00dev, 4, 45, 0x73); -- rt2800_rfcsr_write_bank(rt2x00dev, 6, 45, 0x73); -- rt2800_rfcsr_write_bank(rt2x00dev, 4, 46, 0x27); -- rt2800_rfcsr_write_bank(rt2x00dev, 6, 46, 0x27); -- rt2800_rfcsr_write_bank(rt2x00dev, 4, 47, 0xC8); -- rt2800_rfcsr_write_bank(rt2x00dev, 6, 47, 0xC8); -- rt2800_rfcsr_write_bank(rt2x00dev, 4, 48, 0xA4); -- rt2800_rfcsr_write_bank(rt2x00dev, 6, 48, 0xA4); -- rt2800_rfcsr_write_bank(rt2x00dev, 4, 49, 0x05); -- rt2800_rfcsr_write_bank(rt2x00dev, 6, 49, 0x05); -- rt2800_rfcsr_write_bank(rt2x00dev, 4, 54, 0x27); -- rt2800_rfcsr_write_bank(rt2x00dev, 6, 54, 0x27); -- rt2800_rfcsr_write_bank(rt2x00dev, 4, 55, 0xC8); -- rt2800_rfcsr_write_bank(rt2x00dev, 6, 55, 0xC8); -- rt2800_rfcsr_write_bank(rt2x00dev, 4, 56, 0xA4); -- rt2800_rfcsr_write_bank(rt2x00dev, 6, 56, 0xA4); -- rt2800_rfcsr_write_bank(rt2x00dev, 4, 57, 0x05); -- rt2800_rfcsr_write_bank(rt2x00dev, 6, 57, 0x05); -- rt2800_rfcsr_write_bank(rt2x00dev, 4, 58, 0x27); -- rt2800_rfcsr_write_bank(rt2x00dev, 6, 58, 0x27); -- rt2800_rfcsr_write_bank(rt2x00dev, 4, 59, 0xC8); -- rt2800_rfcsr_write_bank(rt2x00dev, 6, 59, 0xC8); -- rt2800_rfcsr_write_bank(rt2x00dev, 4, 60, 0xA4); -- rt2800_rfcsr_write_bank(rt2x00dev, 6, 60, 0xA4); -- rt2800_rfcsr_write_bank(rt2x00dev, 4, 61, 0x05); -- rt2800_rfcsr_write_bank(rt2x00dev, 6, 61, 0x05); -- rt2800_rfcsr_write_bank(rt2x00dev, 5, 05, 0x00); -- rt2800_rfcsr_write_bank(rt2x00dev, 7, 05, 0x00); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0x73); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0x73); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0x73); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 46, 0x27); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0xC8); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xA4); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 49, 0x05); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x27); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0xC8); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xA4); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 57, 0x05); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x27); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0xC8); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xA4); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 61, 0x05); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 05, 0x00); - - rt2800_register_write(rt2x00dev, TX0_RF_GAIN_CORRECT, - 0x36303636); diff --git a/package/kernel/mac80211/patches/653-0002-rtl8xxxu-Add-initial-code-to-detect-8188eu-devices.patch b/package/kernel/mac80211/patches/653-0002-rtl8xxxu-Add-initial-code-to-detect-8188eu-devices.patch index 71f93e9556..f90ce492f0 100644 --- a/package/kernel/mac80211/patches/653-0002-rtl8xxxu-Add-initial-code-to-detect-8188eu-devices.patch +++ b/package/kernel/mac80211/patches/653-0002-rtl8xxxu-Add-initial-code-to-detect-8188eu-devices.patch @@ -110,7 +110,7 @@ Signed-off-by: Jes Sorensen MODULE_FIRMWARE("rtlwifi/rtl8192cufw_A.bin"); MODULE_FIRMWARE("rtlwifi/rtl8192cufw_B.bin"); MODULE_FIRMWARE("rtlwifi/rtl8192cufw_TMSC.bin"); -@@ -6212,6 +6213,8 @@ static const struct usb_device_id dev_ta +@@ -6210,6 +6211,8 @@ static struct usb_device_id dev_table[] {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0xb720, 0xff, 0xff, 0xff), .driver_info = (unsigned long)&rtl8723bu_fops}, #ifdef CPTCFG_RTL8XXXU_UNTESTED diff --git a/package/kernel/mac80211/patches/653-0043-rtl8xxxu-Do-not-set-auto-rate-fallback-on-8188eu.patch b/package/kernel/mac80211/patches/653-0043-rtl8xxxu-Do-not-set-auto-rate-fallback-on-8188eu.patch index 1047625de7..c69de5b0a7 100644 --- a/package/kernel/mac80211/patches/653-0043-rtl8xxxu-Do-not-set-auto-rate-fallback-on-8188eu.patch +++ b/package/kernel/mac80211/patches/653-0043-rtl8xxxu-Do-not-set-auto-rate-fallback-on-8188eu.patch @@ -39,7 +39,7 @@ Signed-off-by: Jes Sorensen .adda_2t_path_on_a = 0x04db25a4, --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192e.c +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192e.c -@@ -1658,6 +1658,7 @@ struct rtl8xxxu_fileops rtl8192eu_fops = +@@ -1655,6 +1655,7 @@ struct rtl8xxxu_fileops rtl8192eu_fops = .rx_desc_size = sizeof(struct rtl8xxxu_rxdesc24), .has_s0s1 = 0, .gen2_thermal_meter = 1, diff --git a/package/kernel/mac80211/patches/653-0045-rtl8xxxu-Add-rtl8188etv-to-USB-device-list.patch b/package/kernel/mac80211/patches/653-0045-rtl8xxxu-Add-rtl8188etv-to-USB-device-list.patch index be5f72ff4d..31c4b6535b 100644 --- a/package/kernel/mac80211/patches/653-0045-rtl8xxxu-Add-rtl8188etv-to-USB-device-list.patch +++ b/package/kernel/mac80211/patches/653-0045-rtl8xxxu-Add-rtl8188etv-to-USB-device-list.patch @@ -13,7 +13,7 @@ Signed-off-by: Jes Sorensen --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c -@@ -6326,6 +6326,9 @@ static const struct usb_device_id dev_ta +@@ -6324,6 +6324,9 @@ static struct usb_device_id dev_table[] #ifdef CPTCFG_RTL8XXXU_UNTESTED {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0x8179, 0xff, 0xff, 0xff), .driver_info = (unsigned long)&rtl8188eu_fops}, diff --git a/package/kernel/mac80211/patches/653-0046-rtl8xxxu-Add-sitecom-dongle-to-USB-device-list.patch b/package/kernel/mac80211/patches/653-0046-rtl8xxxu-Add-sitecom-dongle-to-USB-device-list.patch index b4898018f8..fa8ad28d97 100644 --- a/package/kernel/mac80211/patches/653-0046-rtl8xxxu-Add-sitecom-dongle-to-USB-device-list.patch +++ b/package/kernel/mac80211/patches/653-0046-rtl8xxxu-Add-sitecom-dongle-to-USB-device-list.patch @@ -11,7 +11,7 @@ Signed-off-by: Jes Sorensen --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c -@@ -6329,6 +6329,9 @@ static const struct usb_device_id dev_ta +@@ -6327,6 +6327,9 @@ static struct usb_device_id dev_table[] /* Tested by Hans de Goede - rtl8188etv */ {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0x0179, 0xff, 0xff, 0xff), .driver_info = (unsigned long)&rtl8188eu_fops}, diff --git a/package/kernel/mac80211/patches/653-0049-rtl8xxxu-Add-rtl8188eu-USB-ID-for-D-Link-USB-GO-N150.patch b/package/kernel/mac80211/patches/653-0049-rtl8xxxu-Add-rtl8188eu-USB-ID-for-D-Link-USB-GO-N150.patch index 669fca6706..05c45ca24d 100644 --- a/package/kernel/mac80211/patches/653-0049-rtl8xxxu-Add-rtl8188eu-USB-ID-for-D-Link-USB-GO-N150.patch +++ b/package/kernel/mac80211/patches/653-0049-rtl8xxxu-Add-rtl8188eu-USB-ID-for-D-Link-USB-GO-N150.patch @@ -13,7 +13,7 @@ Signed-off-by: Jes Sorensen --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c -@@ -6332,6 +6332,9 @@ static const struct usb_device_id dev_ta +@@ -6330,6 +6330,9 @@ static struct usb_device_id dev_table[] /* Sitecom rtl8188eus */ {USB_DEVICE_AND_INTERFACE_INFO(0x0df6, 0x0076, 0xff, 0xff, 0xff), .driver_info = (unsigned long)&rtl8188eu_fops}, diff --git a/package/kernel/mac80211/patches/801-libertas-configure-sysfs-links.patch b/package/kernel/mac80211/patches/801-libertas-configure-sysfs-links.patch index cfde08d4ea..106ef706b8 100644 --- a/package/kernel/mac80211/patches/801-libertas-configure-sysfs-links.patch +++ b/package/kernel/mac80211/patches/801-libertas-configure-sysfs-links.patch @@ -1,17 +1,17 @@ --- a/drivers/net/wireless/marvell/libertas/cfg.c +++ b/drivers/net/wireless/marvell/libertas/cfg.c -@@ -2043,6 +2043,8 @@ struct wireless_dev *lbs_cfg_alloc(struc +@@ -2127,6 +2127,8 @@ struct wireless_dev *lbs_cfg_alloc(struc goto err_wiphy_new; } + set_wiphy_dev(wdev->wiphy, dev); + + lbs_deb_leave(LBS_DEB_CFG80211); return wdev; - err_wiphy_new: --- a/drivers/net/wireless/marvell/libertas/main.c +++ b/drivers/net/wireless/marvell/libertas/main.c -@@ -933,6 +933,7 @@ struct lbs_private *lbs_add_card(void *c +@@ -986,6 +986,7 @@ struct lbs_private *lbs_add_card(void *c goto err_adapter; } diff --git a/package/kernel/mac80211/patches/802-libertas-set-wireless-macaddr.patch b/package/kernel/mac80211/patches/802-libertas-set-wireless-macaddr.patch index b26505de21..04b4954d29 100644 --- a/package/kernel/mac80211/patches/802-libertas-set-wireless-macaddr.patch +++ b/package/kernel/mac80211/patches/802-libertas-set-wireless-macaddr.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/marvell/libertas/cfg.c +++ b/drivers/net/wireless/marvell/libertas/cfg.c -@@ -2119,6 +2119,8 @@ int lbs_cfg_register(struct lbs_private +@@ -2217,6 +2217,8 @@ int lbs_cfg_register(struct lbs_private wdev->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites); wdev->wiphy->reg_notifier = lbs_reg_notifier; diff --git a/package/kernel/mac80211/patches/810-b43-gpio-mask-module-option.patch b/package/kernel/mac80211/patches/810-b43-gpio-mask-module-option.patch index 5ce49d3a07..fd9e6fd974 100644 --- a/package/kernel/mac80211/patches/810-b43-gpio-mask-module-option.patch +++ b/package/kernel/mac80211/patches/810-b43-gpio-mask-module-option.patch @@ -10,8 +10,8 @@ struct b43_phy phy; --- a/drivers/net/wireless/broadcom/b43/main.c +++ b/drivers/net/wireless/broadcom/b43/main.c -@@ -85,6 +85,11 @@ MODULE_FIRMWARE("b43/ucode40.fw"); - MODULE_FIRMWARE("b43/ucode42.fw"); +@@ -75,6 +75,11 @@ MODULE_FIRMWARE("b43/ucode16_mimo.fw"); + MODULE_FIRMWARE("b43/ucode5.fw"); MODULE_FIRMWARE("b43/ucode9.fw"); +static int modparam_gpiomask = 0x000F; @@ -22,7 +22,7 @@ static int modparam_bad_frames_preempt; module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444); MODULE_PARM_DESC(bad_frames_preempt, -@@ -2892,10 +2897,10 @@ static int b43_gpio_init(struct b43_wlde +@@ -2882,10 +2887,10 @@ static int b43_gpio_init(struct b43_wlde u32 mask, set; b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_GPOUTSMSK, 0); diff --git a/package/kernel/mac80211/patches/811-b43_no_pio.patch b/package/kernel/mac80211/patches/811-b43_no_pio.patch index d23387c8cd..79428c2784 100644 --- a/package/kernel/mac80211/patches/811-b43_no_pio.patch +++ b/package/kernel/mac80211/patches/811-b43_no_pio.patch @@ -11,7 +11,7 @@ b43-$(CPTCFG_B43_LEDS) += leds.o --- a/drivers/net/wireless/broadcom/b43/main.c +++ b/drivers/net/wireless/broadcom/b43/main.c -@@ -2018,10 +2018,12 @@ static void b43_do_interrupt_thread(stru +@@ -2008,10 +2008,12 @@ static void b43_do_interrupt_thread(stru dma_reason[0], dma_reason[1], dma_reason[2], dma_reason[3], dma_reason[4], dma_reason[5]); diff --git a/package/kernel/mac80211/patches/812-b43-add-antenna-control.patch b/package/kernel/mac80211/patches/812-b43-add-antenna-control.patch index 932c83b48e..33c9402f18 100644 --- a/package/kernel/mac80211/patches/812-b43-add-antenna-control.patch +++ b/package/kernel/mac80211/patches/812-b43-add-antenna-control.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/broadcom/b43/main.c +++ b/drivers/net/wireless/broadcom/b43/main.c -@@ -1658,7 +1658,7 @@ static void b43_write_beacon_template(st +@@ -1648,7 +1648,7 @@ static void b43_write_beacon_template(st len, ram_offset, shm_size_offset, rate); /* Write the PHY TX control parameters. */ @@ -9,7 +9,7 @@ antenna = b43_antenna_to_phyctl(antenna); ctl = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL); /* We can't send beacons with short preamble. Would get PHY errors. */ -@@ -3307,8 +3307,8 @@ static int b43_chip_init(struct b43_wlde +@@ -3297,8 +3297,8 @@ static int b43_chip_init(struct b43_wlde /* Select the antennae */ if (phy->ops->set_rx_antenna) @@ -20,7 +20,7 @@ if (phy->type == B43_PHYTYPE_B) { value16 = b43_read16(dev, 0x005E); -@@ -4008,7 +4008,6 @@ static int b43_op_config(struct ieee8021 +@@ -3998,7 +3998,6 @@ static int b43_op_config(struct ieee8021 struct b43_wldev *dev = wl->current_dev; struct b43_phy *phy = &dev->phy; struct ieee80211_conf *conf = &hw->conf; @@ -28,7 +28,7 @@ int err = 0; mutex_lock(&wl->mutex); -@@ -4051,11 +4050,9 @@ static int b43_op_config(struct ieee8021 +@@ -4041,11 +4040,9 @@ static int b43_op_config(struct ieee8021 } /* Antennas for RX and management frame TX. */ @@ -42,7 +42,7 @@ if (wl->radio_enabled != phy->radio_on) { if (wl->radio_enabled) { -@@ -5199,6 +5196,47 @@ static int b43_op_get_survey(struct ieee +@@ -5189,6 +5186,47 @@ static int b43_op_get_survey(struct ieee return 0; } @@ -90,7 +90,7 @@ static const struct ieee80211_ops b43_hw_ops = { .tx = b43_op_tx, .conf_tx = b43_op_conf_tx, -@@ -5220,6 +5258,8 @@ static const struct ieee80211_ops b43_hw +@@ -5210,6 +5248,8 @@ static const struct ieee80211_ops b43_hw .sw_scan_complete = b43_op_sw_scan_complete_notifier, .get_survey = b43_op_get_survey, .rfkill_poll = b43_rfkill_poll, @@ -99,7 +99,7 @@ }; /* Hard-reset the chip. Do not call this directly. -@@ -5523,6 +5563,8 @@ static int b43_one_core_attach(struct b4 +@@ -5513,6 +5553,8 @@ static int b43_one_core_attach(struct b4 if (!wldev) goto out; @@ -108,9 +108,9 @@ wldev->use_pio = b43_modparam_pio; wldev->dev = dev; wldev->wl = wl; -@@ -5617,6 +5659,9 @@ static struct b43_wl *b43_wireless_init( +@@ -5605,6 +5647,9 @@ static struct b43_wl *b43_wireless_init( - wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); + hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; + hw->wiphy->available_antennas_rx = 0x3; + hw->wiphy->available_antennas_tx = 0x3; diff --git a/package/kernel/mac80211/patches/814-b43-only-use-gpio-0-1-for-led.patch b/package/kernel/mac80211/patches/814-b43-only-use-gpio-0-1-for-led.patch index 03f4524c88..8d0c0412d2 100644 --- a/package/kernel/mac80211/patches/814-b43-only-use-gpio-0-1-for-led.patch +++ b/package/kernel/mac80211/patches/814-b43-only-use-gpio-0-1-for-led.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/broadcom/b43/main.c +++ b/drivers/net/wireless/broadcom/b43/main.c -@@ -2909,6 +2909,14 @@ static int b43_gpio_init(struct b43_wlde +@@ -2899,6 +2899,14 @@ static int b43_gpio_init(struct b43_wlde } else if (dev->dev->chip_id == 0x5354) { /* Don't allow overtaking buttons GPIOs */ set &= 0x2; /* 0x2 is LED GPIO on BCM5354 */ diff --git a/package/kernel/mac80211/patches/815-b43-always-take-overlapping-devs.patch b/package/kernel/mac80211/patches/815-b43-always-take-overlapping-devs.patch index f07151aa4e..ef7f3c92d2 100644 --- a/package/kernel/mac80211/patches/815-b43-always-take-overlapping-devs.patch +++ b/package/kernel/mac80211/patches/815-b43-always-take-overlapping-devs.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/broadcom/b43/main.c +++ b/drivers/net/wireless/broadcom/b43/main.c -@@ -127,7 +127,7 @@ static int b43_modparam_pio = 0; +@@ -117,7 +117,7 @@ static int b43_modparam_pio = 0; module_param_named(pio, b43_modparam_pio, int, 0644); MODULE_PARM_DESC(pio, "Use PIO accesses by default: 0=DMA, 1=PIO"); diff --git a/package/kernel/mac80211/patches/860-brcmfmac-register-wiphy-s-during-module_init.patch b/package/kernel/mac80211/patches/860-brcmfmac-register-wiphy-s-during-module_init.patch index cc29402c0b..d09057f896 100644 --- a/package/kernel/mac80211/patches/860-brcmfmac-register-wiphy-s-during-module_init.patch +++ b/package/kernel/mac80211/patches/860-brcmfmac-register-wiphy-s-during-module_init.patch @@ -13,7 +13,7 @@ Signed-off-by: Rafał Miłecki --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c -@@ -1198,6 +1198,7 @@ int __init brcmf_core_init(void) +@@ -1196,6 +1196,7 @@ int __init brcmf_core_init(void) { if (!schedule_work(&brcmf_driver_work)) return -EBUSY; @@ -25,7 +25,7 @@ Signed-off-by: Rafał Miłecki +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c @@ -444,6 +444,7 @@ struct brcmf_fw { u16 bus_nr; - void (*done)(struct device *dev, int err, const struct firmware *fw, + void (*done)(struct device *dev, const struct firmware *fw, void *nvram_image, u32 nvram_len); + struct completion *completion; }; @@ -34,7 +34,7 @@ Signed-off-by: Rafał Miłecki @@ -478,6 +479,8 @@ static void brcmf_fw_request_nvram_done( goto fail; - fwctx->done(fwctx->dev, 0, fwctx->code, nvram, nvram_length); + fwctx->done(fwctx->dev, fwctx->code, nvram, nvram_length); + if (fwctx->completion) + complete(fwctx->completion); kfree(fwctx); @@ -43,22 +43,31 @@ Signed-off-by: Rafał Miłecki @@ -485,6 +488,8 @@ fail: brcmf_dbg(TRACE, "failed: dev=%s\n", dev_name(fwctx->dev)); release_firmware(fwctx->code); - fwctx->done(fwctx->dev, -ENOENT, NULL, NULL, 0); + device_release_driver(fwctx->dev); + if (fwctx->completion) + complete(fwctx->completion); kfree(fwctx); } -@@ -516,6 +521,8 @@ fail: +@@ -500,6 +505,8 @@ static void brcmf_fw_request_code_done(c + /* only requested code so done here */ + if (!(fwctx->flags & BRCMF_FW_REQUEST_NVRAM)) { + fwctx->done(fwctx->dev, fw, NULL, 0); ++ if (fwctx->completion) ++ complete(fwctx->completion); + kfree(fwctx); + return; + } +@@ -517,6 +524,8 @@ static void brcmf_fw_request_code_done(c + fail: brcmf_dbg(TRACE, "failed: dev=%s\n", dev_name(fwctx->dev)); - done: - fwctx->done(fwctx->dev, ret, fw, NULL, 0); + device_release_driver(fwctx->dev); + if (fwctx->completion) + complete(fwctx->completion); kfree(fwctx); } -@@ -527,6 +534,8 @@ int brcmf_fw_get_firmwares_pcie(struct d +@@ -528,6 +537,8 @@ int brcmf_fw_get_firmwares_pcie(struct d u16 domain_nr, u16 bus_nr) { struct brcmf_fw *fwctx; @@ -67,7 +76,7 @@ Signed-off-by: Rafał Miłecki brcmf_dbg(TRACE, "enter: dev=%s\n", dev_name(dev)); if (!fw_cb || !code) -@@ -547,9 +556,17 @@ int brcmf_fw_get_firmwares_pcie(struct d +@@ -548,9 +559,17 @@ int brcmf_fw_get_firmwares_pcie(struct d fwctx->domain_nr = domain_nr; fwctx->bus_nr = bus_nr; diff --git a/package/kernel/mac80211/patches/861-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch b/package/kernel/mac80211/patches/861-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch index 7fc1e449d0..774b333402 100644 --- a/package/kernel/mac80211/patches/861-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch +++ b/package/kernel/mac80211/patches/861-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch @@ -10,8 +10,8 @@ Signed-off-by: Rafał Miłecki --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -@@ -655,9 +655,37 @@ static struct wireless_dev *brcmf_cfg802 - enum nl80211_iftype type, +@@ -656,9 +656,37 @@ static struct wireless_dev *brcmf_cfg802 + u32 *flags, struct vif_params *params) { + struct net_device *dev; diff --git a/package/kernel/mac80211/patches/862-brcmfmac-Disable-power-management.patch b/package/kernel/mac80211/patches/862-brcmfmac-Disable-power-management.patch index 43f8fbf674..1819cf3999 100644 --- a/package/kernel/mac80211/patches/862-brcmfmac-Disable-power-management.patch +++ b/package/kernel/mac80211/patches/862-brcmfmac-Disable-power-management.patch @@ -14,7 +14,7 @@ Signed-off-by: Phil Elwell --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -@@ -2838,6 +2838,10 @@ brcmf_cfg80211_set_power_mgmt(struct wip +@@ -2775,6 +2775,10 @@ brcmf_cfg80211_set_power_mgmt(struct wip * preference in cfg struct to apply this to * FW later while initializing the dongle */ diff --git a/package/kernel/mac80211/patches/921-ath10k_init_devices_synchronously.patch b/package/kernel/mac80211/patches/921-ath10k_init_devices_synchronously.patch index 94a25b680d..0c34d96847 100644 --- a/package/kernel/mac80211/patches/921-ath10k_init_devices_synchronously.patch +++ b/package/kernel/mac80211/patches/921-ath10k_init_devices_synchronously.patch @@ -14,7 +14,7 @@ Signed-off-by: Sven Eckelmann --- a/drivers/net/wireless/ath/ath10k/core.c +++ b/drivers/net/wireless/ath/ath10k/core.c -@@ -2445,6 +2445,16 @@ int ath10k_core_register(struct ath10k * +@@ -2319,6 +2319,16 @@ int ath10k_core_register(struct ath10k * ar->chip_id = chip_id; queue_work(ar->workqueue, &ar->register_work); diff --git a/package/kernel/mac80211/patches/930-ath10k_add_tpt_led_trigger.patch b/package/kernel/mac80211/patches/930-ath10k_add_tpt_led_trigger.patch index e0ab671760..4cf1b9f92a 100644 --- a/package/kernel/mac80211/patches/930-ath10k_add_tpt_led_trigger.patch +++ b/package/kernel/mac80211/patches/930-ath10k_add_tpt_led_trigger.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath10k/mac.c +++ b/drivers/net/wireless/ath/ath10k/mac.c -@@ -8067,6 +8067,21 @@ static int ath10k_mac_init_rd(struct ath +@@ -8003,6 +8003,21 @@ static int ath10k_mac_init_rd(struct ath return 0; } @@ -22,9 +22,9 @@ int ath10k_mac_register(struct ath10k *ar) { static const u32 cipher_suites[] = { -@@ -8308,6 +8323,12 @@ int ath10k_mac_register(struct ath10k *a - - wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); +@@ -8248,6 +8263,12 @@ int ath10k_mac_register(struct ath10k *a + ar->hw->wiphy->cipher_suites = cipher_suites; + ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites); +#ifdef CPTCFG_MAC80211_LEDS + ieee80211_create_tpt_led_trigger(ar->hw, diff --git a/package/kernel/mac80211/patches/936-ath10k-fix-otp-failure-result.patch b/package/kernel/mac80211/patches/936-ath10k-fix-otp-failure-result.patch deleted file mode 100644 index 0af8025d96..0000000000 --- a/package/kernel/mac80211/patches/936-ath10k-fix-otp-failure-result.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/drivers/net/wireless/ath/ath10k/core.c -+++ b/drivers/net/wireless/ath/ath10k/core.c -@@ -757,7 +757,7 @@ static int ath10k_core_get_board_id_from - if (ret) { - ath10k_err(ar, "could not execute otp for board id check: %d\n", - ret); -- return ret; -+ return -EOPNOTSUPP; - } - - board_id = MS(result, ATH10K_BMI_BOARD_ID_FROM_OTP); diff --git a/package/kernel/mac80211/patches/936-ath10k_skip_otp_check.patch b/package/kernel/mac80211/patches/936-ath10k_skip_otp_check.patch new file mode 100644 index 0000000000..057995c55a --- /dev/null +++ b/package/kernel/mac80211/patches/936-ath10k_skip_otp_check.patch @@ -0,0 +1,51 @@ +--- a/drivers/net/wireless/ath/ath10k/core.c ++++ b/drivers/net/wireless/ath/ath10k/core.c +@@ -1362,9 +1362,6 @@ static int ath10k_core_fetch_firmware_fi + { + int ret; + +- /* calibration file is optional, don't check for any errors */ +- ath10k_fetch_cal_file(ar); +- + ar->fw_api = 5; + ath10k_dbg(ar, ATH10K_DBG_BOOT, "trying fw api %d\n", ar->fw_api); + +@@ -2149,7 +2146,7 @@ EXPORT_SYMBOL(ath10k_core_stop); + static int ath10k_core_probe_fw(struct ath10k *ar) + { + struct bmi_target_info target_info; +- int ret = 0; ++ int calret, ret = 0; + + ret = ath10k_hif_power_up(ar); + if (ret) { +@@ -2173,6 +2170,9 @@ static int ath10k_core_probe_fw(struct a + goto err_power_down; + } + ++ /* calibration file is optional, don't check for any errors */ ++ calret = ath10k_fetch_cal_file(ar); ++ + ret = ath10k_core_fetch_firmware_files(ar); + if (ret) { + ath10k_err(ar, "could not fetch firmware files (%d)\n", ret); +@@ -2195,11 +2195,14 @@ static int ath10k_core_probe_fw(struct a + "could not load pre cal data: %d\n", ret); + } + +- ret = ath10k_core_get_board_id_from_otp(ar); +- if (ret && ret != -EOPNOTSUPP) { +- ath10k_err(ar, "failed to get board id from otp: %d\n", +- ret); +- goto err_free_firmware_files; ++ /* otp and board file not needed if calibration data is present */ ++ if (calret) { ++ ret = ath10k_core_get_board_id_from_otp(ar); ++ if (ret && ret != -EOPNOTSUPP) { ++ ath10k_err(ar, "failed to get board id from otp: %d\n", ++ ret); ++ goto err_free_firmware_files; ++ } + } + + ret = ath10k_core_check_smbios(ar); diff --git a/package/kernel/mac80211/patches/940-mwl8k_init_devices_synchronously.patch b/package/kernel/mac80211/patches/940-mwl8k_init_devices_synchronously.patch index a958c78b43..357faee4bf 100644 --- a/package/kernel/mac80211/patches/940-mwl8k_init_devices_synchronously.patch +++ b/package/kernel/mac80211/patches/940-mwl8k_init_devices_synchronously.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/marvell/mwl8k.c +++ b/drivers/net/wireless/marvell/mwl8k.c -@@ -6266,6 +6266,8 @@ static int mwl8k_probe(struct pci_dev *p +@@ -6264,6 +6264,8 @@ static int mwl8k_probe(struct pci_dev *p priv->running_bsses = 0; @@ -9,7 +9,7 @@ return rc; err_stop_firmware: -@@ -6299,8 +6301,6 @@ static void mwl8k_remove(struct pci_dev +@@ -6297,8 +6299,6 @@ static void mwl8k_remove(struct pci_dev return; priv = hw->priv; diff --git a/package/kernel/mac80211/patches/960-0010-ath10k-limit-htt-rx-ring-size.patch b/package/kernel/mac80211/patches/960-0010-ath10k-limit-htt-rx-ring-size.patch deleted file mode 100644 index 914472aab9..0000000000 --- a/package/kernel/mac80211/patches/960-0010-ath10k-limit-htt-rx-ring-size.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/drivers/net/wireless/ath/ath10k/htt.h -+++ b/drivers/net/wireless/ath/ath10k/htt.h -@@ -200,7 +200,7 @@ enum htt_rx_ring_flags { - }; - - #define HTT_RX_RING_SIZE_MIN 128 --#define HTT_RX_RING_SIZE_MAX 2048 -+#define HTT_RX_RING_SIZE_MAX 512 - - struct htt_rx_ring_setup_ring { - __le32 fw_idx_shadow_reg_paddr; diff --git a/package/kernel/mac80211/patches/960-0011-ath10k-limit-pci-buffer-size.patch b/package/kernel/mac80211/patches/960-0011-ath10k-limit-pci-buffer-size.patch deleted file mode 100644 index a101282d07..0000000000 --- a/package/kernel/mac80211/patches/960-0011-ath10k-limit-pci-buffer-size.patch +++ /dev/null @@ -1,38 +0,0 @@ ---- a/drivers/net/wireless/ath/ath10k/pci.c -+++ b/drivers/net/wireless/ath/ath10k/pci.c -@@ -128,7 +128,7 @@ static struct ce_attr host_ce_config_wla - .flags = CE_ATTR_FLAGS, - .src_nentries = 0, - .src_sz_max = 2048, -- .dest_nentries = 512, -+ .dest_nentries = 128, - .recv_cb = ath10k_pci_htt_htc_rx_cb, - }, - -@@ -137,7 +137,7 @@ static struct ce_attr host_ce_config_wla - .flags = CE_ATTR_FLAGS, - .src_nentries = 0, - .src_sz_max = 2048, -- .dest_nentries = 128, -+ .dest_nentries = 64, - .recv_cb = ath10k_pci_htc_rx_cb, - }, - -@@ -164,7 +164,7 @@ static struct ce_attr host_ce_config_wla - .flags = CE_ATTR_FLAGS, - .src_nentries = 0, - .src_sz_max = 512, -- .dest_nentries = 512, -+ .dest_nentries = 128, - .recv_cb = ath10k_pci_htt_rx_cb, - }, - -@@ -189,7 +189,7 @@ static struct ce_attr host_ce_config_wla - .flags = CE_ATTR_FLAGS, - .src_nentries = 0, - .src_sz_max = 2048, -- .dest_nentries = 128, -+ .dest_nentries = 96, - .recv_cb = ath10k_pci_pktlog_rx_cb, - }, - diff --git a/target/linux/generic/files/include/linux/ath9k_platform.h b/target/linux/generic/files/include/linux/ath9k_platform.h index f1f2ad419c..558445ff63 100644 --- a/target/linux/generic/files/include/linux/ath9k_platform.h +++ b/target/linux/generic/files/include/linux/ath9k_platform.h @@ -49,6 +49,7 @@ struct ath9k_platform_data { int num_leds; const struct gpio_led *leds; + const char *led_name; unsigned num_btns; const struct gpio_keys_button *btns; From 352068e024c5f424a63279b72d75664402780f12 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Fri, 3 Nov 2017 13:10:40 +0800 Subject: [PATCH 25/37] unselect odhcpd odhcp6c by default --- include/target.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/target.mk b/include/target.mk index bd454e4b8d..f9fed54a8f 100644 --- a/include/target.mk +++ b/include/target.mk @@ -21,7 +21,7 @@ luci-app-pptp-server luci-app-ipsec-vpnd luci-app-vlmcsd luci-app-wifischedule l # For nas targets DEFAULT_PACKAGES.nas:=block-mount fdisk lsblk mdadm # For router targets -DEFAULT_PACKAGES.router:=dnsmasq-full iptables ip6tables ppp ppp-mod-pppoe firewall odhcpd odhcp6c +DEFAULT_PACKAGES.router:=dnsmasq-full iptables ip6tables ppp ppp-mod-pppoe firewall DEFAULT_PACKAGES.bootloader:= ifneq ($(DUMP),) From 339ed105b46dc69b756ca78a276be7741560b531 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Fri, 3 Nov 2017 13:25:07 +0800 Subject: [PATCH 26/37] select automount and autousamba --- include/target.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/target.mk b/include/target.mk index f9fed54a8f..900c39d231 100644 --- a/include/target.mk +++ b/include/target.mk @@ -14,7 +14,7 @@ DEVICE_TYPE?=router # Default packages - the really basic set DEFAULT_PACKAGES:=base-files libc libgcc busybox dropbear mtd uci opkg netifd fstools uclient-fetch logd \ -iptables-mod-nat-extra kmod-nf-nathelper kmod-nf-nathelper-extra kmod-macvlan block-mount \ +iptables-mod-nat-extra kmod-nf-nathelper kmod-nf-nathelper-extra kmod-macvlan block-mount automount autosamba\ default-settings ipset-lists luci luci-app-ddns luci-app-sqm luci-app-upnp luci-app-adbyby-plus luci-app-autoreboot \ luci-app-filetransfer luci-app-shadowsocksr-pro luci-app-usb-printer luci-app-vsftpd luci-app-sfe \ luci-app-pptp-server luci-app-ipsec-vpnd luci-app-vlmcsd luci-app-wifischedule luci-app-wol luci-app-nlbwmon From 0dac3366beae1a364f7385a6b244a6e512f09d91 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Sat, 4 Nov 2017 14:33:57 +0800 Subject: [PATCH 27/37] sync ath10k firmware to LEDE 17.01.4 stable --- package/firmware/ath10k-firmware/Makefile | 139 ++++++++-------------- 1 file changed, 47 insertions(+), 92 deletions(-) diff --git a/package/firmware/ath10k-firmware/Makefile b/package/firmware/ath10k-firmware/Makefile index 1ff1340a21..8bf5729fff 100644 --- a/package/firmware/ath10k-firmware/Makefile +++ b/package/firmware/ath10k-firmware/Makefile @@ -8,9 +8,9 @@ include $(TOPDIR)/rules.mk PKG_NAME:=ath10k-firmware -PKG_SOURCE_DATE:=2017-03-29 -PKG_SOURCE_VERSION:=956e2609b7e42c8c710bba10ef925a5be1be5137 -PKG_MIRROR_HASH:=25f724ff38c830281b3efba4a4ddffaae0c4bd8fea0f4c1061591229ff05535b +PKG_SOURCE_DATE:=2017-01-11 +PKG_SOURCE_VERSION:=ab432c60437931a165f0aff1a6e3371f358b75dd +PKG_MIRROR_HASH:=e3188ecd4d7470d3cdde89fefa6258f9ec4f404b23558d1474e5014679b28101 PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git @@ -32,27 +32,21 @@ $(Package/ath10k-firmware-default) TITLE:=ath10k firmware for QCA9887 devices endef -define Package/ath10k-firmware-qca9888 -$(Package/ath10k-firmware-default) - TITLE:=ath10k firmware for QCA9888 devices -endef - define Package/ath10k-firmware-qca9887-ct $(Package/ath10k-firmware-default) TITLE:=ath10k-CT firmware for QCA9887 devices endef -QCA9887_REV:=3920dbf0a04c8918b839d5e5d9e2b8fbd5c7e692 -QCA9887_FIRMWARE_VERSION:=10.2.4-1.0 -QCA9887_FIRMWARE_FILE:=firmware-5.bin_10.2.4-1.0-00029 -QCA9887_FIRMWARE_FILE_HASH:=b27b4a2117b578a334b9b744e2095c4f86378fd4badfb7619c7e11712d714ab3 +QCA9887_REV:=3cce88e245f2d685e49411c4f80998f94baf67b8 +QCA9887_FIRMWARE_FILE:=firmware-5.bin_10.2.4-1.0-00013 +QCA9887_FIRMWARE_FILE_HASH:=5966408bd41f309edb595344b8dd088c0fed212debfd91e5f3e8a55ea119c16d QCA9887_FIRMWARE_FILE_DL:=$(QCA9887_FIRMWARE_FILE).$(QCA9887_FIRMWARE_FILE_HASH) QCA9887_BOARD_FILE:=board.bin QCA9887_BOARD_FILE_HASH:=cf4df099f6ee05c181f55ce17297a1d32c61d725eb96246fd315ad5587c42426 QCA9887_BOARD_FILE_DL:=$(QCA9887_BOARD_FILE).$(QCA9887_BOARD_FILE_HASH) define Download/ath10k-qca9887-firmware - URL:=https://github.com/kvalo/ath10k-firmware/raw/$(QCA9887_REV)/QCA9887/hw1.0/$(QCA9887_FIRMWARE_VERSION)/ + URL:=https://github.com/kvalo/ath10k-firmware/raw/$(QCA9887_REV)/QCA9887/hw1.0/ URL_FILE:=$(QCA9887_FIRMWARE_FILE) FILE:=$(QCA9887_FIRMWARE_FILE_DL) HASH:=$(QCA9887_FIRMWARE_FILE_HASH) @@ -82,41 +76,34 @@ define Download/ct-firmware URL_FILE:=$($(1)_FIRMWARE_FILE_CT) endef -QCA988X_FIRMWARE_FILE_CT:=firmware-2-ct-full-community-19.bin.lede +QCA988X_FIRMWARE_FILE_CT:=firmware-2-ct-full-community.bin-19-rc3-lede define Download/ath10k-firmware-qca988x-ct $(call Download/ct-firmware,QCA988X,) - HASH:=bff98f028062dae9fc638c7596aec3c79bf9eddaff65cfacba067f6d72f217cd + HASH:=4112d78161a2c20e7a9490ea8d04e9f919508bafb097d88761dcce026c26f93f endef $(eval $(call Download,ath10k-firmware-qca988x-ct)) -QCA9887_FIRMWARE_FILE_CT:=firmware-2-ct-full-community-19.bin.lede +QCA9887_FIRMWARE_FILE_CT:=firmware-2-ct-full-community.bin-19-rc3-lede define Download/ath10k-firmware-qca9887-ct $(call Download/ct-firmware,QCA9887,ath10k-9887) - HASH:=95dc106f98672bd9c7d3fe6881ed79ab079cb49b0a995650991b1beaff2b0101 + HASH:=18b61875726d4384de46f75dec1d42fea31aa6d66dba4940cb9d375bc98732e4 endef $(eval $(call Download,ath10k-firmware-qca9887-ct)) -QCA99X0_FIRMWARE_FILE_CT:=firmware-5-ct-full-community-9.bin-lede.004 +QCA99X0_FIRMWARE_FILE_CT:=firmware-5-ct-full-community-9.bin-lede.001 define Download/ath10k-firmware-qca99x0-ct $(call Download/ct-firmware,QCA99X0,ath10k-10-4) - HASH:=993c29fd64bb2a59b86d34f58601a1a48b83b541750bc511f78cc17152829b4d + HASH:=61ff2b52617ae805579f423d6539284f056aba2b9f7e3629d600f6a5077ab703 endef $(eval $(call Download,ath10k-firmware-qca99x0-ct)) -QCA9984_FIRMWARE_FILE_CT:=firmware-5-ct-full-community-9.bin-lede.004 +QCA9984_FIRMWARE_FILE_CT:=firmware-5-ct-full-community-9.bin-lede.001 define Download/ath10k-firmware-qca9984-ct $(call Download/ct-firmware,QCA9984,ath10k-9984-10-4) - HASH:=d997eed9a8bc6809c01d367759ba8545c10e3be93ea1f33d6d753127ef0f7c5e + HASH:=e079db5059cf28979ff50c7f6706df87e96a375e8048deeb4f6ede5357577f74 endef $(eval $(call Download,ath10k-firmware-qca9984-ct)) -QCA9888_FIRMWARE_FILE_CT:=firmware-5-ct-full-community-9.bin-lede.004 -define Download/ath10k-firmware-qca9888-ct - $(call Download/ct-firmware,QCA9888,ath10k-9888-10-4) - HASH:=bbaa71bc7dcaa264c5875e86639f174908fed09fbace975e325959d42f3754ff -endef -$(eval $(call Download,ath10k-firmware-qca9888-ct)) - define Package/ath10k-firmware-qca99x0 $(Package/ath10k-firmware-default) TITLE:=ath10k firmware for QCA99x0 devices @@ -171,14 +158,6 @@ This firmware conflicts with the standard 9984 firmware, so select only one. endef -define Package/ath10k-firmware-qca9888-ct/description -Alternative ath10k firmware for QCA9886 and QCA9888 from Candela Technologies. -Enables IBSS and other features. See: -http://www.candelatech.com/ath10k-10.4.php -This firmware conflicts with the standard 9886 and 9888 firmware, so select only -one. -endef - define Package/ath10k-firmware-qca99x0/description Standard ath10k firmware for QCA99x0 from QCA This firmware conflicts with the CT 99x0 firmware, so select only @@ -199,13 +178,6 @@ $(Package/ath10k-firmware-default) CATEGORY:=Firmware endef -define Package/ath10k-firmware-qca9888-ct -$(Package/ath10k-firmware-default) - TITLE:=ath10k CT 10.4.3 firmware for QCA9886 and QCA9888 devices - SECTION:=firmware - CATEGORY:=Firmware -endef - define Package/ath10k-firmware-qca9984 $(Package/ath10k-firmware-default) TITLE:=ath10k firmware for QCA9984 devices @@ -213,13 +185,6 @@ $(Package/ath10k-firmware-default) CATEGORY:=Firmware endef -define Package/ath10k-firmware-qca4019 -$(Package/ath10k-firmware-default) - TITLE:=ath10k firmware for IPQ/QCA4019 devices - SECTION:=firmware - CATEGORY:=Firmware -endef - define Package/ath10k-firmware-qca6174 $(Package/ath10k-firmware-default) TITLE:=ath10k firmware for QCA6174 devices @@ -238,20 +203,33 @@ define Download/qca99x0-board endef $(eval $(call Download,qca99x0-board)) +QCA9984_BOARD_REV:=719c0127e52bd70559e71b85ab0331790e1bf66c +QCA9984_BOARD_FILE:=board-2.bin +QCA9984_BOARD_FILE_DL:=$(QCA9984_BOARD_FILE).$(QCA9984_BOARD_REV) +QCA9984_FIRMWARE_REV:=d43cb1188154037506e94abf3aa456cc934c6861 +QCA9984_FIRMWARE_FILE:=firmware-5.bin_10.4-3.4-00072 +QCA9984_FIRMWARE_FILE_DL:=$(QCA9984_FIRMWARE_FILE).$(QCA9984_FIRMWARE_REV) + +define Download/ath10k-qca9984-board + URL:=https://source.codeaurora.org/quic/qsdk/oss/firmware/ath10k-firmware/plain/ath10k/QCA9984/hw1.0/ + URL_FILE:=$(QCA9984_BOARD_FILE)?id=$(QCA9984_BOARD_REV) + FILE:=$(QCA9984_BOARD_FILE_DL) + HASH:=e968b214fd76d5b7859f71841ce40fbd5f47336c3ccbaf95e23f902f5e569aef +endef +$(eval $(call Download,ath10k-qca9984-board)) + +define Download/ath10k-qca9984-firmware + URL:=https://source.codeaurora.org/quic/qsdk/oss/firmware/ath10k-firmware/plain/ath10k/QCA9984/hw1.0/ + URL_FILE:=$(QCA9984_FIRMWARE_FILE)?id=$(QCA9984_FIRMWARE_REV) + FILE:=$(QCA9984_FIRMWARE_FILE_DL) + HASH:=28d5834e8c4ca8fcef9ea033cd8b9b0f9ee84ecf30dbde84c9c64bf8dd9912bc +endef +$(eval $(call Download,ath10k-qca9984-firmware)) + define Build/Compile endef -define Package/ath10k-firmware-qca4019/install - $(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA4019/hw1.0 - $(INSTALL_DATA) \ - $(PKG_BUILD_DIR)/QCA4019/hw1.0/board-2.bin \ - $(1)/lib/firmware/ath10k/QCA4019/hw1.0/ - $(INSTALL_DATA) \ - $(PKG_BUILD_DIR)/QCA4019/hw1.0/3.2.1/firmware-5.bin_10.4-3.2.1-00053 \ - $(1)/lib/firmware/ath10k/QCA4019/hw1.0/firmware-5.bin -endef - define Package/ath10k-firmware-qca9887/install $(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA9887/hw1.0 $(INSTALL_DATA) \ @@ -262,26 +240,13 @@ define Package/ath10k-firmware-qca9887/install $(1)/lib/firmware/ath10k/QCA9887/hw1.0/board.bin endef -define Package/ath10k-firmware-qca9888/install - $(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA9888/hw2.0 - $(INSTALL_DATA) \ - $(PKG_BUILD_DIR)/QCA9888/hw2.0/board-2.bin \ - $(1)/lib/firmware/ath10k/QCA9888/hw2.0/board-2.bin - $(INSTALL_DATA) \ - $(PKG_BUILD_DIR)/QCA9888/hw2.0/board-2.bin \ - $(1)/lib/firmware/ath10k/QCA9888/hw2.0/board.bin - $(INSTALL_DATA) \ - $(PKG_BUILD_DIR)/QCA9888/hw2.0/firmware-5.bin_10.4-3.2-00072 \ - $(1)/lib/firmware/ath10k/QCA9888/hw2.0/firmware-5.bin -endef - define Package/ath10k-firmware-qca988x/install $(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA988X/hw2.0 $(INSTALL_DATA) \ $(PKG_BUILD_DIR)/QCA988X/hw2.0/board.bin \ $(1)/lib/firmware/ath10k/QCA988X/hw2.0/ $(INSTALL_DATA) \ - $(PKG_BUILD_DIR)/QCA988X/hw2.0/10.2.4-1.0/firmware-5.bin_10.2.4-1.0-00029 \ + $(PKG_BUILD_DIR)/QCA988X/hw2.0/10.2.4-1.0/firmware-5.bin_10.2.4-1.0-00016 \ $(1)/lib/firmware/ath10k/QCA988X/hw2.0/firmware-5.bin endef @@ -338,16 +303,22 @@ endef define Package/ath10k-firmware-qca9984/install $(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA9984/hw1.0 + ln -s \ + ../../cal-pci-0000:01:00.0.bin \ + $(1)/lib/firmware/ath10k/QCA9984/hw1.0/board.bin $(INSTALL_DATA) \ - $(PKG_BUILD_DIR)/QCA9984/hw1.0/board-2.bin \ + $(DL_DIR)/$(QCA9984_BOARD_FILE_DL) \ $(1)/lib/firmware/ath10k/QCA9984/hw1.0/board-2.bin $(INSTALL_DATA) \ - $(PKG_BUILD_DIR)/QCA9984/hw1.0/3.4/firmware-5.bin_10.4-3.4-00082 \ + $(DL_DIR)/$(QCA9984_FIRMWARE_FILE_DL) \ $(1)/lib/firmware/ath10k/QCA9984/hw1.0/firmware-5.bin endef define Package/ath10k-firmware-qca9984-ct/install $(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA9984/hw1.0 + ln -s \ + ../../cal-pci-0000:01:00.0.bin \ + $(1)/lib/firmware/ath10k/QCA9984/hw1.0/board.bin $(INSTALL_DATA) \ $(PKG_BUILD_DIR)/QCA9984/hw1.0/board-2.bin \ $(1)/lib/firmware/ath10k/QCA9984/hw1.0/board-2.bin @@ -356,29 +327,13 @@ define Package/ath10k-firmware-qca9984-ct/install $(1)/lib/firmware/ath10k/QCA9984/hw1.0/firmware-5.bin endef -define Package/ath10k-firmware-qca9888-ct/install - $(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA9888/hw2.0 - ln -s \ - ../../cal-pci-0000:01:00.0.bin \ - $(1)/lib/firmware/ath10k/QCA9888/hw2.0/board.bin - $(INSTALL_DATA) \ - $(PKG_BUILD_DIR)/QCA9888/hw2.0/board-2.bin \ - $(1)/lib/firmware/ath10k/QCA9888/hw2.0/board-2.bin - $(INSTALL_DATA) \ - $(DL_DIR)/$(call CT_FIRMWARE_FILE,QCA9888) \ - $(1)/lib/firmware/ath10k/QCA9888/hw2.0/firmware-5.bin -endef - $(eval $(call BuildPackage,ath10k-firmware-qca9887)) -$(eval $(call BuildPackage,ath10k-firmware-qca9888)) $(eval $(call BuildPackage,ath10k-firmware-qca988x)) $(eval $(call BuildPackage,ath10k-firmware-qca99x0)) $(eval $(call BuildPackage,ath10k-firmware-qca6174)) $(eval $(call BuildPackage,ath10k-firmware-qca9984)) -$(eval $(call BuildPackage,ath10k-firmware-qca4019)) $(eval $(call BuildPackage,ath10k-firmware-qca9887-ct)) $(eval $(call BuildPackage,ath10k-firmware-qca988x-ct)) $(eval $(call BuildPackage,ath10k-firmware-qca99x0-ct)) $(eval $(call BuildPackage,ath10k-firmware-qca9984-ct)) -$(eval $(call BuildPackage,ath10k-firmware-qca9888-ct)) From 688513f8fcd1299cc65449a139927c43959d403b Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Sat, 4 Nov 2017 14:53:16 +0800 Subject: [PATCH 28/37] Revert "sync wireless drivers with LEDE 17.01.4 stable" This reverts commit 9cf4daca931342851711751aadb8dd877ba6d743. --- package/firmware/linux-firmware/Makefile | 6 +- package/firmware/linux-firmware/intel.mk | 295 +-- package/firmware/linux-firmware/qca.mk | 10 + package/firmware/linux-firmware/realtek.mk | 8 + package/kernel/mac80211/Makefile | 119 +- .../files/lib/netifd/wireless/mac80211.sh | 38 +- .../mac80211/patches/001-fix_build.patch | 10 +- .../patches/004-kconfig_backport_fix.patch | 2 +- .../patches/005-revert-devcoredump.patch | 143 +- .../patches/006-revert-ktime-changes.patch | 20 - .../007-revert-genetlink-changes.patch | 266 --- .../008-revert-ndo_stats64-cleanup.patch | 20 - .../patches/009-revert-mtu-changes.patch | 338 --- .../mac80211/patches/010-disable_rfkill.patch | 2 +- .../patches/011-backport_strscpy.patch | 43 - .../patches/012-kernel_build_check.patch | 11 + .../mac80211/patches/015-ipw200-mtu.patch | 34 + ...roducing-a-USB-dependency-in-the-rt2.patch | 85 - ...x00usb-do-not-anchor-rx-and-tx-urb-s.patch | 61 - ...-rt2x00usb-fix-anchor-initialization.patch | 75 - .../020-04-rt61pci-use-entry-directly.patch | 28 - ...-entry-directly-in-rt2x00_dump_frame.patch | 181 -- ...2x00-remove-queue_entry-from-skbdesc.patch | 59 - ...n-t-mark-register-accesses-as-inline.patch | 84 - ...-move-rt2800_drv_data-declaration-in.patch | 94 - ...dentify-station-based-on-status-WCID.patch | 94 - ...illing-tx-status-from-rt2x00lib_txdo.patch | 178 -- ...clearing-entry-from-rt2x00lib_txdone.patch | 88 - ...2-rt2x00-add-txdone-nomatch-function.patch | 92 - ...ixup-fill_tx_status-for-nomatch-case.patch | 54 - ...2x00-use-txdone_nomatch-on-rt2800usb.patch | 191 -- ...us-based-rate-flags-for-nomatch-case.patch | 88 - ...00-use-TXOP_BACKOFF-for-probe-frames.patch | 43 - ...0-fix-rt2x00debug_dump_frame-comment.patch | 28 - ...fix-TX_PWR_CFG_4-register-definition.patch | 37 - ...020-19-rt2x00-add-support-for-MT7620.patch | 2077 ----------------- ...0-fix-LNA-gain-assignment-for-MT7620.patch | 54 - ...CO-calibration-after-programming-ALC.patch | 34 - ...fix-mt7620-vco-calibration-registers.patch | 50 - ...2800-fix-mt7620-E2-channel-registers.patch | 41 - .../patches/060-no_local_ssb_bcma.patch | 22 +- .../patches/080-ath10k_thermal_config.patch | 2 +- .../mac80211/patches/090-remove-cred.patch | 15 - .../100-remove-cryptoapi-dependencies.patch | 166 +- .../110-mac80211_keep_keys_on_stop_ap.patch | 2 +- .../mac80211/patches/130-disable-fils.patch | 32 + .../130-mac80211-hwsim-hrtimer-clock.patch | 11 - ...aes-cmac-switch-to-shash-CMAC-driver.patch | 198 ++ .../132-mac80211-remove-cmac-dependency.patch | 10 + .../patches/150-disable_addr_notifier.patch | 10 +- .../kernel/mac80211/patches/210-ap_scan.patch | 2 +- ..._hw-issue-external-reset-for-QCA955x.patch | 51 +- ...h9k-force-rx_clear-when-disabling-rx.patch | 2 +- ...etries-for-powersave-response-frames.patch | 12 +- ...erpret-requested-txpower-in-EIRP-dom.patch | 4 +- ...0211-add-hdrlen-to-ieee80211_tx_data.patch | 30 +- ...80211-add-NEED_ALIGNED4_SKBS-hw-flag.patch | 32 +- ...l-Enable-STBC-and-LDPC-for-VHT-Rates.patch | 2 +- ...ata-bit-in-PS-buffered-frame-release.patch | 6 +- ...ntially-stale-EOSP-status-bit-in-int.patch | 2 +- ...fix-block-ack-window-tracking-issues.patch | 6 +- ...me-tx_complete_work-to-hw_check_work.patch | 175 -- ...ix-channel-maximum-power-level-test.patch} | 0 ...power-reduction-for-US-regulatory-do.patch | 24 + ...-check-if-the-chip-failed-to-wake-up.patch | 30 - ...ata-flag-for-buffered-multicast-pack.patch | 41 + ...condition-in-enabling-disabling-IRQs.patch | 197 -- ...sable-wake_tx_queue-for-older-device.patch | 27 + ...rcmf_bus_get_memdump-result-for-erro.patch | 52 - ...re-verbose-when-PSM-s-watchdog-fires.patch | 38 - ...hy_read_of_freq_limits-to-respect-li.patch | 44 - ...-merge-two-brcmf_err-macros-into-one.patch | 43 - ...to-C-function-__brcmf_err-for-printi.patch | 69 - ...merge-two-remaining-brcmf_err-macros.patch | 46 - ...lean-up-and-fix-ath_tx_count_airtime.patch | 107 - .../321-mac80211-fix-CSA-in-IBSS-mode.patch | 34 - ...andle-filtered-frames-within-a-BA-se.patch | 28 - ...tionally-start-new-netdev-queues-wit.patch | 29 - ...gth-check-in-brcmf_cfg80211_escan_ha.patch | 63 - ...e-constant-time-comparison-with-keys.patch | 33 + ...compare-TKIP-TX-MIC-key-in-reinstall.patch | 73 + .../patches/402-ath_regd_optional.patch | 18 +- .../patches/404-regd_no_assoc_hints.patch | 4 +- .../patches/406-ath_relax_default_regd.patch | 2 +- .../440-ath5k_channel_bw_debugfs.patch | 2 +- .../patches/500-ath9k_eeprom_debugfs.patch | 4 +- .../mac80211/patches/501-ath9k_ahb_init.patch | 2 +- .../patches/512-ath9k_channelbw_debugfs.patch | 10 +- .../patches/513-ath9k_add_pci_ids.patch | 2 +- .../522-mac80211_configure_antenna_gain.patch | 38 +- .../patches/530-ath9k_extra_leds.patch | 18 +- .../531-ath9k_extra_platform_leds.patch | 21 +- .../patches/542-ath9k_debugfs_diag.patch | 10 +- .../patches/543-ath9k_entropy_from_adc.patch | 10 +- .../patches/546-ath9k_platform_led_name.patch | 39 - .../patches/548-ath9k_enable_gpio_chip.patch | 33 +- .../549-ath9k_enable_gpio_buttons.patch | 23 +- .../patches/551-ath9k_ubnt_uap_plus_hsr.patch | 8 +- ...-rt2800lib-enable-support-for-RT3883.patch | 2 +- ...x00-rt2800lib-add-rf_vals-for-RF3853.patch | 6 +- ...ib-enable-VCO-calibration-for-RF3853.patch | 4 +- ...-add-channel-configuration-function-.patch | 22 +- ...2x00-rt2800lib-enable-RF3853-support.patch | 2 +- ...-add-MAC-register-initialization-for.patch | 6 +- ...-add-BBP-register-initialization-for.patch | 4 +- ...-add-RFCSR-initialization-for-RT3883.patch | 16 +- ...-use-the-extended-EEPROM-map-for-RT3.patch | 2 +- ...ib-force-rf-type-to-RF3853-on-RT3883.patch | 4 +- ...-add-channel-configuration-code-for-.patch | 12 +- ...-fix-txpower_to_dev-function-for-RT3.patch | 2 +- ...-use-correct-txpower-calculation-fun.patch | 2 +- ...-hardcode-txmixer-gain-values-to-zer.patch | 8 +- ...b-use-correct-RT-XWI-size-for-RT3883.patch | 2 +- ...-fix-antenna-configuration-for-RT388.patch | 2 +- ...-fix-LNA-gain-configuration-for-RT38.patch | 10 +- ...0-rt2800lib-fix-VGC-setup-for-RT3883.patch | 6 +- ...-fix-EEPROM-LNA-validation-for-RT388.patch | 12 +- ...-fix-txpower-compensation-for-RT3883.patch | 2 +- ...o-add-a-workaround-for-spurious-TX_F.patch | 14 +- .../602-rt2x00-introduce-rt2x00eeprom.patch | 16 +- ...isabling_bands_through_platform_data.patch | 2 +- ...07-rt2x00-add_platform_data_mac_addr.patch | 2 +- ...00-allow_disabling_bands_through_dts.patch | 2 +- ...0-rt2x00-change-led-polarity-from-OF.patch | 2 +- .../611-rt2x00-add-AP+STA-support.patch | 2 +- ...dd-support-for-external-PA-on-MT7620.patch | 118 + .../651-rt2x00-remove-unneccesary-code.patch | 132 ++ ...nitial-code-to-detect-8188eu-devices.patch | 2 +- ...not-set-auto-rate-fallback-on-8188eu.patch | 2 +- ...xu-Add-rtl8188etv-to-USB-device-list.patch | 2 +- ...dd-sitecom-dongle-to-USB-device-list.patch | 2 +- ...8188eu-USB-ID-for-D-Link-USB-GO-N150.patch | 2 +- .../801-libertas-configure-sysfs-links.patch | 6 +- .../802-libertas-set-wireless-macaddr.patch | 2 +- .../810-b43-gpio-mask-module-option.patch | 6 +- .../mac80211/patches/811-b43_no_pio.patch | 2 +- .../patches/812-b43-add-antenna-control.patch | 18 +- .../814-b43-only-use-gpio-0-1-for-led.patch | 2 +- ...815-b43-always-take-overlapping-devs.patch | 2 +- ...-register-wiphy-s-during-module_init.patch | 27 +- ...und-bug-with-some-inconsistent-BSSes.patch | 4 +- ...62-brcmfmac-Disable-power-management.patch | 2 +- ...21-ath10k_init_devices_synchronously.patch | 2 +- .../930-ath10k_add_tpt_led_trigger.patch | 8 +- .../936-ath10k-fix-otp-failure-result.patch | 11 + .../patches/936-ath10k_skip_otp_check.patch | 51 - ...940-mwl8k_init_devices_synchronously.patch | 4 +- ...0-0010-ath10k-limit-htt-rx-ring-size.patch | 11 + ...60-0011-ath10k-limit-pci-buffer-size.patch | 38 + .../files/include/linux/ath9k_platform.h | 1 - 150 files changed, 1477 insertions(+), 6341 deletions(-) delete mode 100644 package/kernel/mac80211/patches/006-revert-ktime-changes.patch delete mode 100644 package/kernel/mac80211/patches/007-revert-genetlink-changes.patch delete mode 100644 package/kernel/mac80211/patches/008-revert-ndo_stats64-cleanup.patch delete mode 100644 package/kernel/mac80211/patches/009-revert-mtu-changes.patch delete mode 100644 package/kernel/mac80211/patches/011-backport_strscpy.patch create mode 100644 package/kernel/mac80211/patches/012-kernel_build_check.patch create mode 100644 package/kernel/mac80211/patches/015-ipw200-mtu.patch delete mode 100644 package/kernel/mac80211/patches/020-01-rt2x00-avoid-introducing-a-USB-dependency-in-the-rt2.patch delete mode 100644 package/kernel/mac80211/patches/020-02-rt2x00usb-do-not-anchor-rx-and-tx-urb-s.patch delete mode 100644 package/kernel/mac80211/patches/020-03-rt2x00usb-fix-anchor-initialization.patch delete mode 100644 package/kernel/mac80211/patches/020-04-rt61pci-use-entry-directly.patch delete mode 100644 package/kernel/mac80211/patches/020-05-rt2x00-call-entry-directly-in-rt2x00_dump_frame.patch delete mode 100644 package/kernel/mac80211/patches/020-06-rt2x00-remove-queue_entry-from-skbdesc.patch delete mode 100644 package/kernel/mac80211/patches/020-07-rt2500usb-don-t-mark-register-accesses-as-inline.patch delete mode 100644 package/kernel/mac80211/patches/020-08-rt2x00-rt2800lib-move-rt2800_drv_data-declaration-in.patch delete mode 100644 package/kernel/mac80211/patches/020-09-rt2800-identify-station-based-on-status-WCID.patch delete mode 100644 package/kernel/mac80211/patches/020-10-rt2x00-separte-filling-tx-status-from-rt2x00lib_txdo.patch delete mode 100644 package/kernel/mac80211/patches/020-11-rt2x00-separte-clearing-entry-from-rt2x00lib_txdone.patch delete mode 100644 package/kernel/mac80211/patches/020-12-rt2x00-add-txdone-nomatch-function.patch delete mode 100644 package/kernel/mac80211/patches/020-13-rt2x00-fixup-fill_tx_status-for-nomatch-case.patch delete mode 100644 package/kernel/mac80211/patches/020-14-rt2x00-use-txdone_nomatch-on-rt2800usb.patch delete mode 100644 package/kernel/mac80211/patches/020-15-rt2800-status-based-rate-flags-for-nomatch-case.patch delete mode 100644 package/kernel/mac80211/patches/020-16-rt2800-use-TXOP_BACKOFF-for-probe-frames.patch delete mode 100644 package/kernel/mac80211/patches/020-17-rt2x00-fix-rt2x00debug_dump_frame-comment.patch delete mode 100644 package/kernel/mac80211/patches/020-18-rt2x00-fix-TX_PWR_CFG_4-register-definition.patch delete mode 100644 package/kernel/mac80211/patches/020-19-rt2x00-add-support-for-MT7620.patch delete mode 100644 package/kernel/mac80211/patches/021-01-rt2800-fix-LNA-gain-assignment-for-MT7620.patch delete mode 100644 package/kernel/mac80211/patches/021-02-rt2800-do-VCO-calibration-after-programming-ALC.patch delete mode 100644 package/kernel/mac80211/patches/021-03-rt2800-fix-mt7620-vco-calibration-registers.patch delete mode 100644 package/kernel/mac80211/patches/021-04-rt2800-fix-mt7620-E2-channel-registers.patch delete mode 100644 package/kernel/mac80211/patches/090-remove-cred.patch create mode 100644 package/kernel/mac80211/patches/130-disable-fils.patch delete mode 100644 package/kernel/mac80211/patches/130-mac80211-hwsim-hrtimer-clock.patch create mode 100644 package/kernel/mac80211/patches/131-Revert-mac80211-aes-cmac-switch-to-shash-CMAC-driver.patch create mode 100644 package/kernel/mac80211/patches/132-mac80211-remove-cmac-dependency.patch delete mode 100644 package/kernel/mac80211/patches/314-ath9k-rename-tx_complete_work-to-hw_check_work.patch rename package/kernel/mac80211/patches/{324-ath9k_hw-fix-channel-maximum-power-level-test.patch => 314-ath9k_hw-fix-channel-maximum-power-level-test.patch} (100%) create mode 100644 package/kernel/mac80211/patches/315-ath9k-adjust-tx-power-reduction-for-US-regulatory-do.patch delete mode 100644 package/kernel/mac80211/patches/315-ath9k_hw-check-if-the-chip-failed-to-wake-up.patch create mode 100644 package/kernel/mac80211/patches/316-ath9k-fix-more-data-flag-for-buffered-multicast-pack.patch delete mode 100644 package/kernel/mac80211/patches/316-ath9k-fix-race-condition-in-enabling-disabling-IRQs.patch create mode 100644 package/kernel/mac80211/patches/317-Revert-ath10k-disable-wake_tx_queue-for-older-device.patch delete mode 100644 package/kernel/mac80211/patches/318-0001-brcmfmac-check-brcmf_bus_get_memdump-result-for-erro.patch delete mode 100644 package/kernel/mac80211/patches/319-0002-brcmfmac-be-more-verbose-when-PSM-s-watchdog-fires.patch delete mode 100644 package/kernel/mac80211/patches/319-0003-brcmfmac-use-wiphy_read_of_freq_limits-to-respect-li.patch delete mode 100644 package/kernel/mac80211/patches/319-0004-brcmfmac-merge-two-brcmf_err-macros-into-one.patch delete mode 100644 package/kernel/mac80211/patches/319-0005-brcmfmac-switch-to-C-function-__brcmf_err-for-printi.patch delete mode 100644 package/kernel/mac80211/patches/319-0006-brcmfmac-merge-two-remaining-brcmf_err-macros.patch delete mode 100644 package/kernel/mac80211/patches/320-ath9k-clean-up-and-fix-ath_tx_count_airtime.patch delete mode 100644 package/kernel/mac80211/patches/321-mac80211-fix-CSA-in-IBSS-mode.patch delete mode 100644 package/kernel/mac80211/patches/322-mac80211-don-t-handle-filtered-frames-within-a-BA-se.patch delete mode 100644 package/kernel/mac80211/patches/325-mac80211-unconditionally-start-new-netdev-queues-wit.patch delete mode 100644 package/kernel/mac80211/patches/326-brcmfmac-add-length-check-in-brcmf_cfg80211_escan_ha.patch create mode 100644 package/kernel/mac80211/patches/328-mac80211-use-constant-time-comparison-with-keys.patch create mode 100644 package/kernel/mac80211/patches/329-mac80211-don-t-compare-TKIP-TX-MIC-key-in-reinstall.patch delete mode 100644 package/kernel/mac80211/patches/546-ath9k_platform_led_name.patch create mode 100644 package/kernel/mac80211/patches/650-rt2x00-add-support-for-external-PA-on-MT7620.patch create mode 100644 package/kernel/mac80211/patches/651-rt2x00-remove-unneccesary-code.patch create mode 100644 package/kernel/mac80211/patches/936-ath10k-fix-otp-failure-result.patch delete mode 100644 package/kernel/mac80211/patches/936-ath10k_skip_otp_check.patch create mode 100644 package/kernel/mac80211/patches/960-0010-ath10k-limit-htt-rx-ring-size.patch create mode 100644 package/kernel/mac80211/patches/960-0011-ath10k-limit-pci-buffer-size.patch diff --git a/package/firmware/linux-firmware/Makefile b/package/firmware/linux-firmware/Makefile index fc7ef5b12d..e42874af76 100644 --- a/package/firmware/linux-firmware/Makefile +++ b/package/firmware/linux-firmware/Makefile @@ -12,9 +12,9 @@ PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git -PKG_SOURCE_DATE:=2016-09-21 -PKG_SOURCE_VERSION:=42ad5367dd38371b2a1bb263b6efa85f9b92fc93 -PKG_MIRROR_HASH:=d77e7e2e7cb655870a78c2650d90ed994b053b0c3b75abf8c62c94dc2ce82e77 +PKG_SOURCE_DATE:=2017-09-06 +PKG_SOURCE_VERSION:=a61ac5cf8374edbfe692d12f805a1b194f7fead2 +PKG_MIRROR_HASH:=b827bf760de57b907df159c8d38d7c3fb5b4a691781114c47739e20bffb3a312 PKG_MAINTAINER:=Felix Fietkau diff --git a/package/firmware/linux-firmware/intel.mk b/package/firmware/linux-firmware/intel.mk index f5adfaf86c..0330335bfb 100644 --- a/package/firmware/linux-firmware/intel.mk +++ b/package/firmware/linux-firmware/intel.mk @@ -21,172 +21,135 @@ define Package/iwl4965-firmware/install endef $(eval $(call BuildPackage,iwl4965-firmware)) -Package/iwlwifi-firmware = $(call Package/firmware-default,Intel wireless firmware) -define Package/iwlwifi-firmware/config - if PACKAGE_iwlwifi-firmware - config IWL100_FW - bool "Intel 100 Firmware" - default y - help - Download and install firmware for: - Intel Centrino Wireless-N 100 - - config IWL1000_FW - bool "Intel 1000 Firmware" - default y - help - Download and install firmware for: - Intel Centrino Wireless-N 1000 - - config IWL105_FW - bool "Intel 105 Firmware" - default y - help - Download and install firmware for: - Intel Centrino Wireless-N 105 - - config IWL135_FW - bool "Intel 135 Firmware" - default y - help - Download and install firmware for: - Intel Centrino Wireless-N 135 - - config IWL2000_FW - bool "Intel 2000 Firmware" - default y - help - Download and install firmware for: - Intel Centrino Wireless-N 2200 - - config IWL2030_FW - bool "Intel 2030 Firmware" - default y - help - Download and install firmware for: - Intel Centrino Wireless-N 2230 - - config IWL3160_FW - bool "Intel 3160 Firmware" - default y - help - Download and install firmware for: - Intel Wireless WiFi 3160 - - config IWL5000_FW - bool "Intel 5000 Firmware" - default y - help - Download and install firmware for: - Intel Wireless WiFi 5100AGN, 5300AGN, and 5350AGN - - config IWL5150_FW - bool "Intel 5150 Firmware" - default y - help - Download and install firmware for: - Intel Wireless WiFi 5150AGN - - config IWL6000_FW - bool "Intel 6000 Firmware" - default y - help - Download and install firmware for: - Intel Centrino Ultimate-N 6300 and Advanced-N 6200 - - config IWL6005_FW - bool "Intel 6005 Firmware" - default y - help - Download and install firmware for: - Intel Centrino Advanced-N 6205 - - config IWL6030_FW - bool "Intel 6030 Firmware" - default y - help - Download and install firmware for: - Intel Centrino Advanced-N 6230, Wireless-N 1030, Wireless-N 130 and Advanced-N 6235 - - config IWL6050_FW - bool "Intel 6050 Firmware" - default y - help - Download and install firmware for: - Intel Centrino Advanced-N + WiMAX 6250 and Wireless-N + WiMAX 6150 - - config IWL7260_FW - bool "Intel 7260 Firmware" - default y - help - Download and install firmware for: - Intel Dual Band Wireless-N 7260 and Intel Dual Band Wireless-AC 7260 - - config IWL7265_FW - bool "Intel 7265 Firmware" - default y - help - Download and install firmware for: - Intel Wireless 7265, 7265D, 3165 - - config IWL8000_FW - bool "Intel 8000 Series Firmware" - default y - help - Download and install firmware for: - Intel Wireless Series 8260, 4165 - endif -endef -define Package/iwlwifi-firmware/install +Package/iwlwifi-firmware-iwl100 = $(call Package/firmware-default,Intel Centrino Wireless-N 100 firmware) +define Package/iwlwifi-firmware-iwl100/install $(INSTALL_DIR) $(1)/lib/firmware -ifneq ($(CONFIG_IWL100_FW),) $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-100-5.ucode $(1)/lib/firmware -endif -ifneq ($(CONFIG_IWL1000_FW),) - $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-1000-5.ucode $(1)/lib/firmware -endif -ifneq ($(CONFIG_IWL105_FW),) - $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-105-6.ucode $(1)/lib/firmware -endif -ifneq ($(CONFIG_IWL135_FW),) - $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-135-6.ucode $(1)/lib/firmware -endif -ifneq ($(CONFIG_IWL2000_FW),) - $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-2000-6.ucode $(1)/lib/firmware -endif -ifneq ($(CONFIG_IWL2030_FW),) - $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-2030-6.ucode $(1)/lib/firmware -endif -ifneq ($(CONFIG_IWL3160_FW),) - $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-3160-16.ucode $(1)/lib/firmware -endif -ifneq ($(CONFIG_IWL5000_FW),) - $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-5000-5.ucode $(1)/lib/firmware -endif -ifneq ($(CONFIG_IWL5150_FW),) - $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-5150-2.ucode $(1)/lib/firmware -endif -ifneq ($(CONFIG_IWL6000_FW),) - $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-6000-4.ucode $(1)/lib/firmware -endif -ifneq ($(CONFIG_IWL6005_FW),) - $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-6000g2a-6.ucode $(1)/lib/firmware -endif -ifneq ($(CONFIG_IWL6030_FW),) - $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-6000g2b-6.ucode $(1)/lib/firmware -endif -ifneq ($(CONFIG_IWL6050_FW),) - $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-6050-5.ucode $(1)/lib/firmware -endif -ifneq ($(CONFIG_IWL7260_FW),) - $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-7260-16.ucode $(1)/lib/firmware -endif -ifneq ($(CONFIG_IWL7265_FW),) - $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-7265-16.ucode $(1)/lib/firmware - $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-7265D-16.ucode $(1)/lib/firmware -endif -ifneq ($(CONFIG_IWL8000_FW),) - $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-8000C-16.ucode $(1)/lib/firmware -endif endef -$(eval $(call BuildPackage,iwlwifi-firmware)) +$(eval $(call BuildPackage,iwlwifi-firmware-iwl100)) + +Package/iwlwifi-firmware-iwl1000 = $(call Package/firmware-default,Intel Centrino Wireless-N 1000 firmware) +define Package/iwlwifi-firmware-iwl1000/install + $(INSTALL_DIR) $(1)/lib/firmware + $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-1000-5.ucode $(1)/lib/firmware +endef +$(eval $(call BuildPackage,iwlwifi-firmware-iwl1000)) + +Package/iwlwifi-firmware-iwl105 = $(call Package/firmware-default,Intel Centrino Wireless-N 105 firmware) +define Package/iwlwifi-firmware-iwl105/install + $(INSTALL_DIR) $(1)/lib/firmware + $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-105-6.ucode $(1)/lib/firmware +endef +$(eval $(call BuildPackage,iwlwifi-firmware-iwl105)) + +Package/iwlwifi-firmware-iwl135 = $(call Package/firmware-default,Intel Centrino Wireless-N 135 firmware) +define Package/iwlwifi-firmware-iwl135/install + $(INSTALL_DIR) $(1)/lib/firmware + $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-135-6.ucode $(1)/lib/firmware +endef +$(eval $(call BuildPackage,iwlwifi-firmware-iwl135)) + +Package/iwlwifi-firmware-iwl2000 = $(call Package/firmware-default,Intel Centrino Wireless-N 2200 firmware) +define Package/iwlwifi-firmware-iwl2000/install + $(INSTALL_DIR) $(1)/lib/firmware + $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-2000-6.ucode $(1)/lib/firmware +endef +$(eval $(call BuildPackage,iwlwifi-firmware-iwl2000)) + +Package/iwlwifi-firmware-iwl2030 = $(call Package/firmware-default,Intel Centrino Wireless-N 2230 firmware) +define Package/iwlwifi-firmware-iwl2030/install + $(INSTALL_DIR) $(1)/lib/firmware + $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-2030-6.ucode $(1)/lib/firmware +endef +$(eval $(call BuildPackage,iwlwifi-firmware-iwl2030)) + +Package/iwlwifi-firmware-iwl3160 = $(call Package/firmware-default,Intel Wireless 3160 firmware) +define Package/iwlwifi-firmware-iwl3160/install + $(INSTALL_DIR) $(1)/lib/firmware + $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-3160-17.ucode $(1)/lib/firmware +endef +$(eval $(call BuildPackage,iwlwifi-firmware-iwl3160)) + +Package/iwlwifi-firmware-iwl3168 = $(call Package/firmware-default,Intel Wireless 3168 firmware) +define Package/iwlwifi-firmware-iwl3168/install + $(INSTALL_DIR) $(1)/lib/firmware + $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-3168-27.ucode $(1)/lib/firmware +endef +$(eval $(call BuildPackage,iwlwifi-firmware-iwl3168)) + +Package/iwlwifi-firmware-iwl5000 = $(call Package/firmware-default,Intel Wireless 5100AGN 5300AGN and 5350AGN firmware) +define Package/iwlwifi-firmware-iwl5000/install + $(INSTALL_DIR) $(1)/lib/firmware + $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-5000-5.ucode $(1)/lib/firmware +endef +$(eval $(call BuildPackage,iwlwifi-firmware-iwl5000)) + +Package/iwlwifi-firmware-iwl5150 = $(call Package/firmware-default,Intel Wireless Wi-Fi 5150AGN firmware) +define Package/iwlwifi-firmware-iwl5150/install + $(INSTALL_DIR) $(1)/lib/firmware + $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-5150-2.ucode $(1)/lib/firmware +endef +$(eval $(call BuildPackage,iwlwifi-firmware-iwl5150)) + +Package/iwlwifi-firmware-iwl6000g2 = $(call Package/firmware-default,Intel Centrino 6300 and 6200 firmware) +define Package/iwlwifi-firmware-iwl6000g2/install + $(INSTALL_DIR) $(1)/lib/firmware + $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-6000-4.ucode $(1)/lib/firmware +endef +$(eval $(call BuildPackage,iwlwifi-firmware-iwl6000g2)) + +Package/iwlwifi-firmware-iwl6000g2a = $(call Package/firmware-default,Intel Centrino 6205 firmware) +define Package/iwlwifi-firmware-iwl6000g2a/install + $(INSTALL_DIR) $(1)/lib/firmware + $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-6000g2a-6.ucode $(1)/lib/firmware +endef +$(eval $(call BuildPackage,iwlwifi-firmware-iwl6000g2a)) + +Package/iwlwifi-firmware-iwl6000g2b = $(call Package/firmware-default,Intel Centrino 6230 1030 130 and 6235 firmware) +define Package/iwlwifi-firmware-iwl6000g2b/install + $(INSTALL_DIR) $(1)/lib/firmware + $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-6000g2b-6.ucode $(1)/lib/firmware +endef +$(eval $(call BuildPackage,iwlwifi-firmware-iwl6000g2b)) + +Package/iwlwifi-firmware-iwl6050 = $(call Package/firmware-default,Intel Centrino 6150 and 6250 firmware) +define Package/iwlwifi-firmware-iwl6050/install + $(INSTALL_DIR) $(1)/lib/firmware + $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-6050-5.ucode $(1)/lib/firmware +endef +$(eval $(call BuildPackage,iwlwifi-firmware-iwl6050)) + +Package/iwlwifi-firmware-iwl7260 = $(call Package/firmware-default,Intel Wireless 7260 firmware) +define Package/iwlwifi-firmware-iwl7260/install + $(INSTALL_DIR) $(1)/lib/firmware + $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-7260-17.ucode $(1)/lib/firmware +endef +$(eval $(call BuildPackage,iwlwifi-firmware-iwl7260)) + +Package/iwlwifi-firmware-iwl7265 = $(call Package/firmware-default,Intel Wireless 7265 firmware) +define Package/iwlwifi-firmware-iwl7265/install + $(INSTALL_DIR) $(1)/lib/firmware + $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-7265-17.ucode $(1)/lib/firmware +endef +$(eval $(call BuildPackage,iwlwifi-firmware-iwl7265)) + +Package/iwlwifi-firmware-iwl7265d = $(call Package/firmware-default,Intel Wireless 7265D and 3165 firmware) +define Package/iwlwifi-firmware-iwl7265d/install + $(INSTALL_DIR) $(1)/lib/firmware + $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-7265D-27.ucode $(1)/lib/firmware +endef +$(eval $(call BuildPackage,iwlwifi-firmware-iwl7265d)) + +Package/iwlwifi-firmware-iwl8260c = $(call Package/firmware-default,Intel Wireless 8260 and 4165 firmware) +define Package/iwlwifi-firmware-iwl8260c/install + $(INSTALL_DIR) $(1)/lib/firmware + $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-8000C-27.ucode $(1)/lib/firmware +endef +$(eval $(call BuildPackage,iwlwifi-firmware-iwl8260c)) + +Package/iwlwifi-firmware-iwl8265 = $(call Package/firmware-default,Intel Wireless 8265 firmware) +define Package/iwlwifi-firmware-iwl8265/install + $(INSTALL_DIR) $(1)/lib/firmware + $(INSTALL_DATA) $(PKG_BUILD_DIR)/iwlwifi-8265-27.ucode $(1)/lib/firmware +endef +$(eval $(call BuildPackage,iwlwifi-firmware-iwl8265)) diff --git a/package/firmware/linux-firmware/qca.mk b/package/firmware/linux-firmware/qca.mk index 7ad27ef388..0a809d1a21 100644 --- a/package/firmware/linux-firmware/qca.mk +++ b/package/firmware/linux-firmware/qca.mk @@ -7,6 +7,16 @@ define Package/ar3k-firmware/install endef $(eval $(call BuildPackage,ar3k-firmware)) + +Package/ath6k-firmware = $(call Package/firmware-default,AR600X firmware) +define Package/ath6k-firmware/install + $(INSTALL_DIR) $(1)/lib/firmware/ath6k + $(CP) \ + $(PKG_BUILD_DIR)/ath6k/* \ + $(1)/lib/firmware/ath6k +endef +$(eval $(call BuildPackage,ath6k-firmware)) + Package/ath9k-htc-firmware = $(call Package/firmware-default,AR9271/AR7010 firmware) define Package/ath9k-htc-firmware/install $(INSTALL_DIR) $(1)/lib/firmware/ath9k_htc diff --git a/package/firmware/linux-firmware/realtek.mk b/package/firmware/linux-firmware/realtek.mk index 8c3770eeea..fdd92c9a42 100644 --- a/package/firmware/linux-firmware/realtek.mk +++ b/package/firmware/linux-firmware/realtek.mk @@ -55,3 +55,11 @@ define Package/rtl8192su-firmware/install $(INSTALL_DATA) $(PKG_BUILD_DIR)/rtlwifi/rtl8712u.bin $(1)/lib/firmware/rtlwifi endef $(eval $(call BuildPackage,rtl8192su-firmware)) + +Package/rtl8821ae-firmware = $(call Package/firmware-default,RealTek RTL8821AE firmware) +define Package/rtl8821ae-firmware/install + $(INSTALL_DIR) $(1)/lib/firmware/rtlwifi + $(INSTALL_DATA) $(PKG_BUILD_DIR)/rtlwifi/rtl8821aefw.bin $(1)/lib/firmware/rtlwifi + $(INSTALL_DATA) $(PKG_BUILD_DIR)/rtlwifi/rtl8821aefw_wowlan.bin $(1)/lib/firmware/rtlwifi +endef +$(eval $(call BuildPackage,rtl8821ae-firmware)) diff --git a/package/kernel/mac80211/Makefile b/package/kernel/mac80211/Makefile index 3a96472b88..7e9b5ad618 100644 --- a/package/kernel/mac80211/Makefile +++ b/package/kernel/mac80211/Makefile @@ -10,14 +10,13 @@ include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=mac80211 -PKG_VERSION:=2017-01-31 -PKG_RELEASE:=3 +PKG_VERSION:=2017-10-06 +PKG_RELEASE:=1 PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources -PKG_BACKPORT_VERSION:= -PKG_HASH:=75e6d39e34cf156212a2509172a4a62b673b69eb4a1d9aaa565f7fa719fa2317 +PKG_HASH:=194786b7635f36b9ce280fd2319f6a4feeff209175e330ddbcbe789a3b4540a5 -PKG_SOURCE:=compat-wireless-$(PKG_VERSION)$(PKG_BACKPORT_VERSION).tar.xz -PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION) +PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz +PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/backports-$(PKG_VERSION) PKG_BUILD_PARALLEL:=1 PKG_MAINTAINER:=Felix Fietkau @@ -25,7 +24,7 @@ PKG_MAINTAINER:=Felix Fietkau PKG_DRIVERS = \ adm8211 \ airo \ - ath ath5k ath9k ath9k-common ath9k-htc ath10k \ + ath ath5k ath6kl ath6kl-sdio ath6kl-usb ath9k ath9k-common ath9k-htc ath10k \ b43 b43legacy \ carl9170 \ hermes hermes-pci hermes-pcmcia hermes-plx\ @@ -42,8 +41,8 @@ PKG_DRIVERS = \ rt2800-lib rt2800-mmio rt2800-pci rt2800-soc rt2800-usb \ rt61-pci rt73-usb \ rtl8180 rtl8187 \ - rtlwifi rtlwifi-pci rtlwifi-usb rtl8192c-common rtl8192ce rtl8192se \ - rtl8192de rtl8192cu \ + rtlwifi rtlwifi-pci rtlwifi-btcoexist rtlwifi-usb rtl8192c-common \ + rtl8192ce rtl8192se rtl8192de rtl8192cu rtl8821ae \ rtl8xxxu \ wlcore wl12xx wl18xx \ zd1211rw @@ -101,6 +100,7 @@ endef define KernelPackage/mac80211 $(call KernelPackage/mac80211/Default) TITLE:=Linux 802.11 Wireless Networking Stack + # +kmod-crypto-cmac is a runtime only dependency of net/mac80211/aes_cmac.c DEPENDS+= +kmod-cfg80211 +hostapd-common KCONFIG:=\ CONFIG_AVERAGE=y @@ -217,6 +217,43 @@ define KernelPackage/ath5k/description Atheros 5xxx chipset. endef +define KernelPackage/ath6kl + $(call KernelPackage/mac80211/Default) + TITLE:=Atheros FullMAC wireless devices (common code for ath6kl_sdio and ath6kl_usb) + URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath6kl + HIDDEN:=1 + DEPENDS+= +kmod-ath +@DRIVER_11N_SUPPORT +@KERNEL_RELAY + FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath6kl/ath6kl_core.ko +endef + +define KernelPackage/ath6kl-sdio + $(call KernelPackage/mac80211/Default) + TITLE:=Atheros 802.11n SDIO wireless cards support + URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath6kl + DEPENDS+= +kmod-mmc +kmod-ath6kl + FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath6kl/ath6kl_sdio.ko + AUTOLOAD:=$(call AutoProbe,ath6kl_sdio) +endef + +define KernelPackage/ath6kl-sdio/description +This module adds support for wireless adapters based on +Atheros IEEE 802.11n AR6003 and AR6004 family of chipsets. +endef + +define KernelPackage/ath6kl-usb + $(call KernelPackage/mac80211/Default) + TITLE:=Atheros 802.11n USB wireless cards support + URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath6kl + DEPENDS+= @USB_SUPPORT +kmod-usb-core +kmod-ath6kl + FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath6kl/ath6kl_usb.ko + AUTOLOAD:=$(call AutoProbe,ath6kl_usb) +endef + +define KernelPackage/ath6kl-usb/description +This module adds support for wireless adapters based on the +Atheros IEEE 802.11n AR6004 chipset. +endef + define KernelPackage/ath9k-common $(call KernelPackage/mac80211/Default) TITLE:=Atheros 802.11n wireless devices (common code for ath9k and ath9k_htc) @@ -278,7 +315,7 @@ endef define KernelPackage/ath10k $(call KernelPackage/mac80211/Default) TITLE:=Atheros 802.11ac wireless cards support - URL:=https://wireless.wiki.kernel.org/en/users/Drivers/ath10k + URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath10k DEPENDS+= @PCI_SUPPORT +kmod-ath +@DRIVER_11N_SUPPORT +@DRIVER_11AC_SUPPORT +@DRIVER_11W_SUPPORT +@KERNEL_RELAY FILES:= \ $(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath10k/ath10k_core.ko \ @@ -689,7 +726,7 @@ define KernelPackage/brcmfmac TITLE:=Broadcom IEEE802.11n USB FullMAC WLAN driver URL:=https://wireless.wiki.kernel.org/en/users/drivers/brcm80211 DEPENDS+= @USB_SUPPORT +kmod-cfg80211 +@DRIVER_11N_SUPPORT +@DRIVER_11AC_SUPPORT +kmod-brcmutil \ - +BRCMFMAC_SDIO:kmod-mmc \ + +BRCMFMAC_SDIO:kmod-mmc @!TARGET_uml \ +BRCMFMAC_USB:kmod-usb-core +BRCMFMAC_USB:brcmfmac-firmware-usb FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko AUTOLOAD:=$(call AutoProbe,brcmfmac) @@ -793,7 +830,7 @@ endef define KernelPackage/iwlwifi $(call KernelPackage/mac80211/Default) - DEPENDS:= +kmod-mac80211 @PCI_SUPPORT +@DRIVER_11N_SUPPORT +iwlwifi-firmware @!LINUX_3_18 + DEPENDS:= +kmod-mac80211 @PCI_SUPPORT +@DRIVER_11N_SUPPORT +@DRIVER_11AC_SUPPORT @!LINUX_3_18 TITLE:=Intel AGN Wireless support FILES:= \ $(PKG_BUILD_DIR)/drivers/net/wireless/intel/iwlwifi/iwlwifi.ko \ @@ -929,7 +966,7 @@ endef define KernelPackage/libipw $(call KernelPackage/mac80211/Default) TITLE:=libipw for ipw2100 and ipw2200 - DEPENDS:=@PCI_SUPPORT +kmod-crypto-michael-mic +kmod-lib80211 +kmod-cfg80211 +@DRIVER_WEXT_SUPPORT @!BIG_ENDIAN + DEPENDS:=@PCI_SUPPORT +kmod-crypto-michael-mic +kmod-crypto-ecb +kmod-lib80211 +kmod-cfg80211 +@DRIVER_WEXT_SUPPORT @!BIG_ENDIAN @!LINUX_3_18 FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intel/ipw2x00/libipw.ko AUTOLOAD:=$(call AutoProbe,libipw) endef @@ -989,7 +1026,7 @@ endef define KernelPackage/libertas-usb $(call KernelPackage/mac80211/Default) - DEPENDS+= @USB_SUPPORT +kmod-cfg80211 +kmod-usb-core +kmod-lib80211 +@DRIVER_WEXT_SUPPORT +libertas-usb-firmware + DEPENDS+= @USB_SUPPORT +kmod-cfg80211 +kmod-usb-core +kmod-lib80211 +@DRIVER_WEXT_SUPPORT +libertas-usb-firmware @!LINUX_3_18 TITLE:=Marvell 88W8015 Wireless Driver FILES:= \ $(PKG_BUILD_DIR)/drivers/net/wireless/marvell/libertas/libertas.ko \ @@ -999,7 +1036,7 @@ endef define KernelPackage/libertas-sdio $(call KernelPackage/mac80211/Default) - DEPENDS+= +kmod-cfg80211 +kmod-lib80211 +kmod-mmc +@DRIVER_WEXT_SUPPORT @!TARGET_uml +libertas-sdio-firmware + DEPENDS+= +kmod-cfg80211 +kmod-lib80211 +kmod-mmc +@DRIVER_WEXT_SUPPORT @!TARGET_uml +libertas-sdio-firmware @!LINUX_3_18 TITLE:=Marvell 88W8686 Wireless Driver FILES:= \ $(PKG_BUILD_DIR)/drivers/net/wireless/marvell/libertas/libertas.ko \ @@ -1010,7 +1047,7 @@ endef define KernelPackage/libertas-spi $(call KernelPackage/mac80211/Default) SUBMENU:=Wireless Drivers - DEPENDS+= +kmod-cfg80211 +kmod-lib80211 +@DRIVER_WEXT_SUPPORT @!TARGET_uml +libertas-spi-firmware + DEPENDS+= +kmod-cfg80211 +kmod-lib80211 +@DRIVER_WEXT_SUPPORT @!TARGET_uml +libertas-spi-firmware @!LINUX_3_18 KCONFIG := \ CONFIG_SPI=y \ CONFIG_SPI_MASTER=y @@ -1042,7 +1079,7 @@ endef define KernelPackage/mwl8k $(call KernelPackage/mac80211/Default) TITLE:=Driver for Marvell TOPDOG 802.11 Wireless cards - URL:=http://wireless.kernel.org/en/users/Drivers/mwl8k + URL:=https://wireless.wiki.kernel.org/en/users/drivers/mwl8k DEPENDS+= @PCI_SUPPORT +kmod-mac80211 +@DRIVER_11N_SUPPORT +mwl8k-firmware FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/marvell/mwl8k.ko AUTOLOAD:=$(call AutoProbe,mwl8k) @@ -1056,7 +1093,7 @@ endef define KernelPackage/mwifiex-pcie $(call KernelPackage/mac80211/Default) TITLE:=Driver for Marvell 802.11n/802.11ac PCIe Wireless cards - URL:=http://wireless.kernel.org/en/users/Drivers/mwifiex + URL:=https://wireless.wiki.kernel.org/en/users/drivers/mwifiex DEPENDS+= @PCI_SUPPORT +kmod-mac80211 +@DRIVER_11N_SUPPORT +@DRIVER_11AC_SUPPORT +mwifiex-pcie-firmware FILES:= \ $(PKG_BUILD_DIR)/drivers/net/wireless/marvell/mwifiex/mwifiex.ko \ @@ -1071,7 +1108,7 @@ endef define KernelPackage/mwifiex-sdio $(call KernelPackage/mac80211/Default) TITLE:=Driver for Marvell 802.11n/802.11ac SDIO Wireless cards - URL:=http://wireless.kernel.org/en/users/Drivers/mwifiex + URL:=https://wireless.wiki.kernel.org/en/users/drivers/mwifiex DEPENDS+= +kmod-mmc +kmod-mac80211 +@DRIVER_11N_SUPPORT +@DRIVER_11AC_SUPPORT +mwifiex-sdio-firmware FILES:= \ $(PKG_BUILD_DIR)/drivers/net/wireless/marvell/mwifiex/mwifiex.ko \ @@ -1268,7 +1305,7 @@ endef define KernelPackage/rtl818x/Default $(call KernelPackage/mac80211/Default) TITLE:=Realtek Drivers for RTL818x devices - URL:=http://wireless.kernel.org/en/users/Drivers/rtl8187 + URL:=https://wireless.wiki.kernel.org/en/users/drivers/rtl8187 DEPENDS+= +kmod-eeprom-93cx6 +kmod-mac80211 endef @@ -1314,6 +1351,15 @@ define KernelPackage/rtlwifi-pci HIDDEN:=1 endef +define KernelPackage/rtlwifi-btcoexist + $(call KernelPackage/mac80211/Default) + TITLE:=Realtek BT coexist support + DEPENDS+= +kmod-rtlwifi + FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtlwifi/btcoexist/btcoexist.ko + AUTOLOAD:=$(call AutoProbe,btcoexist) + HIDDEN:=1 +endef + define KernelPackage/rtlwifi-usb $(call KernelPackage/mac80211/Default) TITLE:=Realtek common driver part (USB support) @@ -1363,6 +1409,13 @@ define KernelPackage/rtl8192cu AUTOLOAD:=$(call AutoProbe,rtl8192cu) endef +define KernelPackage/rtl8821ae + $(call KernelPackage/mac80211/Default) + TITLE:=Realtek RTL8821AE support + DEPENDS+= +kmod-rtlwifi-btcoexist +kmod-rtlwifi-pci +rtl8821ae-firmware + FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/rtl8821ae.ko + AUTOLOAD:=$(call AutoProbe,rtl8821ae) +endef define KernelPackage/rtl8xxxu $(call KernelPackage/mac80211/Default) @@ -1414,7 +1467,7 @@ endef define KernelPackage/wl12xx $(call KernelPackage/mac80211/Default) TITLE:=Driver for TI WL12xx - URL:=http://wireless.kernel.org/en/users/Drivers/wl12xx + URL:=https://wireless.wiki.kernel.org/en/users/drivers/wl12xx DEPENDS+= +kmod-wlcore +wl12xx-firmware FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ti/wl12xx/wl12xx.ko AUTOLOAD:=$(call AutoProbe,wl12xx) @@ -1427,7 +1480,7 @@ endef define KernelPackage/wl18xx $(call KernelPackage/mac80211/Default) TITLE:=Driver for TI WL18xx - URL:=http://wireless.kernel.org/en/users/Drivers/wl18xx + URL:=https://wireless.wiki.kernel.org/en/users/drivers/wl18xx DEPENDS+= +kmod-wlcore +wl18xx-firmware FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ti/wl18xx/wl18xx.ko AUTOLOAD:=$(call AutoProbe,wl18xx) @@ -1497,7 +1550,8 @@ ifdef CONFIG_PACKAGE_MAC80211_DEBUGFS ATH9K_HTC_DEBUGFS \ ATH10K_DEBUGFS \ CARL9170_DEBUGFS \ - ATH5K_DEBUG + ATH5K_DEBUG \ + ATH6KL_DEBUG endif ifdef CONFIG_PACKAGE_MAC80211_TRACING @@ -1521,6 +1575,7 @@ config-$(CONFIG_PACKAGE_ATH_DFS) += ATH9K_DFS_CERTIFIED ATH10K_DFS_CERTIFIED config-$(call config_package,ath9k) += ATH9K config-$(call config_package,ath9k-common) += ATH9K_COMMON config-$(CONFIG_TARGET_ar71xx) += ATH9K_AHB +config-$(CONFIG_TARGET_ipq806x) += ATH10K_AHB config-$(CONFIG_PCI) += ATH9K_PCI config-$(CONFIG_ATH_USER_REGD) += ATH_USER_REGD config-$(CONFIG_ATH9K_SUPPORT_PCOEM) += ATH9K_PCOEM @@ -1537,6 +1592,10 @@ else config-y += ATH5K_PCI endif +config-$(call config_package,ath6kl) += ATH6KL +config-$(call config_package,ath6kl-sdio) += ATH6KL_SDIO +config-$(call config_package,ath6kl-usb) += ATH6KL_USB + config-$(call config_package,carl9170) += CARL9170 config-$(call config_package,b43) += B43 @@ -1626,12 +1685,14 @@ config-$(call config_package,zd1211rw) += ZD1211RW config-$(call config_package,rtlwifi) += RTL_CARDS RTLWIFI config-$(call config_package,rtlwifi-pci) += RTLWIFI_PCI +config-$(call config_package,rtlwifi-btcoexist) += RTLBTCOEXIST config-$(call config_package,rtlwifi-usb) += RTLWIFI_USB config-$(call config_package,rtl8192c-common) += RTL8192C_COMMON config-$(call config_package,rtl8192ce) += RTL8192CE config-$(call config_package,rtl8192se) += RTL8192SE config-$(call config_package,rtl8192de) += RTL8192DE config-$(call config_package,rtl8192cu) += RTL8192CU +config-$(call config_package,rtl8821ae) += RTL8821AE config-$(CONFIG_PACKAGE_RTLWIFI_DEBUG) += RTLWIFI_DEBUG config-$(call config_package,rtl8xxxu) += RTL8XXXU @@ -1640,8 +1701,7 @@ config-y += RTL8XXXU_UNTESTED config-$(CONFIG_LEDS_TRIGGERS) += MAC80211_LEDS B43_LEDS B43LEGACY_LEDS MAKE_OPTS:= -C "$(PKG_BUILD_DIR)" \ - CROSS_COMPILE="$(KERNEL_CROSS)" \ - ARCH="$(LINUX_KARCH)" \ + $(KERNEL_MAKE_FLAGS) \ EXTRA_CFLAGS="-I$(PKG_BUILD_DIR)/include $(IREMAP_CFLAGS)" \ KLIB_BUILD="$(LINUX_DIR)" \ MODPROBE=true \ @@ -1649,10 +1709,6 @@ MAKE_OPTS:= -C "$(PKG_BUILD_DIR)" \ KERNEL_SUBLEVEL=$(lastword $(subst ., ,$(KERNEL_PATCHVER))) \ KBUILD_LDFLAGS_MODULE_PREREQ= -ifneq ($(findstring c,$(OPENWRT_VERBOSE)),) - MAKE_OPTS += V=1 -endif - define ConfigVars $(subst $(space),,$(foreach opt,$(config-$(1)),CPTCFG_$(opt)=$(1) )) @@ -1781,6 +1837,9 @@ $(eval $(call KernelPackage,airo)) $(eval $(call KernelPackage,ath)) $(eval $(call KernelPackage,ath10k)) $(eval $(call KernelPackage,ath5k)) +$(eval $(call KernelPackage,ath6kl)) +$(eval $(call KernelPackage,ath6kl-sdio)) +$(eval $(call KernelPackage,ath6kl-usb)) $(eval $(call KernelPackage,ath9k)) $(eval $(call KernelPackage,ath9k-common)) $(eval $(call KernelPackage,ath9k-htc)) @@ -1834,12 +1893,14 @@ $(eval $(call KernelPackage,rtl8180)) $(eval $(call KernelPackage,rtl8187)) $(eval $(call KernelPackage,rtlwifi)) $(eval $(call KernelPackage,rtlwifi-pci)) +$(eval $(call KernelPackage,rtlwifi-btcoexist)) $(eval $(call KernelPackage,rtlwifi-usb)) $(eval $(call KernelPackage,rtl8192c-common)) $(eval $(call KernelPackage,rtl8192ce)) $(eval $(call KernelPackage,rtl8192se)) $(eval $(call KernelPackage,rtl8192de)) $(eval $(call KernelPackage,rtl8192cu)) +$(eval $(call KernelPackage,rtl8821ae)) $(eval $(call KernelPackage,rtl8xxxu)) $(eval $(call KernelPackage,wlcore)) $(eval $(call KernelPackage,wl12xx)) diff --git a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh index 82c374353e..ebd24df0d3 100644 --- a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh +++ b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh @@ -411,6 +411,34 @@ mac80211_check_ap() { has_ap=1 } +mac80211_iw_interface_add() { + local phy="$1" + local ifname="$2" + local type="$3" + local wdsflag="$4" + local rc + + iw phy "$phy" interface add "$ifname" type "$type" $wdsflag + rc="$?" + + [ "$rc" = 233 ] && { + # Device might have just been deleted, give the kernel some time to finish cleaning it up + sleep 1 + + iw phy "$phy" interface add "$ifname" type "$type" $wdsflag + rc="$?" + } + + [ "$rc" = 233 ] && { + # Device might not support virtual interfaces, so the interface never got deleted in the first place. + # Check if the interface already exists, and avoid failing in this case. + ip link show dev "$ifname" >/dev/null 2>/dev/null && rc=0 + } + + [ "$rc" != 0 ] && wireless_setup_failed INTERFACE_CREATION_FAILED + return $rc +} + mac80211_prepare_vif() { json_select config @@ -437,7 +465,7 @@ mac80211_prepare_vif() { # It is far easier to delete and create the desired interface case "$mode" in adhoc) - iw phy "$phy" interface add "$ifname" type adhoc + mac80211_iw_interface_add "$phy" "$ifname" adhoc || return ;; ap) # Hostapd will handle recreating the interface and @@ -451,21 +479,21 @@ mac80211_prepare_vif() { mac80211_hostapd_setup_bss "$phy" "$ifname" "$macaddr" "$type" || return [ -n "$hostapd_ctrl" ] || { - iw phy "$phy" interface add "$ifname" type __ap + mac80211_iw_interface_add "$phy" "$ifname" __ap || return hostapd_ctrl="${hostapd_ctrl:-/var/run/hostapd/$ifname}" } ;; mesh) - iw phy "$phy" interface add "$ifname" type mp + mac80211_iw_interface_add "$phy" "$ifname" mp || return ;; monitor) - iw phy "$phy" interface add "$ifname" type monitor + mac80211_iw_interface_add "$phy" "$ifname" monitor || return ;; sta) local wdsflag= staidx="$(($staidx + 1))" [ "$wds" -gt 0 ] && wdsflag="4addr on" - iw phy "$phy" interface add "$ifname" type managed $wdsflag + mac80211_iw_interface_add "$phy" "$ifname" managed "$wdsflag" || return [ "$powersave" -gt 0 ] && powersave="on" || powersave="off" iw "$ifname" set power_save "$powersave" ;; diff --git a/package/kernel/mac80211/patches/001-fix_build.patch b/package/kernel/mac80211/patches/001-fix_build.patch index 402649d2cc..9e272e90af 100644 --- a/package/kernel/mac80211/patches/001-fix_build.patch +++ b/package/kernel/mac80211/patches/001-fix_build.patch @@ -24,7 +24,7 @@ -.DEFAULT: +.SILENT: $(STAMP_KERNEL_CONFIG) +$(STAMP_KERNEL_CONFIG): - @set -e ; test -f .local-symbols || ( \ + @set -e ; test -f local-symbols || ( \ echo "/--------------" ;\ echo "| You shouldn't run make in the backports tree, but only in" ;\ @@ -60,57 +62,61 @@ mrproper: @@ -34,7 +34,7 @@ - @set -e ; if [ "$$(cat .kernel_config_md5 2>/dev/null)" != "$(CONFIG_MD5)" ] ;\ - then \ - echo -n "Generating local configuration database from kernel ..." ;\ -- grep -v -f .local-symbols $(KERNEL_CONFIG) | grep = | ( \ +- grep -v -f local-symbols $(KERNEL_CONFIG) | grep = | ( \ - while read l ; do \ - if [ "$${l:0:7}" != "CONFIG_" ] ; then \ - continue ;\ @@ -85,9 +85,9 @@ + @rm -f .kernel_config_md5_* + @touch $@ + -+Kconfig.kernel: $(STAMP_KERNEL_CONFIG) .local-symbols ++Kconfig.kernel: $(STAMP_KERNEL_CONFIG) local-symbols + @printf "Generating local configuration database from kernel ..." -+ @grep -v -f .local-symbols $(KERNEL_CONFIG) | grep = | ( \ ++ @grep -v -f local-symbols $(KERNEL_CONFIG) | grep = | ( \ + while read l ; do \ + if [ "$${l:0:7}" != "CONFIG_" ] ; then \ + continue ;\ @@ -148,7 +148,7 @@ @$(MAKE) oldconfig - @echo -n "Building backport-include/backport/autoconf.h ..." + @printf "Building backport-include/backport/autoconf.h ..." - @grep -f .local-symbols .config | ( \ + @grep -f local-symbols .config | ( \ echo "#ifndef COMPAT_AUTOCONF_INCLUDED" ;\ echo "#define COMPAT_AUTOCONF_INCLUDED" ;\ @@ -80,7 +80,12 @@ backport-include/backport/autoconf.h: .c diff --git a/package/kernel/mac80211/patches/004-kconfig_backport_fix.patch b/package/kernel/mac80211/patches/004-kconfig_backport_fix.patch index f11029844c..2c9572ec93 100644 --- a/package/kernel/mac80211/patches/004-kconfig_backport_fix.patch +++ b/package/kernel/mac80211/patches/004-kconfig_backport_fix.patch @@ -17,7 +17,7 @@ #undef IS_ENABLED #define IS_ENABLED(option) \ (config_enabled(option) || config_enabled(option##_MODULE)) -@@ -24,6 +27,8 @@ +@@ -31,6 +34,8 @@ #undef IS_BUILTIN #define IS_BUILTIN(option) config_enabled(option) diff --git a/package/kernel/mac80211/patches/005-revert-devcoredump.patch b/package/kernel/mac80211/patches/005-revert-devcoredump.patch index ff460900ff..1216b99574 100644 --- a/package/kernel/mac80211/patches/005-revert-devcoredump.patch +++ b/package/kernel/mac80211/patches/005-revert-devcoredump.patch @@ -1,6 +1,6 @@ --- a/compat/Makefile +++ b/compat/Makefile -@@ -35,8 +35,6 @@ compat-$(CPTCFG_KERNEL_4_6) += backport- +@@ -39,8 +39,6 @@ compat-$(CPTCFG_KERNEL_4_10) += backport compat-$(CPTCFG_BPAUTO_BUILD_CRYPTO_CCM) += crypto-ccm.o compat-$(CPTCFG_BPAUTO_CRYPTO_SKCIPHER) += crypto-skcipher.o @@ -9,144 +9,3 @@ compat-$(CPTCFG_BPAUTO_BUILD_WANT_DEV_COREDUMP) += drivers-base-devcoredump.o compat-$(CPTCFG_BPAUTO_RHASHTABLE) += lib-rhashtable.o cordic-objs += lib-cordic.o ---- a/compat/drivers-base-devcoredump.c -+++ b/compat/drivers-base-devcoredump.c -@@ -31,6 +31,7 @@ - #include - #include - #include -+#include "backports.h" - - static struct class devcd_class; - -@@ -40,6 +41,10 @@ static bool devcd_disabled; - /* if data isn't read by userspace after 5 minutes then delete it */ - #define DEVCD_TIMEOUT (HZ * 60 * 5) - -+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0) -+static struct bin_attribute devcd_attr_data; -+#endif -+ - struct devcd_entry { - struct device devcd_dev; - void *data; -@@ -69,8 +74,7 @@ static void devcd_dev_release(struct dev - * a struct device to know when it goes away? - */ - if (devcd->failing_dev->kobj.sd) -- sysfs_delete_link(&devcd->failing_dev->kobj, &dev->kobj, -- "devcoredump"); -+ sysfs_remove_link(&devcd->failing_dev->kobj, "devcoredump"); - - put_device(devcd->failing_dev); - kfree(devcd); -@@ -82,6 +86,9 @@ static void devcd_del(struct work_struct - - devcd = container_of(wk, struct devcd_entry, del_wk.work); - -+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0) -+ device_remove_bin_file(&devcd->devcd_dev, &devcd_attr_data); -+#endif - device_del(&devcd->devcd_dev); - put_device(&devcd->devcd_dev); - } -@@ -115,6 +122,7 @@ static struct bin_attribute devcd_attr_d - .write = devcd_data_write, - }; - -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0) - static struct bin_attribute *devcd_dev_bin_attrs[] = { - &devcd_attr_data, NULL, - }; -@@ -126,6 +134,7 @@ static const struct attribute_group devc - static const struct attribute_group *devcd_dev_groups[] = { - &devcd_dev_group, NULL, - }; -+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0) */ - - static int devcd_free(struct device *dev, void *data) - { -@@ -160,18 +169,11 @@ static ssize_t disabled_store(struct cla - - return count; - } --static CLASS_ATTR_RW(disabled); - --static struct attribute *devcd_class_attrs[] = { -- &class_attr_disabled.attr, -- NULL, -+static struct class_attribute devcd_class_attrs[] = { -+ __ATTR_RW(disabled), -+ __ATTR_NULL - }; --#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0) --ATTRIBUTE_GROUPS(devcd_class); --#else --#define BP_ATTR_GRP_STRUCT device_attribute --ATTRIBUTE_GROUPS_BACKPORT(devcd_class); --#endif - - static struct class devcd_class = { - .name = "devcoredump", -@@ -179,10 +181,8 @@ static struct class devcd_class = { - .dev_release = devcd_dev_release, - #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0) - .dev_groups = devcd_dev_groups, --#else -- .dev_attrs = devcd_class_dev_attrs, - #endif -- .class_groups = devcd_class_groups, -+ .class_attrs = devcd_class_attrs, - }; - - static ssize_t devcd_readv(char *buffer, loff_t offset, size_t count, -@@ -325,6 +325,11 @@ void dev_coredumpm(struct device *dev, s - if (device_add(&devcd->devcd_dev)) - goto put_device; - -+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0) -+ if (device_create_bin_file(&devcd->devcd_dev, &devcd_attr_data)) -+ goto put_device; -+#endif -+ - if (sysfs_create_link(&devcd->devcd_dev.kobj, &dev->kobj, - "failing_device")) - /* nothing - symlink will be missing */; -@@ -367,16 +372,13 @@ void dev_coredumpsg(struct device *dev, - } - EXPORT_SYMBOL_GPL(dev_coredumpsg); - --static int __init devcoredump_init(void) -+int __init devcoredump_init(void) - { -- init_devcd_class_attrs(); - return class_register(&devcd_class); - } --__initcall(devcoredump_init); - --static void __exit devcoredump_exit(void) -+void __exit devcoredump_exit(void) - { - class_for_each_device(&devcd_class, NULL, NULL, devcd_free); - class_unregister(&devcd_class); - } --__exitcall(devcoredump_exit); ---- a/include/linux/backport-devcoredump.h -+++ b/include/linux/backport-devcoredump.h -@@ -66,7 +66,7 @@ static inline void _devcd_free_sgtable(s - } - - --#ifdef CONFIG_DEV_COREDUMP -+#ifdef CPTCFG_BPAUTO_WANT_DEV_COREDUMP - void dev_coredumpv(struct device *dev, void *data, size_t datalen, - gfp_t gfp); - -@@ -100,6 +100,6 @@ static inline void dev_coredumpsg(struct - { - _devcd_free_sgtable(table); - } --#endif /* CONFIG_DEV_COREDUMP */ -+#endif /* CPTCFG_BPAUTO_WANT_DEV_COREDUMP */ - - #endif /* __DEVCOREDUMP_H */ diff --git a/package/kernel/mac80211/patches/006-revert-ktime-changes.patch b/package/kernel/mac80211/patches/006-revert-ktime-changes.patch deleted file mode 100644 index b839eb4c8d..0000000000 --- a/package/kernel/mac80211/patches/006-revert-ktime-changes.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- a/drivers/net/wireless/ralink/rt2x00/rt2800usb.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800usb.c -@@ -177,7 +177,7 @@ static bool rt2800usb_tx_sta_fifo_read_c - if (rt2800usb_txstatus_pending(rt2x00dev)) { - /* Read register after 1 ms */ - hrtimer_start(&rt2x00dev->txstatus_timer, -- TXSTATUS_READ_INTERVAL, -+ ktime_set(0, TXSTATUS_READ_INTERVAL), - HRTIMER_MODE_REL); - return false; - } -@@ -204,7 +204,7 @@ static void rt2800usb_async_read_tx_stat - - /* Read TX_STA_FIFO register after 2 ms */ - hrtimer_start(&rt2x00dev->txstatus_timer, -- 2 * TXSTATUS_READ_INTERVAL, -+ ktime_set(0, 2*TXSTATUS_READ_INTERVAL), - HRTIMER_MODE_REL); - } - diff --git a/package/kernel/mac80211/patches/007-revert-genetlink-changes.patch b/package/kernel/mac80211/patches/007-revert-genetlink-changes.patch deleted file mode 100644 index 1a85106bc2..0000000000 --- a/package/kernel/mac80211/patches/007-revert-genetlink-changes.patch +++ /dev/null @@ -1,266 +0,0 @@ ---- a/net/wireless/nl80211.c -+++ b/net/wireless/nl80211.c -@@ -32,8 +32,22 @@ static int nl80211_crypto_settings(struc - struct cfg80211_crypto_settings *settings, - int cipher_limit); - -+static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb, -+ struct genl_info *info); -+static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb, -+ struct genl_info *info); -+ - /* the netlink family */ --static struct genl_family nl80211_fam; -+static struct genl_family nl80211_fam = { -+ .id = GENL_ID_GENERATE, /* don't bother with a hardcoded ID */ -+ .name = NL80211_GENL_NAME, /* have users key off the name instead */ -+ .hdrsize = 0, /* no private header */ -+ .version = 1, /* no particular meaning now */ -+ .maxattr = NL80211_ATTR_MAX, -+ .netnsok = true, -+ .pre_doit = nl80211_pre_doit, -+ .post_doit = nl80211_post_doit, -+}; - - /* multicast groups */ - enum nl80211_multicast_groups { -@@ -549,14 +563,13 @@ static int nl80211_prepare_wdev_dump(str - - if (!cb->args[0]) { - err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize, -- genl_family_attrbuf(&nl80211_fam), -- nl80211_fam.maxattr, nl80211_policy); -+ nl80211_fam.attrbuf, nl80211_fam.maxattr, -+ nl80211_policy); - if (err) - goto out_unlock; - -- *wdev = __cfg80211_wdev_from_attrs( -- sock_net(skb->sk), -- genl_family_attrbuf(&nl80211_fam)); -+ *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk), -+ nl80211_fam.attrbuf); - if (IS_ERR(*wdev)) { - err = PTR_ERR(*wdev); - goto out_unlock; -@@ -1903,7 +1916,7 @@ static int nl80211_dump_wiphy_parse(stru - struct netlink_callback *cb, - struct nl80211_dump_wiphy_state *state) - { -- struct nlattr **tb = genl_family_attrbuf(&nl80211_fam); -+ struct nlattr **tb = nl80211_fam.attrbuf; - int ret = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize, - tb, nl80211_fam.maxattr, nl80211_policy); - /* ignore parse errors for backward compatibility */ -@@ -7733,7 +7746,6 @@ static int nl80211_send_survey(struct sk - - static int nl80211_dump_survey(struct sk_buff *skb, struct netlink_callback *cb) - { -- struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam); - struct survey_info survey; - struct cfg80211_registered_device *rdev; - struct wireless_dev *wdev; -@@ -7746,7 +7758,7 @@ static int nl80211_dump_survey(struct sk - return res; - - /* prepare_wdev_dump parsed the attributes */ -- radio_stats = attrbuf[NL80211_ATTR_SURVEY_RADIO_STATS]; -+ radio_stats = nl80211_fam.attrbuf[NL80211_ATTR_SURVEY_RADIO_STATS]; - - if (!wdev->netdev) { - res = -EINVAL; -@@ -8594,14 +8606,14 @@ static int nl80211_testmode_dump(struct - */ - phy_idx = cb->args[0] - 1; - } else { -- struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam); -- - err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize, -- attrbuf, nl80211_fam.maxattr, nl80211_policy); -+ nl80211_fam.attrbuf, nl80211_fam.maxattr, -+ nl80211_policy); - if (err) - goto out_err; - -- rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); -+ rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), -+ nl80211_fam.attrbuf); - if (IS_ERR(rdev)) { - err = PTR_ERR(rdev); - goto out_err; -@@ -8609,8 +8621,9 @@ static int nl80211_testmode_dump(struct - phy_idx = rdev->wiphy_idx; - rdev = NULL; - -- if (attrbuf[NL80211_ATTR_TESTDATA]) -- cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA]; -+ if (nl80211_fam.attrbuf[NL80211_ATTR_TESTDATA]) -+ cb->args[1] = -+ (long)nl80211_fam.attrbuf[NL80211_ATTR_TESTDATA]; - } - - if (cb->args[1]) { -@@ -10814,7 +10827,8 @@ static int handle_nan_filter(struct nlat - - i = 0; - nla_for_each_nested(attr, attr_filter, rem) { -- filter[i].filter = nla_memdup(attr, GFP_KERNEL); -+ filter[i].filter = kmemdup(nla_data(attr), nla_len(attr), -+ GFP_KERNEL); - filter[i].len = nla_len(attr); - i++; - } -@@ -11450,7 +11464,6 @@ static int nl80211_prepare_vendor_dump(s - struct cfg80211_registered_device **rdev, - struct wireless_dev **wdev) - { -- struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam); - u32 vid, subcmd; - unsigned int i; - int vcmd_idx = -1; -@@ -11486,28 +11499,31 @@ static int nl80211_prepare_vendor_dump(s - } - - err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize, -- attrbuf, nl80211_fam.maxattr, nl80211_policy); -+ nl80211_fam.attrbuf, nl80211_fam.maxattr, -+ nl80211_policy); - if (err) - goto out_unlock; - -- if (!attrbuf[NL80211_ATTR_VENDOR_ID] || -- !attrbuf[NL80211_ATTR_VENDOR_SUBCMD]) { -+ if (!nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_ID] || -+ !nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_SUBCMD]) { - err = -EINVAL; - goto out_unlock; - } - -- *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk), attrbuf); -+ *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk), -+ nl80211_fam.attrbuf); - if (IS_ERR(*wdev)) - *wdev = NULL; - -- *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); -+ *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), -+ nl80211_fam.attrbuf); - if (IS_ERR(*rdev)) { - err = PTR_ERR(*rdev); - goto out_unlock; - } - -- vid = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_ID]); -- subcmd = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_SUBCMD]); -+ vid = nla_get_u32(nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_ID]); -+ subcmd = nla_get_u32(nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_SUBCMD]); - - for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) { - const struct wiphy_vendor_command *vcmd; -@@ -11531,9 +11547,9 @@ static int nl80211_prepare_vendor_dump(s - goto out_unlock; - } - -- if (attrbuf[NL80211_ATTR_VENDOR_DATA]) { -- data = nla_data(attrbuf[NL80211_ATTR_VENDOR_DATA]); -- data_len = nla_len(attrbuf[NL80211_ATTR_VENDOR_DATA]); -+ if (nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_DATA]) { -+ data = nla_data(nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_DATA]); -+ data_len = nla_len(nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_DATA]); - } - - /* 0 is the first index - add 1 to parse only once */ -@@ -12795,21 +12811,6 @@ static __genl_const struct genl_ops nl80 - }, - }; - --static struct genl_family nl80211_fam __ro_after_init = { -- .name = NL80211_GENL_NAME, /* have users key off the name instead */ -- .hdrsize = 0, /* no private header */ -- .version = 1, /* no particular meaning now */ -- .maxattr = NL80211_ATTR_MAX, -- .netnsok = true, -- .pre_doit = nl80211_pre_doit, -- .post_doit = nl80211_post_doit, -- .module = THIS_MODULE, -- .ops = nl80211_ops, -- .n_ops = ARRAY_SIZE(nl80211_ops), -- .mcgrps = nl80211_mcgrps, -- .n_mcgrps = ARRAY_SIZE(nl80211_mcgrps), --}; -- - /* notification functions */ - - void nl80211_notify_wiphy(struct cfg80211_registered_device *rdev, -@@ -14759,11 +14760,12 @@ void nl80211_send_ap_stopped(struct wire - - /* initialisation/exit functions */ - --int __init nl80211_init(void) -+int nl80211_init(void) - { - int err; - -- err = genl_register_family(&nl80211_fam); -+ err = genl_register_family_with_ops_groups(&nl80211_fam, nl80211_ops, -+ nl80211_mcgrps); - if (err) - return err; - ---- a/drivers/net/wireless/mac80211_hwsim.c -+++ b/drivers/net/wireless/mac80211_hwsim.c -@@ -587,8 +587,15 @@ struct hwsim_radiotap_ack_hdr { - __le16 rt_chbitmask; - } __packed; - --/* MAC80211_HWSIM netlink family */ --static struct genl_family hwsim_genl_family; -+/* MAC80211_HWSIM netlinf family */ -+static struct genl_family hwsim_genl_family = { -+ .id = GENL_ID_GENERATE, -+ .hdrsize = 0, -+ .name = "MAC80211_HWSIM", -+ .version = 1, -+ .maxattr = HWSIM_ATTR_MAX, -+ .netnsok = true, -+}; - - enum hwsim_multicast_groups { - HWSIM_MCGRP_CONFIG, -@@ -3250,18 +3257,6 @@ static __genl_const struct genl_ops hwsi - }, - }; - --static struct genl_family hwsim_genl_family __ro_after_init = { -- .name = "MAC80211_HWSIM", -- .version = 1, -- .maxattr = HWSIM_ATTR_MAX, -- .netnsok = true, -- .module = THIS_MODULE, -- .ops = hwsim_ops, -- .n_ops = ARRAY_SIZE(hwsim_ops), -- .mcgrps = hwsim_mcgrps, -- .n_mcgrps = ARRAY_SIZE(hwsim_mcgrps), --}; -- - static void destroy_radio(struct work_struct *work) - { - struct mac80211_hwsim_data *data = -@@ -3309,13 +3304,15 @@ static struct notifier_block hwsim_netli - .notifier_call = mac80211_hwsim_netlink_notify, - }; - --static int __init hwsim_init_netlink(void) -+static int hwsim_init_netlink(void) - { - int rc; - - printk(KERN_INFO "mac80211_hwsim: initializing netlink\n"); - -- rc = genl_register_family(&hwsim_genl_family); -+ rc = genl_register_family_with_ops_groups(&hwsim_genl_family, -+ hwsim_ops, -+ hwsim_mcgrps); - if (rc) - goto failure; - diff --git a/package/kernel/mac80211/patches/008-revert-ndo_stats64-cleanup.patch b/package/kernel/mac80211/patches/008-revert-ndo_stats64-cleanup.patch deleted file mode 100644 index 0f6f0f919f..0000000000 --- a/package/kernel/mac80211/patches/008-revert-ndo_stats64-cleanup.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- a/net/mac80211/iface.c -+++ b/net/mac80211/iface.c -@@ -1133,7 +1133,7 @@ static u16 ieee80211_netdev_select_queue - return ieee80211_select_queue(IEEE80211_DEV_TO_SUB_IF(dev), skb); - } - --static void -+static struct rtnl_link_stats64 * - ieee80211_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) - { - int i; -@@ -1158,6 +1158,8 @@ ieee80211_get_stats64(struct net_device - stats->rx_bytes += rx_bytes; - stats->tx_bytes += tx_bytes; - } -+ -+ return stats; - } - - static const struct net_device_ops ieee80211_dataif_ops = { diff --git a/package/kernel/mac80211/patches/009-revert-mtu-changes.patch b/package/kernel/mac80211/patches/009-revert-mtu-changes.patch deleted file mode 100644 index f5e2757d3f..0000000000 --- a/package/kernel/mac80211/patches/009-revert-mtu-changes.patch +++ /dev/null @@ -1,338 +0,0 @@ ---- a/net/mac80211/iface.c -+++ b/net/mac80211/iface.c -@@ -151,6 +151,15 @@ void ieee80211_recalc_idle(struct ieee80 - ieee80211_hw_config(local, change); - } - -+static int ieee80211_change_mtu(struct net_device *dev, int new_mtu) -+{ -+ if (new_mtu < 256 || new_mtu > IEEE80211_MAX_DATA_LEN) -+ return -EINVAL; -+ -+ dev->mtu = new_mtu; -+ return 0; -+} -+ - static int ieee80211_verify_mac(struct ieee80211_sub_if_data *sdata, u8 *addr, - bool check_dup) - { -@@ -1168,6 +1177,7 @@ static const struct net_device_ops ieee8 - .ndo_uninit = ieee80211_uninit, - .ndo_start_xmit = ieee80211_subif_start_xmit, - .ndo_set_rx_mode = ieee80211_set_multicast_list, -+ .ndo_change_mtu = ieee80211_change_mtu, - .ndo_set_mac_address = ieee80211_change_mac, - .ndo_select_queue = ieee80211_netdev_select_queue, - .ndo_get_stats64 = ieee80211_get_stats64, -@@ -1211,6 +1221,7 @@ static const struct net_device_ops ieee8 - .ndo_uninit = ieee80211_uninit, - .ndo_start_xmit = ieee80211_monitor_start_xmit, - .ndo_set_rx_mode = ieee80211_set_multicast_list, -+ .ndo_change_mtu = ieee80211_change_mtu, - .ndo_set_mac_address = ieee80211_change_mac, - .ndo_select_queue = ieee80211_monitor_select_queue, - .ndo_get_stats64 = ieee80211_get_stats64, -@@ -1919,10 +1930,6 @@ int ieee80211_if_add(struct ieee80211_lo - - netdev_set_default_ethtool_ops(ndev, &ieee80211_ethtool_ops); - -- /* MTU range: 256 - 2304 */ -- ndev->min_mtu = 256; -- ndev->max_mtu = IEEE80211_MAX_DATA_LEN; -- - ret = register_netdevice(ndev); - if (ret) { - ieee80211_if_free(ndev); ---- a/drivers/net/wireless/ath/wil6210/netdev.c -+++ b/drivers/net/wireless/ath/wil6210/netdev.c -@@ -42,6 +42,21 @@ static int wil_stop(struct net_device *n - return wil_down(wil); - } - -+static int wil_change_mtu(struct net_device *ndev, int new_mtu) -+{ -+ struct wil6210_priv *wil = ndev_to_wil(ndev); -+ -+ if (new_mtu < 68 || new_mtu > mtu_max) { -+ wil_err(wil, "invalid MTU %d\n", new_mtu); -+ return -EINVAL; -+ } -+ -+ wil_dbg_misc(wil, "change MTU %d -> %d\n", ndev->mtu, new_mtu); -+ ndev->mtu = new_mtu; -+ -+ return 0; -+} -+ - static int wil_do_ioctl(struct net_device *ndev, struct ifreq *ifr, int cmd) - { - struct wil6210_priv *wil = ndev_to_wil(ndev); -@@ -55,6 +70,7 @@ static const struct net_device_ops wil_n - .ndo_start_xmit = wil_start_xmit, - .ndo_set_mac_address = eth_mac_addr, - .ndo_validate_addr = eth_validate_addr, -+ .ndo_change_mtu = wil_change_mtu, - .ndo_do_ioctl = wil_do_ioctl, - }; - -@@ -111,7 +127,6 @@ static int wil6210_netdev_poll_tx(struct - static void wil_dev_setup(struct net_device *dev) - { - ether_setup(dev); -- dev->max_mtu = mtu_max; - dev->tx_queue_len = WIL_TX_Q_LEN_DEFAULT; - } - ---- a/drivers/net/wireless/atmel/atmel.c -+++ b/drivers/net/wireless/atmel/atmel.c -@@ -1295,6 +1295,14 @@ static struct iw_statistics *atmel_get_w - return &priv->wstats; - } - -+static int atmel_change_mtu(struct net_device *dev, int new_mtu) -+{ -+ if ((new_mtu < 68) || (new_mtu > 2312)) -+ return -EINVAL; -+ dev->mtu = new_mtu; -+ return 0; -+} -+ - static int atmel_set_mac_address(struct net_device *dev, void *p) - { - struct sockaddr *addr = p; -@@ -1498,6 +1506,7 @@ static const struct file_operations atme - static const struct net_device_ops atmel_netdev_ops = { - .ndo_open = atmel_open, - .ndo_stop = atmel_close, -+ .ndo_change_mtu = atmel_change_mtu, - .ndo_set_mac_address = atmel_set_mac_address, - .ndo_start_xmit = start_tx, - .ndo_do_ioctl = atmel_ioctl, -@@ -1591,10 +1600,6 @@ struct net_device *init_atmel_card(unsig - dev->irq = irq; - dev->base_addr = port; - -- /* MTU range: 68 - 2312 */ -- dev->min_mtu = 68; -- dev->max_mtu = MAX_WIRELESS_BODY - ETH_FCS_LEN; -- - SET_NETDEV_DEV(dev, sys_dev); - - if ((rc = request_irq(dev->irq, service_interrupt, IRQF_SHARED, dev->name, dev))) { ---- a/drivers/net/wireless/cisco/airo.c -+++ b/drivers/net/wireless/cisco/airo.c -@@ -2329,6 +2329,14 @@ static int airo_set_mac_address(struct n - return 0; - } - -+static int airo_change_mtu(struct net_device *dev, int new_mtu) -+{ -+ if ((new_mtu < 68) || (new_mtu > 2400)) -+ return -EINVAL; -+ dev->mtu = new_mtu; -+ return 0; -+} -+ - static LIST_HEAD(airo_devices); - - static void add_airo_dev(struct airo_info *ai) -@@ -2648,6 +2656,7 @@ static const struct net_device_ops airo1 - .ndo_get_stats = airo_get_stats, - .ndo_set_mac_address = airo_set_mac_address, - .ndo_do_ioctl = airo_ioctl, -+ .ndo_change_mtu = airo_change_mtu, - }; - - static void wifi_setup(struct net_device *dev) -@@ -2659,8 +2668,6 @@ static void wifi_setup(struct net_device - dev->type = ARPHRD_IEEE80211; - dev->hard_header_len = ETH_HLEN; - dev->mtu = AIRO_DEF_MTU; -- dev->min_mtu = 68; -- dev->max_mtu = MIC_MSGLEN_MAX; - dev->addr_len = ETH_ALEN; - dev->tx_queue_len = 100; - -@@ -2747,6 +2754,7 @@ static const struct net_device_ops airo_ - .ndo_set_rx_mode = airo_set_multicast_list, - .ndo_set_mac_address = airo_set_mac_address, - .ndo_do_ioctl = airo_ioctl, -+ .ndo_change_mtu = airo_change_mtu, - .ndo_validate_addr = eth_validate_addr, - }; - -@@ -2758,6 +2766,7 @@ static const struct net_device_ops mpi_n - .ndo_set_rx_mode = airo_set_multicast_list, - .ndo_set_mac_address = airo_set_mac_address, - .ndo_do_ioctl = airo_ioctl, -+ .ndo_change_mtu = airo_change_mtu, - .ndo_validate_addr = eth_validate_addr, - }; - -@@ -2813,7 +2822,6 @@ static struct net_device *_init_airo_car - dev->irq = irq; - dev->base_addr = port; - dev->priv_flags &= ~IFF_TX_SKB_SHARING; -- dev->max_mtu = MIC_MSGLEN_MAX; - - SET_NETDEV_DEV(dev, dmdev); - ---- a/drivers/net/wireless/intel/ipw2x00/ipw2100.c -+++ b/drivers/net/wireless/intel/ipw2x00/ipw2100.c -@@ -6039,6 +6039,7 @@ static const struct net_device_ops ipw21 - .ndo_open = ipw2100_open, - .ndo_stop = ipw2100_close, - .ndo_start_xmit = libipw_xmit, -+ .ndo_change_mtu = libipw_change_mtu, - .ndo_tx_timeout = ipw2100_tx_timeout, - .ndo_set_mac_address = ipw2100_set_address, - .ndo_validate_addr = eth_validate_addr, -@@ -6074,8 +6075,6 @@ static struct net_device *ipw2100_alloc_ - dev->wireless_data = &priv->wireless_data; - dev->watchdog_timeo = 3 * HZ; - dev->irq = 0; -- dev->min_mtu = 68; -- dev->max_mtu = LIBIPW_DATA_LEN; - - /* NOTE: We don't use the wireless_handlers hook - * in dev as the system will start throwing WX requests ---- a/drivers/net/wireless/intel/ipw2x00/ipw2200.c -+++ b/drivers/net/wireless/intel/ipw2x00/ipw2200.c -@@ -11561,6 +11561,7 @@ static const struct net_device_ops ipw_p - .ndo_open = ipw_prom_open, - .ndo_stop = ipw_prom_stop, - .ndo_start_xmit = ipw_prom_hard_start_xmit, -+ .ndo_change_mtu = libipw_change_mtu, - .ndo_set_mac_address = eth_mac_addr, - .ndo_validate_addr = eth_validate_addr, - }; -@@ -11586,9 +11587,6 @@ static int ipw_prom_alloc(struct ipw_pri - priv->prom_net_dev->type = ARPHRD_IEEE80211_RADIOTAP; - priv->prom_net_dev->netdev_ops = &ipw_prom_netdev_ops; - -- priv->prom_net_dev->min_mtu = 68; -- priv->prom_net_dev->max_mtu = LIBIPW_DATA_LEN; -- - priv->prom_priv->ieee->iw_mode = IW_MODE_MONITOR; - SET_NETDEV_DEV(priv->prom_net_dev, &priv->pci_dev->dev); - -@@ -11621,6 +11619,7 @@ static const struct net_device_ops ipw_n - .ndo_set_rx_mode = ipw_net_set_multicast_list, - .ndo_set_mac_address = ipw_net_set_mac_address, - .ndo_start_xmit = libipw_xmit, -+ .ndo_change_mtu = libipw_change_mtu, - .ndo_validate_addr = eth_validate_addr, - }; - -@@ -11730,9 +11729,6 @@ static int ipw_pci_probe(struct pci_dev - net_dev->wireless_handlers = &ipw_wx_handler_def; - net_dev->ethtool_ops = &ipw_ethtool_ops; - -- net_dev->min_mtu = 68; -- net_dev->max_mtu = LIBIPW_DATA_LEN; -- - err = sysfs_create_group(&pdev->dev.kobj, &ipw_attribute_group); - if (err) { - IPW_ERROR("failed to create sysfs device attributes\n"); ---- a/drivers/net/wireless/intel/ipw2x00/libipw.h -+++ b/drivers/net/wireless/intel/ipw2x00/libipw.h -@@ -948,6 +948,7 @@ static inline int libipw_is_cck_rate(u8 - /* libipw.c */ - void free_libipw(struct net_device *dev, int monitor); - struct net_device *alloc_libipw(int sizeof_priv, int monitor); -+int libipw_change_mtu(struct net_device *dev, int new_mtu); - - void libipw_networks_age(struct libipw_device *ieee, unsigned long age_secs); - ---- a/drivers/net/wireless/intel/ipw2x00/libipw_module.c -+++ b/drivers/net/wireless/intel/ipw2x00/libipw_module.c -@@ -118,6 +118,15 @@ static void libipw_networks_initialize(s - &ieee->network_free_list); - } - -+int libipw_change_mtu(struct net_device *dev, int new_mtu) -+{ -+ if ((new_mtu < 68) || (new_mtu > LIBIPW_DATA_LEN)) -+ return -EINVAL; -+ dev->mtu = new_mtu; -+ return 0; -+} -+EXPORT_SYMBOL(libipw_change_mtu); -+ - struct net_device *alloc_libipw(int sizeof_priv, int monitor) - { - struct libipw_device *ieee; ---- a/drivers/net/wireless/intersil/hostap/hostap_main.c -+++ b/drivers/net/wireless/intersil/hostap/hostap_main.c -@@ -765,6 +765,16 @@ static void hostap_set_multicast_list(st - } - - -+static int prism2_change_mtu(struct net_device *dev, int new_mtu) -+{ -+ if (new_mtu < PRISM2_MIN_MTU || new_mtu > PRISM2_MAX_MTU) -+ return -EINVAL; -+ -+ dev->mtu = new_mtu; -+ return 0; -+} -+ -+ - static void prism2_tx_timeout(struct net_device *dev) - { - struct hostap_interface *iface; -@@ -803,6 +813,7 @@ static const struct net_device_ops hosta - .ndo_do_ioctl = hostap_ioctl, - .ndo_set_mac_address = prism2_set_mac_address, - .ndo_set_rx_mode = hostap_set_multicast_list, -+ .ndo_change_mtu = prism2_change_mtu, - .ndo_tx_timeout = prism2_tx_timeout, - .ndo_validate_addr = eth_validate_addr, - }; -@@ -815,6 +826,7 @@ static const struct net_device_ops hosta - .ndo_do_ioctl = hostap_ioctl, - .ndo_set_mac_address = prism2_set_mac_address, - .ndo_set_rx_mode = hostap_set_multicast_list, -+ .ndo_change_mtu = prism2_change_mtu, - .ndo_tx_timeout = prism2_tx_timeout, - .ndo_validate_addr = eth_validate_addr, - }; -@@ -827,6 +839,7 @@ static const struct net_device_ops hosta - .ndo_do_ioctl = hostap_ioctl, - .ndo_set_mac_address = prism2_set_mac_address, - .ndo_set_rx_mode = hostap_set_multicast_list, -+ .ndo_change_mtu = prism2_change_mtu, - .ndo_tx_timeout = prism2_tx_timeout, - .ndo_validate_addr = eth_validate_addr, - }; -@@ -838,8 +851,6 @@ void hostap_setup_dev(struct net_device - - iface = netdev_priv(dev); - ether_setup(dev); -- dev->min_mtu = PRISM2_MIN_MTU; -- dev->max_mtu = PRISM2_MAX_MTU; - dev->priv_flags &= ~IFF_TX_SKB_SHARING; - - /* kernel callbacks */ ---- a/drivers/net/wireless/intersil/orinoco/main.c -+++ b/drivers/net/wireless/intersil/orinoco/main.c -@@ -322,6 +322,9 @@ int orinoco_change_mtu(struct net_device - { - struct orinoco_private *priv = ndev_priv(dev); - -+ if ((new_mtu < ORINOCO_MIN_MTU) || (new_mtu > ORINOCO_MAX_MTU)) -+ return -EINVAL; -+ - /* MTU + encapsulation + header length */ - if ((new_mtu + ENCAPS_OVERHEAD + sizeof(struct ieee80211_hdr)) > - (priv->nicbuf_size - ETH_HLEN)) -@@ -2285,9 +2288,6 @@ int orinoco_if_add(struct orinoco_privat - dev->base_addr = base_addr; - dev->irq = irq; - -- dev->min_mtu = ORINOCO_MIN_MTU; -- dev->max_mtu = ORINOCO_MAX_MTU; -- - SET_NETDEV_DEV(dev, priv->dev); - ret = register_netdev(dev); - if (ret) diff --git a/package/kernel/mac80211/patches/010-disable_rfkill.patch b/package/kernel/mac80211/patches/010-disable_rfkill.patch index 2902e498d8..d5253063ce 100644 --- a/package/kernel/mac80211/patches/010-disable_rfkill.patch +++ b/package/kernel/mac80211/patches/010-disable_rfkill.patch @@ -10,6 +10,6 @@ +#undef CONFIG_RFKILL_MODULE +#undef CONFIG_RFKILL_FULL_MODULE + - #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) + #if LINUX_VERSION_IS_GEQ(3,10,0) #include_next #else diff --git a/package/kernel/mac80211/patches/011-backport_strscpy.patch b/package/kernel/mac80211/patches/011-backport_strscpy.patch deleted file mode 100644 index c8e26c46f2..0000000000 --- a/package/kernel/mac80211/patches/011-backport_strscpy.patch +++ /dev/null @@ -1,43 +0,0 @@ ---- a/backport-include/linux/string.h -+++ b/backport-include/linux/string.h -@@ -25,4 +25,8 @@ extern void *memdup_user_nul(const void - void memzero_explicit(void *s, size_t count); - #endif - -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,3,0)) -+ssize_t strscpy(char *dest, const char *src, size_t count); -+#endif -+ - #endif /* __BACKPORT_LINUX_STRING_H */ ---- a/compat/backport-4.3.c -+++ b/compat/backport-4.3.c -@@ -57,3 +57,29 @@ void seq_hex_dump(struct seq_file *m, co - } - } - EXPORT_SYMBOL_GPL(seq_hex_dump); -+ -+ssize_t strscpy(char *dest, const char *src, size_t count) -+{ -+ long res = 0; -+ -+ if (count == 0) -+ return -E2BIG; -+ -+ while (count) { -+ char c; -+ -+ c = src[res]; -+ dest[res] = c; -+ if (!c) -+ return res; -+ res++; -+ count--; -+ } -+ -+ /* Hit buffer length without finding a NUL; force NUL-termination. */ -+ if (res) -+ dest[res-1] = '\0'; -+ -+ return -E2BIG; -+} -+EXPORT_SYMBOL_GPL(strscpy); diff --git a/package/kernel/mac80211/patches/012-kernel_build_check.patch b/package/kernel/mac80211/patches/012-kernel_build_check.patch new file mode 100644 index 0000000000..d225ba1820 --- /dev/null +++ b/package/kernel/mac80211/patches/012-kernel_build_check.patch @@ -0,0 +1,11 @@ +--- a/Makefile ++++ b/Makefile +@@ -2,7 +2,7 @@ + # Makefile for the output source package + # + +-ifeq ($(KERNELRELEASE),) ++ifeq ($(KERNELVERSION),) + + MAKEFLAGS += --no-print-directory + SHELL := /usr/bin/env bash diff --git a/package/kernel/mac80211/patches/015-ipw200-mtu.patch b/package/kernel/mac80211/patches/015-ipw200-mtu.patch new file mode 100644 index 0000000000..8d273a095b --- /dev/null +++ b/package/kernel/mac80211/patches/015-ipw200-mtu.patch @@ -0,0 +1,34 @@ +--- a/drivers/net/wireless/intel/ipw2x00/ipw2200.c ++++ b/drivers/net/wireless/intel/ipw2x00/ipw2200.c +@@ -11506,6 +11506,15 @@ static const struct attribute_group ipw_ + .attrs = ipw_sysfs_entries, + }; + ++#if LINUX_VERSION_IS_LESS(4,10,0) ++static int __change_mtu(struct net_device *ndev, int new_mtu){ ++ if (new_mtu < 68 || new_mtu > LIBIPW_DATA_LEN) ++ return -EINVAL; ++ ndev->mtu = new_mtu; ++ return 0; ++} ++#endif ++ + #ifdef CPTCFG_IPW2200_PROMISCUOUS + static int ipw_prom_open(struct net_device *dev) + { +@@ -11554,15 +11563,6 @@ static netdev_tx_t ipw_prom_hard_start_x + return NETDEV_TX_OK; + } + +-#if LINUX_VERSION_IS_LESS(4,10,0) +-static int __change_mtu(struct net_device *ndev, int new_mtu){ +- if (new_mtu < 68 || new_mtu > LIBIPW_DATA_LEN) +- return -EINVAL; +- ndev->mtu = new_mtu; +- return 0; +-} +-#endif +- + static const struct net_device_ops ipw_prom_netdev_ops = { + #if LINUX_VERSION_IS_LESS(4,10,0) + .ndo_change_mtu = __change_mtu, diff --git a/package/kernel/mac80211/patches/020-01-rt2x00-avoid-introducing-a-USB-dependency-in-the-rt2.patch b/package/kernel/mac80211/patches/020-01-rt2x00-avoid-introducing-a-USB-dependency-in-the-rt2.patch deleted file mode 100644 index 7e829faef6..0000000000 --- a/package/kernel/mac80211/patches/020-01-rt2x00-avoid-introducing-a-USB-dependency-in-the-rt2.patch +++ /dev/null @@ -1,85 +0,0 @@ -From 6232c17438ed01f43665197db5a98a4a4f77ef47 Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Thu, 2 Feb 2017 10:57:40 +0100 -Subject: [PATCH 01/19] rt2x00: avoid introducing a USB dependency in the - rt2x00lib module - -As reported by Felix: - -Though protected by an ifdef, introducing an usb symbol dependency in -the rt2x00lib module is a major inconvenience for distributions that -package kernel modules split into individual packages. - -Get rid of this unnecessary dependency by calling the usb related -function from a more suitable place. - -Cc: Vishal Thanki -Reported-by: Felix Fietkau -Fixes: 8b4c0009313f ("rt2x00usb: Use usb anchor to manage URB") -Signed-off-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | 23 ++++++++--------------- - drivers/net/wireless/ralink/rt2x00/rt2x00usb.c | 5 +++++ - 2 files changed, 13 insertions(+), 15 deletions(-) - -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -index 8fcbc8dc94c1..4b08007f93f7 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -@@ -1436,21 +1436,6 @@ void rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev) - cancel_work_sync(&rt2x00dev->intf_work); - cancel_delayed_work_sync(&rt2x00dev->autowakeup_work); - cancel_work_sync(&rt2x00dev->sleep_work); --#if IS_ENABLED(CPTCFG_RT2X00_LIB_USB) -- if (rt2x00_is_usb(rt2x00dev)) { -- usb_kill_anchored_urbs(rt2x00dev->anchor); -- hrtimer_cancel(&rt2x00dev->txstatus_timer); -- cancel_work_sync(&rt2x00dev->rxdone_work); -- cancel_work_sync(&rt2x00dev->txdone_work); -- } --#endif -- if (rt2x00dev->workqueue) -- destroy_workqueue(rt2x00dev->workqueue); -- -- /* -- * Free the tx status fifo. -- */ -- kfifo_free(&rt2x00dev->txstatus_fifo); - - /* - * Kill the tx status tasklet. -@@ -1466,6 +1451,14 @@ void rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev) - */ - rt2x00lib_uninitialize(rt2x00dev); - -+ if (rt2x00dev->workqueue) -+ destroy_workqueue(rt2x00dev->workqueue); -+ -+ /* -+ * Free the tx status fifo. -+ */ -+ kfifo_free(&rt2x00dev->txstatus_fifo); -+ - /* - * Free extra components - */ -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c -index 838ca58d2dd6..5a2bf9f63cd7 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c -@@ -744,6 +744,11 @@ void rt2x00usb_uninitialize(struct rt2x00_dev *rt2x00dev) - { - struct data_queue *queue; - -+ usb_kill_anchored_urbs(rt2x00dev->anchor); -+ hrtimer_cancel(&rt2x00dev->txstatus_timer); -+ cancel_work_sync(&rt2x00dev->rxdone_work); -+ cancel_work_sync(&rt2x00dev->txdone_work); -+ - queue_for_each(rt2x00dev, queue) - rt2x00usb_free_entries(queue); - } --- -2.12.1 - diff --git a/package/kernel/mac80211/patches/020-02-rt2x00usb-do-not-anchor-rx-and-tx-urb-s.patch b/package/kernel/mac80211/patches/020-02-rt2x00usb-do-not-anchor-rx-and-tx-urb-s.patch deleted file mode 100644 index 6510b55c79..0000000000 --- a/package/kernel/mac80211/patches/020-02-rt2x00usb-do-not-anchor-rx-and-tx-urb-s.patch +++ /dev/null @@ -1,61 +0,0 @@ -From 93c7018ec16bb83399dd4db61c361a6d6aba0d5a Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Wed, 8 Feb 2017 12:18:09 +0100 -Subject: [PATCH 02/19] rt2x00usb: do not anchor rx and tx urb's - -We might kill TX or RX urb during rt2x00usb_flush_entry(), what can -cause anchor list corruption like shown below: - -[ 2074.035633] WARNING: CPU: 2 PID: 14480 at lib/list_debug.c:33 __list_add+0xac/0xc0 -[ 2074.035634] list_add corruption. prev->next should be next (ffff88020f362c28), but was dead000000000100. (prev=ffff8801d161bb70). - -[ 2074.035670] Call Trace: -[ 2074.035672] [] dump_stack+0x63/0x8c -[ 2074.035674] [] __warn+0xd1/0xf0 -[ 2074.035676] [] warn_slowpath_fmt+0x5f/0x80 -[ 2074.035678] [] ? rt2x00usb_register_write_lock+0x3d/0x60 [rt2800usb] -[ 2074.035679] [] __list_add+0xac/0xc0 -[ 2074.035681] [] usb_anchor_urb+0x4c/0xa0 -[ 2074.035683] [] rt2x00usb_kick_rx_entry+0xaf/0x100 [rt2x00usb] -[ 2074.035684] [] rt2x00usb_clear_entry+0x22/0x30 [rt2x00usb] - -To fix do not anchor TX and RX urb's, it is not needed as during -shutdown we kill those urbs in rt2x00usb_free_entries(). - -Cc: Vishal Thanki -Fixes: 8b4c0009313f ("rt2x00usb: Use usb anchor to manage URB") -Signed-off-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt2x00usb.c | 4 ---- - 1 file changed, 4 deletions(-) - -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c -index 5a2bf9f63cd7..fe13dd07cc2a 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c -@@ -319,10 +319,8 @@ static bool rt2x00usb_kick_tx_entry(struct queue_entry *entry, void *data) - entry->skb->data, length, - rt2x00usb_interrupt_txdone, entry); - -- usb_anchor_urb(entry_priv->urb, rt2x00dev->anchor); - status = usb_submit_urb(entry_priv->urb, GFP_ATOMIC); - if (status) { -- usb_unanchor_urb(entry_priv->urb); - if (status == -ENODEV) - clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags); - set_bit(ENTRY_DATA_IO_FAILED, &entry->flags); -@@ -410,10 +408,8 @@ static bool rt2x00usb_kick_rx_entry(struct queue_entry *entry, void *data) - entry->skb->data, entry->skb->len, - rt2x00usb_interrupt_rxdone, entry); - -- usb_anchor_urb(entry_priv->urb, rt2x00dev->anchor); - status = usb_submit_urb(entry_priv->urb, GFP_ATOMIC); - if (status) { -- usb_unanchor_urb(entry_priv->urb); - if (status == -ENODEV) - clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags); - set_bit(ENTRY_DATA_IO_FAILED, &entry->flags); --- -2.12.1 - diff --git a/package/kernel/mac80211/patches/020-03-rt2x00usb-fix-anchor-initialization.patch b/package/kernel/mac80211/patches/020-03-rt2x00usb-fix-anchor-initialization.patch deleted file mode 100644 index 78d8ac63d8..0000000000 --- a/package/kernel/mac80211/patches/020-03-rt2x00usb-fix-anchor-initialization.patch +++ /dev/null @@ -1,75 +0,0 @@ -From 0488a6121dfe6cbd44de15ea3627913b7549a1e9 Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Wed, 8 Feb 2017 12:18:10 +0100 -Subject: [PATCH 03/19] rt2x00usb: fix anchor initialization - -If device fail to initialize we can OOPS in rt2x00lib_remove_dev(), due -to using uninitialized usb_anchor structure: - -[ 855.435820] ieee80211 phy3: rt2x00usb_vendor_request: Error - Vendor Request 0x07 failed for offset 0x1000 with error -19 -[ 855.435826] ieee80211 phy3: rt2800_probe_rt: Error - Invalid RT chipset 0x0000, rev 0000 detected -[ 855.435829] ieee80211 phy3: rt2x00lib_probe_dev: Error - Failed to allocate device -[ 855.435845] BUG: unable to handle kernel NULL pointer dereference at 0000000000000028 -[ 855.435900] IP: _raw_spin_lock_irq+0xd/0x30 -[ 855.435926] PGD 0 -[ 855.435953] Oops: 0002 [#1] SMP - -[ 855.437011] Call Trace: -[ 855.437029] ? usb_kill_anchored_urbs+0x27/0xc0 -[ 855.437061] rt2x00lib_remove_dev+0x190/0x1c0 [rt2x00lib] -[ 855.437097] rt2x00lib_probe_dev+0x246/0x7a0 [rt2x00lib] -[ 855.437149] ? ieee80211_roc_setup+0x9e/0xd0 [mac80211] -[ 855.437183] ? __kmalloc+0x1af/0x1f0 -[ 855.437207] ? rt2x00usb_probe+0x13d/0xc50 [rt2x00usb] -[ 855.437240] rt2x00usb_probe+0x155/0xc50 [rt2x00usb] -[ 855.437273] rt2800usb_probe+0x15/0x20 [rt2800usb] -[ 855.437304] usb_probe_interface+0x159/0x2d0 -[ 855.437333] driver_probe_device+0x2bb/0x460 - -Patch changes initialization sequence to fix the problem. - -Cc: Vishal Thanki -Fixes: 8b4c0009313f ("rt2x00usb: Use usb anchor to manage URB") -Signed-off-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt2x00usb.c | 13 ++++++++----- - 1 file changed, 8 insertions(+), 5 deletions(-) - -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c -index fe13dd07cc2a..c696f0ad6a68 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c -@@ -825,10 +825,6 @@ int rt2x00usb_probe(struct usb_interface *usb_intf, - if (retval) - goto exit_free_device; - -- retval = rt2x00lib_probe_dev(rt2x00dev); -- if (retval) -- goto exit_free_reg; -- - rt2x00dev->anchor = devm_kmalloc(&usb_dev->dev, - sizeof(struct usb_anchor), - GFP_KERNEL); -@@ -836,10 +832,17 @@ int rt2x00usb_probe(struct usb_interface *usb_intf, - retval = -ENOMEM; - goto exit_free_reg; - } -- - init_usb_anchor(rt2x00dev->anchor); -+ -+ retval = rt2x00lib_probe_dev(rt2x00dev); -+ if (retval) -+ goto exit_free_anchor; -+ - return 0; - -+exit_free_anchor: -+ usb_kill_anchored_urbs(rt2x00dev->anchor); -+ - exit_free_reg: - rt2x00usb_free_reg(rt2x00dev); - --- -2.12.1 - diff --git a/package/kernel/mac80211/patches/020-04-rt61pci-use-entry-directly.patch b/package/kernel/mac80211/patches/020-04-rt61pci-use-entry-directly.patch deleted file mode 100644 index d8f262af85..0000000000 --- a/package/kernel/mac80211/patches/020-04-rt61pci-use-entry-directly.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 80a97eae304631f57ff8560f87c0b18b95321443 Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Wed, 8 Feb 2017 13:51:29 +0100 -Subject: [PATCH 04/19] rt61pci: use entry directly - -Signed-off-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt61pci.c | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - -diff --git a/drivers/net/wireless/ralink/rt2x00/rt61pci.c b/drivers/net/wireless/ralink/rt2x00/rt61pci.c -index 5306a3b2622d..8adb5f3abe15 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt61pci.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt61pci.c -@@ -1903,8 +1903,7 @@ static void rt61pci_write_tx_desc(struct queue_entry *entry, - - rt2x00_desc_read(txd, 5, &word); - rt2x00_set_field32(&word, TXD_W5_PID_TYPE, entry->queue->qid); -- rt2x00_set_field32(&word, TXD_W5_PID_SUBTYPE, -- skbdesc->entry->entry_idx); -+ rt2x00_set_field32(&word, TXD_W5_PID_SUBTYPE, entry->entry_idx); - rt2x00_set_field32(&word, TXD_W5_TX_POWER, - TXPOWER_TO_DEV(entry->queue->rt2x00dev->tx_power)); - rt2x00_set_field32(&word, TXD_W5_WAITING_DMA_DONE_INT, 1); --- -2.12.1 - diff --git a/package/kernel/mac80211/patches/020-05-rt2x00-call-entry-directly-in-rt2x00_dump_frame.patch b/package/kernel/mac80211/patches/020-05-rt2x00-call-entry-directly-in-rt2x00_dump_frame.patch deleted file mode 100644 index 04a5118103..0000000000 --- a/package/kernel/mac80211/patches/020-05-rt2x00-call-entry-directly-in-rt2x00_dump_frame.patch +++ /dev/null @@ -1,181 +0,0 @@ -From 2ceb813798e1fd33e71a574771828c0f298e077b Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Wed, 8 Feb 2017 13:51:30 +0100 -Subject: [PATCH 05/19] rt2x00: call entry directly in rt2x00_dump_frame - -Signed-off-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt2400pci.c | 2 +- - drivers/net/wireless/ralink/rt2x00/rt2500pci.c | 2 +- - drivers/net/wireless/ralink/rt2x00/rt2500usb.c | 2 +- - drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 2 +- - drivers/net/wireless/ralink/rt2x00/rt2x00.h | 4 ++-- - drivers/net/wireless/ralink/rt2x00/rt2x00debug.c | 7 ++++--- - drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | 4 ++-- - drivers/net/wireless/ralink/rt2x00/rt2x00queue.c | 2 +- - drivers/net/wireless/ralink/rt2x00/rt61pci.c | 2 +- - drivers/net/wireless/ralink/rt2x00/rt73usb.c | 2 +- - 10 files changed, 15 insertions(+), 14 deletions(-) - -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2400pci.c b/drivers/net/wireless/ralink/rt2x00/rt2400pci.c -index 085c5b423bdf..19874439ac40 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2400pci.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2400pci.c -@@ -1200,7 +1200,7 @@ static void rt2400pci_write_beacon(struct queue_entry *entry, - /* - * Dump beacon to userspace through debugfs. - */ -- rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_BEACON, entry->skb); -+ rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_BEACON, entry); - out: - /* - * Enable beaconing again. -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2500pci.c b/drivers/net/wireless/ralink/rt2x00/rt2500pci.c -index 9832fd50c793..791434de8052 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2500pci.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2500pci.c -@@ -1349,7 +1349,7 @@ static void rt2500pci_write_beacon(struct queue_entry *entry, - /* - * Dump beacon to userspace through debugfs. - */ -- rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_BEACON, entry->skb); -+ rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_BEACON, entry); - out: - /* - * Enable beaconing again. -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2500usb.c b/drivers/net/wireless/ralink/rt2x00/rt2500usb.c -index cd3ab5a9e98d..62357465fe29 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2500usb.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2500usb.c -@@ -1170,7 +1170,7 @@ static void rt2500usb_write_beacon(struct queue_entry *entry, - /* - * Dump beacon to userspace through debugfs. - */ -- rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_BEACON, entry->skb); -+ rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_BEACON, entry); - - /* - * USB devices cannot blindly pass the skb->len as the -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -index 572cdea4ca25..8223a1520316 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -1014,7 +1014,7 @@ void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc) - /* - * Dump beacon to userspace through debugfs. - */ -- rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_BEACON, entry->skb); -+ rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_BEACON, entry); - - /* - * Write entire beacon with TXWI and padding to register. -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00.h b/drivers/net/wireless/ralink/rt2x00/rt2x00.h -index ea299c4e7ada..26869b3bef45 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h -@@ -1400,11 +1400,11 @@ void rt2x00queue_flush_queues(struct rt2x00_dev *rt2x00dev, bool drop); - */ - #ifdef CPTCFG_RT2X00_LIB_DEBUGFS - void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev, -- enum rt2x00_dump_type type, struct sk_buff *skb); -+ enum rt2x00_dump_type type, struct queue_entry *entry); - #else - static inline void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev, - enum rt2x00_dump_type type, -- struct sk_buff *skb) -+ struct queue_entry *entry) - { - } - #endif /* CPTCFG_RT2X00_LIB_DEBUGFS */ -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00debug.c b/drivers/net/wireless/ralink/rt2x00/rt2x00debug.c -index 72ae530e4a3b..964aefdc11f0 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00debug.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00debug.c -@@ -157,9 +157,10 @@ void rt2x00debug_update_crypto(struct rt2x00_dev *rt2x00dev, - } - - void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev, -- enum rt2x00_dump_type type, struct sk_buff *skb) -+ enum rt2x00_dump_type type, struct queue_entry *entry) - { - struct rt2x00debug_intf *intf = rt2x00dev->debugfs_intf; -+ struct sk_buff *skb = entry->skb; - struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb); - struct sk_buff *skbcopy; - struct rt2x00dump_hdr *dump_hdr; -@@ -196,8 +197,8 @@ void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev, - dump_hdr->chip_rf = cpu_to_le16(rt2x00dev->chip.rf); - dump_hdr->chip_rev = cpu_to_le16(rt2x00dev->chip.rev); - dump_hdr->type = cpu_to_le16(type); -- dump_hdr->queue_index = skbdesc->entry->queue->qid; -- dump_hdr->entry_index = skbdesc->entry->entry_idx; -+ dump_hdr->queue_index = entry->queue->qid; -+ dump_hdr->entry_index = entry->entry_idx; - dump_hdr->timestamp_sec = cpu_to_le32(timestamp.tv_sec); - dump_hdr->timestamp_usec = cpu_to_le32(timestamp.tv_usec); - -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -index 4b08007f93f7..dd6678109b7e 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -@@ -363,7 +363,7 @@ void rt2x00lib_txdone(struct queue_entry *entry, - * Send frame to debugfs immediately, after this call is completed - * we are going to overwrite the skb->cb array. - */ -- rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_TXDONE, entry->skb); -+ rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_TXDONE, entry); - - /* - * Determine if the frame has been successfully transmitted and -@@ -772,7 +772,7 @@ void rt2x00lib_rxdone(struct queue_entry *entry, gfp_t gfp) - */ - rt2x00link_update_stats(rt2x00dev, entry->skb, &rxdesc); - rt2x00debug_update_crypto(rt2x00dev, &rxdesc); -- rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_RXDONE, entry->skb); -+ rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_RXDONE, entry); - - /* - * Initialize RX status information, and send frame -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c -index b2364d378774..380daf4e1b8d 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c -@@ -544,7 +544,7 @@ static void rt2x00queue_write_tx_descriptor(struct queue_entry *entry, - * All processing on the frame has been completed, this means - * it is now ready to be dumped to userspace through debugfs. - */ -- rt2x00debug_dump_frame(queue->rt2x00dev, DUMP_FRAME_TX, entry->skb); -+ rt2x00debug_dump_frame(queue->rt2x00dev, DUMP_FRAME_TX, entry); - } - - static void rt2x00queue_kick_tx_queue(struct data_queue *queue, -diff --git a/drivers/net/wireless/ralink/rt2x00/rt61pci.c b/drivers/net/wireless/ralink/rt2x00/rt61pci.c -index 8adb5f3abe15..973d418b8113 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt61pci.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt61pci.c -@@ -1988,7 +1988,7 @@ static void rt61pci_write_beacon(struct queue_entry *entry, - /* - * Dump beacon to userspace through debugfs. - */ -- rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_BEACON, entry->skb); -+ rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_BEACON, entry); - - /* - * Write entire beacon with descriptor and padding to register. -diff --git a/drivers/net/wireless/ralink/rt2x00/rt73usb.c b/drivers/net/wireless/ralink/rt2x00/rt73usb.c -index 1a29c4d205a5..bb8d307a789f 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt73usb.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt73usb.c -@@ -1557,7 +1557,7 @@ static void rt73usb_write_beacon(struct queue_entry *entry, - /* - * Dump beacon to userspace through debugfs. - */ -- rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_BEACON, entry->skb); -+ rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_BEACON, entry); - - /* - * Write entire beacon with descriptor and padding to register. --- -2.12.1 - diff --git a/package/kernel/mac80211/patches/020-06-rt2x00-remove-queue_entry-from-skbdesc.patch b/package/kernel/mac80211/patches/020-06-rt2x00-remove-queue_entry-from-skbdesc.patch deleted file mode 100644 index d8194acd23..0000000000 --- a/package/kernel/mac80211/patches/020-06-rt2x00-remove-queue_entry-from-skbdesc.patch +++ /dev/null @@ -1,59 +0,0 @@ -From cf81db30a6edcca791b1bfa5348a162471121d11 Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Wed, 8 Feb 2017 13:51:31 +0100 -Subject: [PATCH 06/19] rt2x00: remove queue_entry from skbdesc - -queue_entry field of skbdesc is not read any more, remove it to allow -skbdesc contain other data. - -Signed-off-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt2x00queue.c | 3 --- - drivers/net/wireless/ralink/rt2x00/rt2x00queue.h | 2 -- - 2 files changed, 5 deletions(-) - -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c -index 380daf4e1b8d..e1660b92b20c 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c -@@ -83,7 +83,6 @@ struct sk_buff *rt2x00queue_alloc_rxskb(struct queue_entry *entry, gfp_t gfp) - */ - skbdesc = get_skb_frame_desc(skb); - memset(skbdesc, 0, sizeof(*skbdesc)); -- skbdesc->entry = entry; - - if (rt2x00_has_cap_flag(rt2x00dev, REQUIRE_DMA)) { - dma_addr_t skb_dma; -@@ -689,7 +688,6 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, - goto out; - } - -- skbdesc->entry = entry; - entry->skb = skb; - - /* -@@ -774,7 +772,6 @@ int rt2x00queue_update_beacon(struct rt2x00_dev *rt2x00dev, - */ - skbdesc = get_skb_frame_desc(intf->beacon->skb); - memset(skbdesc, 0, sizeof(*skbdesc)); -- skbdesc->entry = intf->beacon; - - /* - * Send beacon to hardware. -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h -index 2233b911a1d7..22d18818e850 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h -@@ -116,8 +116,6 @@ struct skb_frame_desc { - __le32 iv[2]; - - dma_addr_t skb_dma; -- -- struct queue_entry *entry; - }; - - /** --- -2.12.1 - diff --git a/package/kernel/mac80211/patches/020-07-rt2500usb-don-t-mark-register-accesses-as-inline.patch b/package/kernel/mac80211/patches/020-07-rt2500usb-don-t-mark-register-accesses-as-inline.patch deleted file mode 100644 index a82886d234..0000000000 --- a/package/kernel/mac80211/patches/020-07-rt2500usb-don-t-mark-register-accesses-as-inline.patch +++ /dev/null @@ -1,84 +0,0 @@ -From 7272416609126e8910b7f0d0e3dba008aa87830c Mon Sep 17 00:00:00 2001 -From: Arnd Bergmann -Date: Tue, 14 Feb 2017 22:28:33 +0100 -Subject: [PATCH 07/19] rt2500usb: don't mark register accesses as inline - -When CONFIG_KASAN is set, we get a rather large stack here: - -drivers/net/wireless/ralink/rt2x00/rt2500usb.c: In function 'rt2500usb_set_device_state': -drivers/net/wireless/ralink/rt2x00/rt2500usb.c:1074:1: error: the frame size of 3032 bytes is larger than 100 bytes [-Werror=frame-larger-than=] - -If we don't force those functions to be inline, the compiler can figure this -out better itself and not inline the functions when doing so would be harmful, -reducing the stack size to a merge 256 bytes. - -Note that there is another problem that manifests in this driver, as a result -of the typecheck() macro causing even larger stack frames. - -Signed-off-by: Arnd Bergmann -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt2500usb.c | 19 +++++-------------- - 1 file changed, 5 insertions(+), 14 deletions(-) - -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2500usb.c b/drivers/net/wireless/ralink/rt2x00/rt2500usb.c -index 62357465fe29..0d2670a56c4c 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2500usb.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2500usb.c -@@ -55,7 +55,7 @@ MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption."); - * If the csr_mutex is already held then the _lock variants must - * be used instead. - */ --static inline void rt2500usb_register_read(struct rt2x00_dev *rt2x00dev, -+static void rt2500usb_register_read(struct rt2x00_dev *rt2x00dev, - const unsigned int offset, - u16 *value) - { -@@ -66,7 +66,7 @@ static inline void rt2500usb_register_read(struct rt2x00_dev *rt2x00dev, - *value = le16_to_cpu(reg); - } - --static inline void rt2500usb_register_read_lock(struct rt2x00_dev *rt2x00dev, -+static void rt2500usb_register_read_lock(struct rt2x00_dev *rt2x00dev, - const unsigned int offset, - u16 *value) - { -@@ -77,16 +77,7 @@ static inline void rt2500usb_register_read_lock(struct rt2x00_dev *rt2x00dev, - *value = le16_to_cpu(reg); - } - --static inline void rt2500usb_register_multiread(struct rt2x00_dev *rt2x00dev, -- const unsigned int offset, -- void *value, const u16 length) --{ -- rt2x00usb_vendor_request_buff(rt2x00dev, USB_MULTI_READ, -- USB_VENDOR_REQUEST_IN, offset, -- value, length); --} -- --static inline void rt2500usb_register_write(struct rt2x00_dev *rt2x00dev, -+static void rt2500usb_register_write(struct rt2x00_dev *rt2x00dev, - const unsigned int offset, - u16 value) - { -@@ -96,7 +87,7 @@ static inline void rt2500usb_register_write(struct rt2x00_dev *rt2x00dev, - ®, sizeof(reg)); - } - --static inline void rt2500usb_register_write_lock(struct rt2x00_dev *rt2x00dev, -+static void rt2500usb_register_write_lock(struct rt2x00_dev *rt2x00dev, - const unsigned int offset, - u16 value) - { -@@ -106,7 +97,7 @@ static inline void rt2500usb_register_write_lock(struct rt2x00_dev *rt2x00dev, - ®, sizeof(reg), REGISTER_TIMEOUT); - } - --static inline void rt2500usb_register_multiwrite(struct rt2x00_dev *rt2x00dev, -+static void rt2500usb_register_multiwrite(struct rt2x00_dev *rt2x00dev, - const unsigned int offset, - void *value, const u16 length) - { --- -2.12.1 - diff --git a/package/kernel/mac80211/patches/020-08-rt2x00-rt2800lib-move-rt2800_drv_data-declaration-in.patch b/package/kernel/mac80211/patches/020-08-rt2x00-rt2800lib-move-rt2800_drv_data-declaration-in.patch deleted file mode 100644 index c2fa92641a..0000000000 --- a/package/kernel/mac80211/patches/020-08-rt2x00-rt2800lib-move-rt2800_drv_data-declaration-in.patch +++ /dev/null @@ -1,94 +0,0 @@ -From 96609f366c6f792421e1939c5c834abbe24eb88a Mon Sep 17 00:00:00 2001 -From: Gabor Juhos -Date: Wed, 15 Feb 2017 10:25:04 +0100 -Subject: [PATCH 08/19] rt2x00: rt2800lib: move rt2800_drv_data declaration - into rt2800lib.h - -The rt2800_drv_data structure contains driver specific -information. Move the declaration into the rt2800lib.h -header which is a more logical place for it. Also fix -the comment style to avoid checkpatch warning. - -The patch contains no functional changes, it is in -preparation for the next patch. - -Signed-off-by: Gabor Juhos -Signed-off-by: Daniel Golle -Signed-off-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt2800.h | 25 ------------------------- - drivers/net/wireless/ralink/rt2x00/rt2800lib.h | 23 +++++++++++++++++++++++ - 2 files changed, 23 insertions(+), 25 deletions(-) - -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h b/drivers/net/wireless/ralink/rt2x00/rt2800.h -index 256496bfbafb..0e7051d8132f 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2800.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h -@@ -2987,29 +2987,4 @@ enum rt2800_eeprom_word { - */ - #define BCN_TBTT_OFFSET 64 - --/* -- * Hardware has 255 WCID table entries. First 32 entries are reserved for -- * shared keys. Since parts of the pairwise key table might be shared with -- * the beacon frame buffers 6 & 7 we could only use the first 222 entries. -- */ --#define WCID_START 33 --#define WCID_END 222 --#define STA_IDS_SIZE (WCID_END - WCID_START + 2) -- --/* -- * RT2800 driver data structure -- */ --struct rt2800_drv_data { -- u8 calibration_bw20; -- u8 calibration_bw40; -- u8 bbp25; -- u8 bbp26; -- u8 txmixer_gain_24g; -- u8 txmixer_gain_5g; -- u8 max_psdu; -- unsigned int tbtt_tick; -- unsigned int ampdu_factor_cnt[4]; -- DECLARE_BITMAP(sta_ids, STA_IDS_SIZE); --}; -- - #endif /* RT2800_H */ -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -index 0a8b4df665fe..8e1ae138c3f1 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -@@ -20,6 +20,29 @@ - #ifndef RT2800LIB_H - #define RT2800LIB_H - -+/* -+ * Hardware has 255 WCID table entries. First 32 entries are reserved for -+ * shared keys. Since parts of the pairwise key table might be shared with -+ * the beacon frame buffers 6 & 7 we could only use the first 222 entries. -+ */ -+#define WCID_START 33 -+#define WCID_END 222 -+#define STA_IDS_SIZE (WCID_END - WCID_START + 2) -+ -+/* RT2800 driver data structure */ -+struct rt2800_drv_data { -+ u8 calibration_bw20; -+ u8 calibration_bw40; -+ u8 bbp25; -+ u8 bbp26; -+ u8 txmixer_gain_24g; -+ u8 txmixer_gain_5g; -+ u8 max_psdu; -+ unsigned int tbtt_tick; -+ unsigned int ampdu_factor_cnt[4]; -+ DECLARE_BITMAP(sta_ids, STA_IDS_SIZE); -+}; -+ - struct rt2800_ops { - void (*register_read)(struct rt2x00_dev *rt2x00dev, - const unsigned int offset, u32 *value); --- -2.12.1 - diff --git a/package/kernel/mac80211/patches/020-09-rt2800-identify-station-based-on-status-WCID.patch b/package/kernel/mac80211/patches/020-09-rt2800-identify-station-based-on-status-WCID.patch deleted file mode 100644 index e6c829cbf8..0000000000 --- a/package/kernel/mac80211/patches/020-09-rt2800-identify-station-based-on-status-WCID.patch +++ /dev/null @@ -1,94 +0,0 @@ -From a13d985f26f6df07d5c5c0e190477628e236babc Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Wed, 15 Feb 2017 10:25:05 +0100 -Subject: [PATCH 09/19] rt2800: identify station based on status WCID - -Add framework to identify sta based on tx status WCID. This is currently -not used, will start be utilized in the future patch. - -Signed-off-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 5 +++++ - drivers/net/wireless/ralink/rt2x00/rt2800lib.h | 1 + - drivers/net/wireless/ralink/rt2x00/rt2x00queue.h | 3 ++- - 3 files changed, 8 insertions(+), 1 deletion(-) - -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -index 8223a1520316..46405cce35e0 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -855,11 +855,13 @@ EXPORT_SYMBOL_GPL(rt2800_process_rxwi); - void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi) - { - struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; -+ struct rt2800_drv_data *drv_data = rt2x00dev->drv_data; - struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); - struct txdone_entry_desc txdesc; - u32 word; - u16 mcs, real_mcs; - int aggr, ampdu; -+ int wcid; - - /* - * Obtain the status about this packet. -@@ -872,6 +874,7 @@ void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi) - - real_mcs = rt2x00_get_field32(status, TX_STA_FIFO_MCS); - aggr = rt2x00_get_field32(status, TX_STA_FIFO_TX_AGGRE); -+ wcid = rt2x00_get_field32(status, TX_STA_FIFO_WCID); - - /* - * If a frame was meant to be sent as a single non-aggregated MPDU -@@ -1468,6 +1471,7 @@ int rt2800_sta_add(struct rt2x00_dev *rt2x00dev, struct ieee80211_vif *vif, - return 0; - - __set_bit(wcid - WCID_START, drv_data->sta_ids); -+ drv_data->wcid_to_sta[wcid - WCID_START] = sta; - - /* - * Clean up WCID attributes and write STA address to the device. -@@ -1498,6 +1502,7 @@ int rt2800_sta_remove(struct rt2x00_dev *rt2x00dev, struct ieee80211_sta *sta) - * get renewed when the WCID is reused. - */ - rt2800_config_wcid(rt2x00dev, NULL, wcid); -+ drv_data->wcid_to_sta[wcid - WCID_START] = NULL; - __clear_bit(wcid - WCID_START, drv_data->sta_ids); - - return 0; -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -index 8e1ae138c3f1..6811d677a6e7 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -@@ -41,6 +41,7 @@ struct rt2800_drv_data { - unsigned int tbtt_tick; - unsigned int ampdu_factor_cnt[4]; - DECLARE_BITMAP(sta_ids, STA_IDS_SIZE); -+ struct ieee80211_sta *wcid_to_sta[STA_IDS_SIZE]; - }; - - struct rt2800_ops { -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h -index 22d18818e850..9b297fce4692 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h -@@ -102,7 +102,7 @@ enum skb_frame_desc_flags { - * of the scope of the skb->data pointer. - * @iv: IV/EIV data used during encryption/decryption. - * @skb_dma: (PCI-only) the DMA address associated with the sk buffer. -- * @entry: The entry to which this sk buffer belongs. -+ * @sta: The station where sk buffer was sent. - */ - struct skb_frame_desc { - u8 flags; -@@ -116,6 +116,7 @@ struct skb_frame_desc { - __le32 iv[2]; - - dma_addr_t skb_dma; -+ struct ieee80211_sta *sta; - }; - - /** --- -2.12.1 - diff --git a/package/kernel/mac80211/patches/020-10-rt2x00-separte-filling-tx-status-from-rt2x00lib_txdo.patch b/package/kernel/mac80211/patches/020-10-rt2x00-separte-filling-tx-status-from-rt2x00lib_txdo.patch deleted file mode 100644 index 278d2d6071..0000000000 --- a/package/kernel/mac80211/patches/020-10-rt2x00-separte-filling-tx-status-from-rt2x00lib_txdo.patch +++ /dev/null @@ -1,178 +0,0 @@ -From 5edb05afebba8f488a30db29550e55c42eea6d6a Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Wed, 15 Feb 2017 10:25:06 +0100 -Subject: [PATCH 10/19] rt2x00: separte filling tx status from rt2x00lib_txdone - -This makes rt2x00lib_txdone a bit simpler and will allow to reuse code -in different variant of txdone which I'm preparing. - -Signed-off-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | 141 +++++++++++++------------ - 1 file changed, 76 insertions(+), 65 deletions(-) - -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -index dd6678109b7e..b5d90fefc96b 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -@@ -313,73 +313,14 @@ static inline int rt2x00lib_txdone_bar_status(struct queue_entry *entry) - return ret; - } - --void rt2x00lib_txdone(struct queue_entry *entry, -- struct txdone_entry_desc *txdesc) -+static void rt2x00lib_fill_tx_status(struct rt2x00_dev *rt2x00dev, -+ struct ieee80211_tx_info *tx_info, -+ struct skb_frame_desc *skbdesc, -+ struct txdone_entry_desc *txdesc, -+ bool success) - { -- struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; -- struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(entry->skb); -- struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); -- unsigned int header_length, i; - u8 rate_idx, rate_flags, retry_rates; -- u8 skbdesc_flags = skbdesc->flags; -- bool success; -- -- /* -- * Unmap the skb. -- */ -- rt2x00queue_unmap_skb(entry); -- -- /* -- * Remove the extra tx headroom from the skb. -- */ -- skb_pull(entry->skb, rt2x00dev->extra_tx_headroom); -- -- /* -- * Signal that the TX descriptor is no longer in the skb. -- */ -- skbdesc->flags &= ~SKBDESC_DESC_IN_SKB; -- -- /* -- * Determine the length of 802.11 header. -- */ -- header_length = ieee80211_get_hdrlen_from_skb(entry->skb); -- -- /* -- * Remove L2 padding which was added during -- */ -- if (rt2x00_has_cap_flag(rt2x00dev, REQUIRE_L2PAD)) -- rt2x00queue_remove_l2pad(entry->skb, header_length); -- -- /* -- * If the IV/EIV data was stripped from the frame before it was -- * passed to the hardware, we should now reinsert it again because -- * mac80211 will expect the same data to be present it the -- * frame as it was passed to us. -- */ -- if (rt2x00_has_cap_hw_crypto(rt2x00dev)) -- rt2x00crypto_tx_insert_iv(entry->skb, header_length); -- -- /* -- * Send frame to debugfs immediately, after this call is completed -- * we are going to overwrite the skb->cb array. -- */ -- rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_TXDONE, entry); -- -- /* -- * Determine if the frame has been successfully transmitted and -- * remove BARs from our check list while checking for their -- * TX status. -- */ -- success = -- rt2x00lib_txdone_bar_status(entry) || -- test_bit(TXDONE_SUCCESS, &txdesc->flags) || -- test_bit(TXDONE_UNKNOWN, &txdesc->flags); -- -- /* -- * Update TX statistics. -- */ -- rt2x00dev->link.qual.tx_success += success; -- rt2x00dev->link.qual.tx_failed += !success; -+ int i; - - rate_idx = skbdesc->tx_rate_idx; - rate_flags = skbdesc->tx_rate_flags; -@@ -448,6 +389,76 @@ void rt2x00lib_txdone(struct queue_entry *entry, - else - rt2x00dev->low_level_stats.dot11RTSFailureCount++; - } -+} -+ -+void rt2x00lib_txdone(struct queue_entry *entry, -+ struct txdone_entry_desc *txdesc) -+{ -+ struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; -+ struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(entry->skb); -+ struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); -+ u8 skbdesc_flags = skbdesc->flags; -+ unsigned int header_length; -+ bool success; -+ -+ /* -+ * Unmap the skb. -+ */ -+ rt2x00queue_unmap_skb(entry); -+ -+ /* -+ * Remove the extra tx headroom from the skb. -+ */ -+ skb_pull(entry->skb, rt2x00dev->extra_tx_headroom); -+ -+ /* -+ * Signal that the TX descriptor is no longer in the skb. -+ */ -+ skbdesc->flags &= ~SKBDESC_DESC_IN_SKB; -+ -+ /* -+ * Determine the length of 802.11 header. -+ */ -+ header_length = ieee80211_get_hdrlen_from_skb(entry->skb); -+ -+ /* -+ * Remove L2 padding which was added during -+ */ -+ if (rt2x00_has_cap_flag(rt2x00dev, REQUIRE_L2PAD)) -+ rt2x00queue_remove_l2pad(entry->skb, header_length); -+ -+ /* -+ * If the IV/EIV data was stripped from the frame before it was -+ * passed to the hardware, we should now reinsert it again because -+ * mac80211 will expect the same data to be present it the -+ * frame as it was passed to us. -+ */ -+ if (rt2x00_has_cap_hw_crypto(rt2x00dev)) -+ rt2x00crypto_tx_insert_iv(entry->skb, header_length); -+ -+ /* -+ * Send frame to debugfs immediately, after this call is completed -+ * we are going to overwrite the skb->cb array. -+ */ -+ rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_TXDONE, entry); -+ -+ /* -+ * Determine if the frame has been successfully transmitted and -+ * remove BARs from our check list while checking for their -+ * TX status. -+ */ -+ success = -+ rt2x00lib_txdone_bar_status(entry) || -+ test_bit(TXDONE_SUCCESS, &txdesc->flags) || -+ test_bit(TXDONE_UNKNOWN, &txdesc->flags); -+ -+ /* -+ * Update TX statistics. -+ */ -+ rt2x00dev->link.qual.tx_success += success; -+ rt2x00dev->link.qual.tx_failed += !success; -+ -+ rt2x00lib_fill_tx_status(rt2x00dev, tx_info, skbdesc, txdesc, success); - - /* - * Only send the status report to mac80211 when it's a frame --- -2.12.1 - diff --git a/package/kernel/mac80211/patches/020-11-rt2x00-separte-clearing-entry-from-rt2x00lib_txdone.patch b/package/kernel/mac80211/patches/020-11-rt2x00-separte-clearing-entry-from-rt2x00lib_txdone.patch deleted file mode 100644 index b28d894fc6..0000000000 --- a/package/kernel/mac80211/patches/020-11-rt2x00-separte-clearing-entry-from-rt2x00lib_txdone.patch +++ /dev/null @@ -1,88 +0,0 @@ -From 56646adf9cd60b488ddc5633a2d9aa1f30efa5db Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Wed, 15 Feb 2017 10:25:07 +0100 -Subject: [PATCH 11/19] rt2x00: separte clearing entry from rt2x00lib_txdone - -This makes rt2x00lib_txdone a bit simpler and will allow to reuse -code in different variant of txdone which I'm preparing. - -Signed-off-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | 51 +++++++++++++++----------- - 1 file changed, 29 insertions(+), 22 deletions(-) - -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -index b5d90fefc96b..03b368ac9cb6 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -@@ -391,6 +391,32 @@ static void rt2x00lib_fill_tx_status(struct rt2x00_dev *rt2x00dev, - } - } - -+static void rt2x00lib_clear_entry(struct rt2x00_dev *rt2x00dev, -+ struct queue_entry *entry) -+{ -+ /* -+ * Make this entry available for reuse. -+ */ -+ entry->skb = NULL; -+ entry->flags = 0; -+ -+ rt2x00dev->ops->lib->clear_entry(entry); -+ -+ rt2x00queue_index_inc(entry, Q_INDEX_DONE); -+ -+ /* -+ * If the data queue was below the threshold before the txdone -+ * handler we must make sure the packet queue in the mac80211 stack -+ * is reenabled when the txdone handler has finished. This has to be -+ * serialized with rt2x00mac_tx(), otherwise we can wake up queue -+ * before it was stopped. -+ */ -+ spin_lock_bh(&entry->queue->tx_lock); -+ if (!rt2x00queue_threshold(entry->queue)) -+ rt2x00queue_unpause_queue(entry->queue); -+ spin_unlock_bh(&entry->queue->tx_lock); -+} -+ - void rt2x00lib_txdone(struct queue_entry *entry, - struct txdone_entry_desc *txdesc) - { -@@ -471,30 +497,11 @@ void rt2x00lib_txdone(struct queue_entry *entry, - ieee80211_tx_status(rt2x00dev->hw, entry->skb); - else - ieee80211_tx_status_ni(rt2x00dev->hw, entry->skb); -- } else -+ } else { - dev_kfree_skb_any(entry->skb); -+ } - -- /* -- * Make this entry available for reuse. -- */ -- entry->skb = NULL; -- entry->flags = 0; -- -- rt2x00dev->ops->lib->clear_entry(entry); -- -- rt2x00queue_index_inc(entry, Q_INDEX_DONE); -- -- /* -- * If the data queue was below the threshold before the txdone -- * handler we must make sure the packet queue in the mac80211 stack -- * is reenabled when the txdone handler has finished. This has to be -- * serialized with rt2x00mac_tx(), otherwise we can wake up queue -- * before it was stopped. -- */ -- spin_lock_bh(&entry->queue->tx_lock); -- if (!rt2x00queue_threshold(entry->queue)) -- rt2x00queue_unpause_queue(entry->queue); -- spin_unlock_bh(&entry->queue->tx_lock); -+ rt2x00lib_clear_entry(rt2x00dev, entry); - } - EXPORT_SYMBOL_GPL(rt2x00lib_txdone); - --- -2.12.1 - diff --git a/package/kernel/mac80211/patches/020-12-rt2x00-add-txdone-nomatch-function.patch b/package/kernel/mac80211/patches/020-12-rt2x00-add-txdone-nomatch-function.patch deleted file mode 100644 index 7bec546a9e..0000000000 --- a/package/kernel/mac80211/patches/020-12-rt2x00-add-txdone-nomatch-function.patch +++ /dev/null @@ -1,92 +0,0 @@ -From a09305d052166cb489402a63a5d275e954e0b923 Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Wed, 15 Feb 2017 10:25:08 +0100 -Subject: [PATCH 12/19] rt2x00: add txdone nomatch function - -This txdone nomatch function will be used when we get status from the HW, -but we could not match it with any sent skb. - -Signed-off-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt2x00.h | 2 ++ - drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | 50 ++++++++++++++++++++++++++ - 2 files changed, 52 insertions(+) - -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00.h b/drivers/net/wireless/ralink/rt2x00/rt2x00.h -index 340787894c69..91ba10fdf732 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h -@@ -1425,6 +1425,8 @@ void rt2x00lib_dmastart(struct queue_entry *entry); - void rt2x00lib_dmadone(struct queue_entry *entry); - void rt2x00lib_txdone(struct queue_entry *entry, - struct txdone_entry_desc *txdesc); -+void rt2x00lib_txdone_nomatch(struct queue_entry *entry, -+ struct txdone_entry_desc *txdesc); - void rt2x00lib_txdone_noinfo(struct queue_entry *entry, u32 status); - void rt2x00lib_rxdone(struct queue_entry *entry, gfp_t gfp); - -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -index 03b368ac9cb6..90fc259fb5bc 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -@@ -417,6 +417,56 @@ static void rt2x00lib_clear_entry(struct rt2x00_dev *rt2x00dev, - spin_unlock_bh(&entry->queue->tx_lock); - } - -+void rt2x00lib_txdone_nomatch(struct queue_entry *entry, -+ struct txdone_entry_desc *txdesc) -+{ -+ struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; -+ struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); -+ struct ieee80211_tx_info txinfo = {}; -+ bool success; -+ -+ /* -+ * Unmap the skb. -+ */ -+ rt2x00queue_unmap_skb(entry); -+ -+ /* -+ * Signal that the TX descriptor is no longer in the skb. -+ */ -+ skbdesc->flags &= ~SKBDESC_DESC_IN_SKB; -+ -+ /* -+ * Send frame to debugfs immediately, after this call is completed -+ * we are going to overwrite the skb->cb array. -+ */ -+ rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_TXDONE, entry); -+ -+ /* -+ * Determine if the frame has been successfully transmitted and -+ * remove BARs from our check list while checking for their -+ * TX status. -+ */ -+ success = -+ rt2x00lib_txdone_bar_status(entry) || -+ test_bit(TXDONE_SUCCESS, &txdesc->flags); -+ -+ if (!test_bit(TXDONE_UNKNOWN, &txdesc->flags)) { -+ /* -+ * Update TX statistics. -+ */ -+ rt2x00dev->link.qual.tx_success += success; -+ rt2x00dev->link.qual.tx_failed += !success; -+ -+ rt2x00lib_fill_tx_status(rt2x00dev, &txinfo, skbdesc, txdesc, -+ success); -+ ieee80211_tx_status_noskb(rt2x00dev->hw, skbdesc->sta, &txinfo); -+ } -+ -+ dev_kfree_skb_any(entry->skb); -+ rt2x00lib_clear_entry(rt2x00dev, entry); -+} -+EXPORT_SYMBOL_GPL(rt2x00lib_txdone_nomatch); -+ - void rt2x00lib_txdone(struct queue_entry *entry, - struct txdone_entry_desc *txdesc) - { --- -2.12.1 - diff --git a/package/kernel/mac80211/patches/020-13-rt2x00-fixup-fill_tx_status-for-nomatch-case.patch b/package/kernel/mac80211/patches/020-13-rt2x00-fixup-fill_tx_status-for-nomatch-case.patch deleted file mode 100644 index bb35f2d300..0000000000 --- a/package/kernel/mac80211/patches/020-13-rt2x00-fixup-fill_tx_status-for-nomatch-case.patch +++ /dev/null @@ -1,54 +0,0 @@ -From ec80ad70d778af7665992672896633ebd3b02ac8 Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Wed, 15 Feb 2017 10:25:09 +0100 -Subject: [PATCH 13/19] rt2x00: fixup fill_tx_status for nomatch case - -Add bits rt2x00lib_fill_tx_status() when filling status in nomatch -case and hopefully do not break the function for existing cases. - -Signed-off-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | 6 +++++- - drivers/net/wireless/ralink/rt2x00/rt2x00queue.h | 1 + - 2 files changed, 6 insertions(+), 1 deletion(-) - -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -index 90fc259fb5bc..e95d2aad3b3f 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -@@ -357,6 +357,9 @@ static void rt2x00lib_fill_tx_status(struct rt2x00_dev *rt2x00dev, - if (i < (IEEE80211_TX_MAX_RATES - 1)) - tx_info->status.rates[i].idx = -1; /* terminate */ - -+ if (test_bit(TXDONE_NO_ACK_REQ, &txdesc->flags)) -+ tx_info->flags |= IEEE80211_TX_CTL_NO_ACK; -+ - if (!(tx_info->flags & IEEE80211_TX_CTL_NO_ACK)) { - if (success) - tx_info->flags |= IEEE80211_TX_STAT_ACK; -@@ -375,7 +378,8 @@ static void rt2x00lib_fill_tx_status(struct rt2x00_dev *rt2x00dev, - */ - if (test_bit(TXDONE_AMPDU, &txdesc->flags) || - tx_info->flags & IEEE80211_TX_CTL_AMPDU) { -- tx_info->flags |= IEEE80211_TX_STAT_AMPDU; -+ tx_info->flags |= IEEE80211_TX_STAT_AMPDU | -+ IEEE80211_TX_CTL_AMPDU; - tx_info->status.ampdu_len = 1; - tx_info->status.ampdu_ack_len = success ? 1 : 0; - -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h -index 9b297fce4692..c78fb8c8838a 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h -@@ -215,6 +215,7 @@ enum txdone_entry_desc_flags { - TXDONE_FAILURE, - TXDONE_EXCESSIVE_RETRY, - TXDONE_AMPDU, -+ TXDONE_NO_ACK_REQ, - }; - - /** --- -2.12.1 - diff --git a/package/kernel/mac80211/patches/020-14-rt2x00-use-txdone_nomatch-on-rt2800usb.patch b/package/kernel/mac80211/patches/020-14-rt2x00-use-txdone_nomatch-on-rt2800usb.patch deleted file mode 100644 index f4e4b8b075..0000000000 --- a/package/kernel/mac80211/patches/020-14-rt2x00-use-txdone_nomatch-on-rt2800usb.patch +++ /dev/null @@ -1,191 +0,0 @@ -From 293dff78ee058ec1e0b90e05a803c512b6a2097f Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Wed, 15 Feb 2017 10:25:10 +0100 -Subject: [PATCH 14/19] rt2x00: use txdone_nomatch on rt2800usb - -If we do not match skb entry, provide tx status via nomatch procedure. - -Currently in that case we do rt2x00lib_txdone_noinfo(TXDONE_NOINFO), -which actually assume that entry->skb was posted without retries and -provide rate saved in skb desc as successful. Patch changed that to -rate read from TX_STAT_FIFO, however still do not provide correct -number of retries. - -On SoC/PCI devices we keep providing status via standard txdone -procedure, no change in those devices, though we should thing about it. - -Signed-off-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 31 ++++++++++++++++++++----- - drivers/net/wireless/ralink/rt2x00/rt2800lib.h | 3 ++- - drivers/net/wireless/ralink/rt2x00/rt2800mmio.c | 2 +- - drivers/net/wireless/ralink/rt2x00/rt2800usb.c | 18 ++++++-------- - 4 files changed, 35 insertions(+), 19 deletions(-) - -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -index 46405cce35e0..4a7bec708a13 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -852,7 +852,8 @@ void rt2800_process_rxwi(struct queue_entry *entry, - } - EXPORT_SYMBOL_GPL(rt2800_process_rxwi); - --void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi) -+void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi, -+ bool match) - { - struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; - struct rt2800_drv_data *drv_data = rt2x00dev->drv_data; -@@ -860,8 +861,7 @@ void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi) - struct txdone_entry_desc txdesc; - u32 word; - u16 mcs, real_mcs; -- int aggr, ampdu; -- int wcid; -+ int aggr, ampdu, wcid, ack_req; - - /* - * Obtain the status about this packet. -@@ -875,6 +875,7 @@ void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi) - real_mcs = rt2x00_get_field32(status, TX_STA_FIFO_MCS); - aggr = rt2x00_get_field32(status, TX_STA_FIFO_TX_AGGRE); - wcid = rt2x00_get_field32(status, TX_STA_FIFO_WCID); -+ ack_req = rt2x00_get_field32(status, TX_STA_FIFO_TX_ACK_REQUIRED); - - /* - * If a frame was meant to be sent as a single non-aggregated MPDU -@@ -891,8 +892,12 @@ void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi) - * Hence, replace the requested rate with the real tx rate to not - * confuse the rate control algortihm by providing clearly wrong - * data. -- */ -- if (unlikely(aggr == 1 && ampdu == 0 && real_mcs != mcs)) { -+ * -+ * FIXME: if we do not find matching entry, we tell that frame was -+ * posted without any retries. We need to find a way to fix that -+ * and provide retry count. -+ */ -+ if (unlikely((aggr == 1 && ampdu == 0 && real_mcs != mcs)) || !match) { - skbdesc->tx_rate_idx = real_mcs; - mcs = real_mcs; - } -@@ -900,6 +905,9 @@ void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi) - if (aggr == 1 || ampdu == 1) - __set_bit(TXDONE_AMPDU, &txdesc.flags); - -+ if (!ack_req) -+ __set_bit(TXDONE_NO_ACK_REQ, &txdesc.flags); -+ - /* - * Ralink has a retry mechanism using a global fallback - * table. We setup this fallback table to try the immediate -@@ -931,7 +939,18 @@ void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi) - if (txdesc.retry) - __set_bit(TXDONE_FALLBACK, &txdesc.flags); - -- rt2x00lib_txdone(entry, &txdesc); -+ if (!match) { -+ /* RCU assures non-null sta will not be freed by mac80211. */ -+ rcu_read_lock(); -+ if (likely(wcid >= WCID_START && wcid <= WCID_END)) -+ skbdesc->sta = drv_data->wcid_to_sta[wcid - WCID_START]; -+ else -+ skbdesc->sta = NULL; -+ rt2x00lib_txdone_nomatch(entry, &txdesc); -+ rcu_read_unlock(); -+ } else { -+ rt2x00lib_txdone(entry, &txdesc); -+ } - } - EXPORT_SYMBOL_GPL(rt2800_txdone_entry); - -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -index 6811d677a6e7..d9ef260d542a 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -@@ -191,7 +191,8 @@ void rt2800_write_tx_data(struct queue_entry *entry, - struct txentry_desc *txdesc); - void rt2800_process_rxwi(struct queue_entry *entry, struct rxdone_entry_desc *txdesc); - --void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32* txwi); -+void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi, -+ bool match); - - void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc); - void rt2800_clear_beacon(struct queue_entry *entry); -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c -index de4790b41be7..3ab3b5323897 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c -@@ -239,7 +239,7 @@ static bool rt2800mmio_txdone_release_entries(struct queue_entry *entry, - { - if (test_bit(ENTRY_DATA_STATUS_SET, &entry->flags)) { - rt2800_txdone_entry(entry, entry->status, -- rt2800mmio_get_txwi(entry)); -+ rt2800mmio_get_txwi(entry), true); - return false; - } - -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800usb.c b/drivers/net/wireless/ralink/rt2x00/rt2800usb.c -index 205a7b8ac8a7..f11e3f532a84 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2800usb.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800usb.c -@@ -501,8 +501,7 @@ static int rt2800usb_get_tx_data_len(struct queue_entry *entry) - /* - * TX control handlers - */ --static enum txdone_entry_desc_flags --rt2800usb_txdone_entry_check(struct queue_entry *entry, u32 reg) -+static bool rt2800usb_txdone_entry_check(struct queue_entry *entry, u32 reg) - { - __le32 *txwi; - u32 word; -@@ -515,7 +514,7 @@ rt2800usb_txdone_entry_check(struct queue_entry *entry, u32 reg) - * frame. - */ - if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags)) -- return TXDONE_FAILURE; -+ return false; - - wcid = rt2x00_get_field32(reg, TX_STA_FIFO_WCID); - ack = rt2x00_get_field32(reg, TX_STA_FIFO_TX_ACK_REQUIRED); -@@ -537,10 +536,10 @@ rt2800usb_txdone_entry_check(struct queue_entry *entry, u32 reg) - rt2x00_dbg(entry->queue->rt2x00dev, - "TX status report missed for queue %d entry %d\n", - entry->queue->qid, entry->entry_idx); -- return TXDONE_UNKNOWN; -+ return false; - } - -- return TXDONE_SUCCESS; -+ return true; - } - - static void rt2800usb_txdone(struct rt2x00_dev *rt2x00dev) -@@ -549,7 +548,7 @@ static void rt2800usb_txdone(struct rt2x00_dev *rt2x00dev) - struct queue_entry *entry; - u32 reg; - u8 qid; -- enum txdone_entry_desc_flags done_status; -+ bool match; - - while (kfifo_get(&rt2x00dev->txstatus_fifo, ®)) { - /* -@@ -574,11 +573,8 @@ static void rt2800usb_txdone(struct rt2x00_dev *rt2x00dev) - break; - } - -- done_status = rt2800usb_txdone_entry_check(entry, reg); -- if (likely(done_status == TXDONE_SUCCESS)) -- rt2800_txdone_entry(entry, reg, rt2800usb_get_txwi(entry)); -- else -- rt2x00lib_txdone_noinfo(entry, done_status); -+ match = rt2800usb_txdone_entry_check(entry, reg); -+ rt2800_txdone_entry(entry, reg, rt2800usb_get_txwi(entry), match); - } - } - --- -2.12.1 - diff --git a/package/kernel/mac80211/patches/020-15-rt2800-status-based-rate-flags-for-nomatch-case.patch b/package/kernel/mac80211/patches/020-15-rt2800-status-based-rate-flags-for-nomatch-case.patch deleted file mode 100644 index 4e18dc8e2a..0000000000 --- a/package/kernel/mac80211/patches/020-15-rt2800-status-based-rate-flags-for-nomatch-case.patch +++ /dev/null @@ -1,88 +0,0 @@ -From 9d7a7a4d2b02bcd30fb5fe4270278212353cc332 Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Wed, 15 Feb 2017 10:25:11 +0100 -Subject: [PATCH 15/19] rt2800: status based rate flags for nomatch case - -We use skb_desc->tx_rate_flags from entry as rate[].flags even if -skb does not match status. Patch corrects flags and also fixes -mcs for legacy rates. - -rt2800_rate_from_status() is based on Felix's mt76 -mt76x2_mac_process_tx_rate() function. - -Signed-off-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt2800.h | 2 ++ - drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 35 +++++++++++++++++++++++++- - 2 files changed, 36 insertions(+), 1 deletion(-) - -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h b/drivers/net/wireless/ralink/rt2x00/rt2800.h -index 0e7051d8132f..480b08601785 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2800.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h -@@ -1760,6 +1760,8 @@ - #define TX_STA_FIFO_WCID FIELD32(0x0000ff00) - #define TX_STA_FIFO_SUCCESS_RATE FIELD32(0xffff0000) - #define TX_STA_FIFO_MCS FIELD32(0x007f0000) -+#define TX_STA_FIFO_BW FIELD32(0x00800000) -+#define TX_STA_FIFO_SGI FIELD32(0x01000000) - #define TX_STA_FIFO_PHYMODE FIELD32(0xc0000000) - - /* -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -index 4a7bec708a13..8d00c599e47a 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -852,6 +852,39 @@ void rt2800_process_rxwi(struct queue_entry *entry, - } - EXPORT_SYMBOL_GPL(rt2800_process_rxwi); - -+static void rt2800_rate_from_status(struct skb_frame_desc *skbdesc, -+ u32 status, enum nl80211_band band) -+{ -+ u8 flags = 0; -+ u8 idx = rt2x00_get_field32(status, TX_STA_FIFO_MCS); -+ -+ switch (rt2x00_get_field32(status, TX_STA_FIFO_PHYMODE)) { -+ case RATE_MODE_HT_GREENFIELD: -+ flags |= IEEE80211_TX_RC_GREEN_FIELD; -+ /* fall through */ -+ case RATE_MODE_HT_MIX: -+ flags |= IEEE80211_TX_RC_MCS; -+ break; -+ case RATE_MODE_OFDM: -+ if (band == NL80211_BAND_2GHZ) -+ idx += 4; -+ break; -+ case RATE_MODE_CCK: -+ if (idx >= 8) -+ idx -= 8; -+ break; -+ } -+ -+ if (rt2x00_get_field32(status, TX_STA_FIFO_BW)) -+ flags |= IEEE80211_TX_RC_40_MHZ_WIDTH; -+ -+ if (rt2x00_get_field32(status, TX_STA_FIFO_SGI)) -+ flags |= IEEE80211_TX_RC_SHORT_GI; -+ -+ skbdesc->tx_rate_idx = idx; -+ skbdesc->tx_rate_flags = flags; -+} -+ - void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi, - bool match) - { -@@ -898,7 +931,7 @@ void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi, - * and provide retry count. - */ - if (unlikely((aggr == 1 && ampdu == 0 && real_mcs != mcs)) || !match) { -- skbdesc->tx_rate_idx = real_mcs; -+ rt2800_rate_from_status(skbdesc, status, rt2x00dev->curr_band); - mcs = real_mcs; - } - --- -2.12.1 - diff --git a/package/kernel/mac80211/patches/020-16-rt2800-use-TXOP_BACKOFF-for-probe-frames.patch b/package/kernel/mac80211/patches/020-16-rt2800-use-TXOP_BACKOFF-for-probe-frames.patch deleted file mode 100644 index 31d79bb751..0000000000 --- a/package/kernel/mac80211/patches/020-16-rt2800-use-TXOP_BACKOFF-for-probe-frames.patch +++ /dev/null @@ -1,43 +0,0 @@ -From fb47ada8dc3c30c8e7b415da155742b49536c61e Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Wed, 15 Feb 2017 10:25:12 +0100 -Subject: [PATCH 16/19] rt2800: use TXOP_BACKOFF for probe frames - -Even if we do not set AMPDU bit in TXWI, device still can aggregate -frame and send it with rate not corresponding to requested. That mean -we can do not sent probe frames with requested rate. To prevent that -use TXOP_BACKOFF for probe frames. - -Signed-off-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt2x00queue.c | 7 ++++--- - 1 file changed, 4 insertions(+), 3 deletions(-) - -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c -index e1660b92b20c..a2c1ca5c76d1 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c -@@ -372,15 +372,16 @@ static void rt2x00queue_create_tx_descriptor_ht(struct rt2x00_dev *rt2x00dev, - - /* - * Determine IFS values -- * - Use TXOP_BACKOFF for management frames except beacons -+ * - Use TXOP_BACKOFF for probe and management frames except beacons - * - Use TXOP_SIFS for fragment bursts - * - Use TXOP_HTTXOP for everything else - * - * Note: rt2800 devices won't use CTS protection (if used) - * for frames not transmitted with TXOP_HTTXOP - */ -- if (ieee80211_is_mgmt(hdr->frame_control) && -- !ieee80211_is_beacon(hdr->frame_control)) -+ if ((ieee80211_is_mgmt(hdr->frame_control) && -+ !ieee80211_is_beacon(hdr->frame_control)) || -+ (tx_info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE)) - txdesc->u.ht.txop = TXOP_BACKOFF; - else if (!(tx_info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT)) - txdesc->u.ht.txop = TXOP_SIFS; --- -2.12.1 - diff --git a/package/kernel/mac80211/patches/020-17-rt2x00-fix-rt2x00debug_dump_frame-comment.patch b/package/kernel/mac80211/patches/020-17-rt2x00-fix-rt2x00debug_dump_frame-comment.patch deleted file mode 100644 index 4e53092d12..0000000000 --- a/package/kernel/mac80211/patches/020-17-rt2x00-fix-rt2x00debug_dump_frame-comment.patch +++ /dev/null @@ -1,28 +0,0 @@ -From dd35cc0896faff5ed9d22eac9ea4a1920e2eec0c Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Wed, 15 Feb 2017 10:25:13 +0100 -Subject: [PATCH 17/19] rt2x00: fix rt2x00debug_dump_frame comment - -Reported-by: Jeroen Roovers -Signed-off-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt2x00.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00.h b/drivers/net/wireless/ralink/rt2x00/rt2x00.h -index 91ba10fdf732..ce340bfd71a0 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h -@@ -1396,7 +1396,7 @@ void rt2x00queue_flush_queues(struct rt2x00_dev *rt2x00dev, bool drop); - * rt2x00debug_dump_frame - Dump a frame to userspace through debugfs. - * @rt2x00dev: Pointer to &struct rt2x00_dev. - * @type: The type of frame that is being dumped. -- * @skb: The skb containing the frame to be dumped. -+ * @entry: The queue entry containing the frame to be dumped. - */ - #ifdef CPTCFG_RT2X00_LIB_DEBUGFS - void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev, --- -2.12.1 - diff --git a/package/kernel/mac80211/patches/020-18-rt2x00-fix-TX_PWR_CFG_4-register-definition.patch b/package/kernel/mac80211/patches/020-18-rt2x00-fix-TX_PWR_CFG_4-register-definition.patch deleted file mode 100644 index 3cf342d690..0000000000 --- a/package/kernel/mac80211/patches/020-18-rt2x00-fix-TX_PWR_CFG_4-register-definition.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 5ce33b603063f36272fcfb1b4a5fde69f46eca88 Mon Sep 17 00:00:00 2001 -From: Daniel Golle -Date: Thu, 9 Mar 2017 00:54:22 +0100 -Subject: [PATCH 18/19] rt2x00: fix TX_PWR_CFG_4 register definition - -Some of the macros used to describe the TX_PWR_CFG_4 register accidentally -refer to TX_PWR_CFG_3, probably a copy&paste error. Fix that. - -Signed-off-by: Daniel Golle -Acked-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt2800.h | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h b/drivers/net/wireless/ralink/rt2x00/rt2800.h -index 480b08601785..fd1dbd956bad 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2800.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h -@@ -1171,10 +1171,10 @@ - #define TX_PWR_CFG_4_UKNOWN7 FIELD32(0x00000f00) - #define TX_PWR_CFG_4_UKNOWN8 FIELD32(0x0000f000) - /* bits for 3T devices */ --#define TX_PWR_CFG_3_STBC4_CH0 FIELD32(0x0000000f) --#define TX_PWR_CFG_3_STBC4_CH1 FIELD32(0x000000f0) --#define TX_PWR_CFG_3_STBC6_CH0 FIELD32(0x00000f00) --#define TX_PWR_CFG_3_STBC6_CH1 FIELD32(0x0000f000) -+#define TX_PWR_CFG_4_STBC4_CH0 FIELD32(0x0000000f) -+#define TX_PWR_CFG_4_STBC4_CH1 FIELD32(0x000000f0) -+#define TX_PWR_CFG_4_STBC6_CH0 FIELD32(0x00000f00) -+#define TX_PWR_CFG_4_STBC6_CH1 FIELD32(0x0000f000) - - /* - * TX_PIN_CFG: --- -2.12.1 - diff --git a/package/kernel/mac80211/patches/020-19-rt2x00-add-support-for-MT7620.patch b/package/kernel/mac80211/patches/020-19-rt2x00-add-support-for-MT7620.patch deleted file mode 100644 index 7b99312744..0000000000 --- a/package/kernel/mac80211/patches/020-19-rt2x00-add-support-for-MT7620.patch +++ /dev/null @@ -1,2077 +0,0 @@ -From 41977e86c984fcdddb454a3d7887de5d47b5f530 Mon Sep 17 00:00:00 2001 -From: Roman Yeryomin -Date: Tue, 21 Mar 2017 00:43:00 +0100 -Subject: [PATCH 19/19] rt2x00: add support for MT7620 - -Basic support for MT7620 built-in wireless radio was added to -OpenWrt in r41441. It has seen some heavy cleaning and refactoring -since in order to match the Kernel's code quality standards. - -Signed-off-by: Roman Yeryomin -Signed-off-by: Daniel Golle -Acked-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/Kconfig | 2 +- - drivers/net/wireless/ralink/rt2x00/rt2800.h | 177 +++ - drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 1421 +++++++++++++++++++++++- - drivers/net/wireless/ralink/rt2x00/rt2800lib.h | 4 + - drivers/net/wireless/ralink/rt2x00/rt2x00.h | 1 + - 5 files changed, 1578 insertions(+), 27 deletions(-) - -diff --git a/drivers/net/wireless/ralink/rt2x00/Kconfig b/drivers/net/wireless/ralink/rt2x00/Kconfig -index de62f5dcb62f..a1d1cfe214d2 100644 ---- a/drivers/net/wireless/ralink/rt2x00/Kconfig -+++ b/drivers/net/wireless/ralink/rt2x00/Kconfig -@@ -210,7 +210,7 @@ endif - config RT2800SOC - tristate "Ralink WiSoC support" - depends on m -- depends on SOC_RT288X || SOC_RT305X -+ depends on SOC_RT288X || SOC_RT305X || SOC_MT7620 - select RT2X00_LIB_SOC - select RT2X00_LIB_MMIO - select RT2X00_LIB_CRYPTO -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800.h b/drivers/net/wireless/ralink/rt2x00/rt2800.h -index fd1dbd956bad..6a8c93fb6a43 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2800.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h -@@ -79,6 +79,7 @@ - #define RF5372 0x5372 - #define RF5390 0x5390 - #define RF5392 0x5392 -+#define RF7620 0x7620 - - /* - * Chipset revisions. -@@ -639,6 +640,24 @@ - #define RF_CSR_CFG_BUSY FIELD32(0x00020000) - - /* -+ * MT7620 RF registers (reversed order) -+ */ -+#define RF_CSR_CFG_DATA_MT7620 FIELD32(0x0000ff00) -+#define RF_CSR_CFG_REGNUM_MT7620 FIELD32(0x03ff0000) -+#define RF_CSR_CFG_WRITE_MT7620 FIELD32(0x00000010) -+#define RF_CSR_CFG_BUSY_MT7620 FIELD32(0x00000001) -+ -+/* undocumented registers for calibration of new MAC */ -+#define RF_CONTROL0 0x0518 -+#define RF_BYPASS0 0x051c -+#define RF_CONTROL1 0x0520 -+#define RF_BYPASS1 0x0524 -+#define RF_CONTROL2 0x0528 -+#define RF_BYPASS2 0x052c -+#define RF_CONTROL3 0x0530 -+#define RF_BYPASS3 0x0534 -+ -+/* - * EFUSE_CSR: RT30x0 EEPROM - */ - #define EFUSE_CTRL 0x0580 -@@ -1022,6 +1041,16 @@ - #define AUTOWAKEUP_CFG_AUTOWAKE FIELD32(0x00008000) - - /* -+ * MIMO_PS_CFG: MIMO Power-save Configuration -+ */ -+#define MIMO_PS_CFG 0x1210 -+#define MIMO_PS_CFG_MMPS_BB_EN FIELD32(0x00000001) -+#define MIMO_PS_CFG_MMPS_RX_ANT_NUM FIELD32(0x00000006) -+#define MIMO_PS_CFG_MMPS_RF_EN FIELD32(0x00000008) -+#define MIMO_PS_CFG_RX_STBY_POL FIELD32(0x00000010) -+#define MIMO_PS_CFG_RX_RX_STBY0 FIELD32(0x00000020) -+ -+/* - * EDCA_AC0_CFG: - */ - #define EDCA_AC0_CFG 0x1300 -@@ -1095,6 +1124,12 @@ - #define TX_PWR_CFG_0_OFDM6_CH1 FIELD32(0x00f00000) - #define TX_PWR_CFG_0_OFDM12_CH0 FIELD32(0x0f000000) - #define TX_PWR_CFG_0_OFDM12_CH1 FIELD32(0xf0000000) -+/* bits for new 2T devices */ -+#define TX_PWR_CFG_0B_1MBS_2MBS FIELD32(0x000000ff) -+#define TX_PWR_CFG_0B_5MBS_11MBS FIELD32(0x0000ff00) -+#define TX_PWR_CFG_0B_6MBS_9MBS FIELD32(0x00ff0000) -+#define TX_PWR_CFG_0B_12MBS_18MBS FIELD32(0xff000000) -+ - - /* - * TX_PWR_CFG_1: -@@ -1117,6 +1152,11 @@ - #define TX_PWR_CFG_1_MCS0_CH1 FIELD32(0x00f00000) - #define TX_PWR_CFG_1_MCS2_CH0 FIELD32(0x0f000000) - #define TX_PWR_CFG_1_MCS2_CH1 FIELD32(0xf0000000) -+/* bits for new 2T devices */ -+#define TX_PWR_CFG_1B_24MBS_36MBS FIELD32(0x000000ff) -+#define TX_PWR_CFG_1B_48MBS FIELD32(0x0000ff00) -+#define TX_PWR_CFG_1B_MCS0_MCS1 FIELD32(0x00ff0000) -+#define TX_PWR_CFG_1B_MCS2_MCS3 FIELD32(0xff000000) - - /* - * TX_PWR_CFG_2: -@@ -1139,6 +1179,11 @@ - #define TX_PWR_CFG_2_MCS8_CH1 FIELD32(0x00f00000) - #define TX_PWR_CFG_2_MCS10_CH0 FIELD32(0x0f000000) - #define TX_PWR_CFG_2_MCS10_CH1 FIELD32(0xf0000000) -+/* bits for new 2T devices */ -+#define TX_PWR_CFG_2B_MCS4_MCS5 FIELD32(0x000000ff) -+#define TX_PWR_CFG_2B_MCS6_MCS7 FIELD32(0x0000ff00) -+#define TX_PWR_CFG_2B_MCS8_MCS9 FIELD32(0x00ff0000) -+#define TX_PWR_CFG_2B_MCS10_MCS11 FIELD32(0xff000000) - - /* - * TX_PWR_CFG_3: -@@ -1161,6 +1206,11 @@ - #define TX_PWR_CFG_3_STBC0_CH1 FIELD32(0x00f00000) - #define TX_PWR_CFG_3_STBC2_CH0 FIELD32(0x0f000000) - #define TX_PWR_CFG_3_STBC2_CH1 FIELD32(0xf0000000) -+/* bits for new 2T devices */ -+#define TX_PWR_CFG_3B_MCS12_MCS13 FIELD32(0x000000ff) -+#define TX_PWR_CFG_3B_MCS14 FIELD32(0x0000ff00) -+#define TX_PWR_CFG_3B_STBC_MCS0_MCS1 FIELD32(0x00ff0000) -+#define TX_PWR_CFG_3B_STBC_MCS2_MSC3 FIELD32(0xff000000) - - /* - * TX_PWR_CFG_4: -@@ -1175,6 +1225,9 @@ - #define TX_PWR_CFG_4_STBC4_CH1 FIELD32(0x000000f0) - #define TX_PWR_CFG_4_STBC6_CH0 FIELD32(0x00000f00) - #define TX_PWR_CFG_4_STBC6_CH1 FIELD32(0x0000f000) -+/* bits for new 2T devices */ -+#define TX_PWR_CFG_4B_STBC_MCS4_MCS5 FIELD32(0x000000ff) -+#define TX_PWR_CFG_4B_STBC_MCS6 FIELD32(0x0000ff00) - - /* - * TX_PIN_CFG: -@@ -1201,6 +1254,8 @@ - #define TX_PIN_CFG_RFTR_POL FIELD32(0x00020000) - #define TX_PIN_CFG_TRSW_EN FIELD32(0x00040000) - #define TX_PIN_CFG_TRSW_POL FIELD32(0x00080000) -+#define TX_PIN_CFG_RFRX_EN FIELD32(0x00100000) -+#define TX_PIN_CFG_RFRX_POL FIELD32(0x00200000) - #define TX_PIN_CFG_PA_PE_A2_EN FIELD32(0x01000000) - #define TX_PIN_CFG_PA_PE_G2_EN FIELD32(0x02000000) - #define TX_PIN_CFG_PA_PE_A2_POL FIELD32(0x04000000) -@@ -1547,6 +1602,95 @@ - #define TX_PWR_CFG_4_EXT_STBC4_CH2 FIELD32(0x0000000f) - #define TX_PWR_CFG_4_EXT_STBC6_CH2 FIELD32(0x00000f00) - -+/* TXn_RF_GAIN_CORRECT: RF Gain Correction for each RF_ALC[3:2] -+ * Unit: 0.1 dB, Range: -3.2 dB to 3.1 dB -+ */ -+#define TX0_RF_GAIN_CORRECT 0x13a0 -+#define TX0_RF_GAIN_CORRECT_GAIN_CORR_0 FIELD32(0x0000003f) -+#define TX0_RF_GAIN_CORRECT_GAIN_CORR_1 FIELD32(0x00003f00) -+#define TX0_RF_GAIN_CORRECT_GAIN_CORR_2 FIELD32(0x003f0000) -+#define TX0_RF_GAIN_CORRECT_GAIN_CORR_3 FIELD32(0x3f000000) -+ -+#define TX1_RF_GAIN_CORRECT 0x13a4 -+#define TX1_RF_GAIN_CORRECT_GAIN_CORR_0 FIELD32(0x0000003f) -+#define TX1_RF_GAIN_CORRECT_GAIN_CORR_1 FIELD32(0x00003f00) -+#define TX1_RF_GAIN_CORRECT_GAIN_CORR_2 FIELD32(0x003f0000) -+#define TX1_RF_GAIN_CORRECT_GAIN_CORR_3 FIELD32(0x3f000000) -+ -+/* TXn_RF_GAIN_ATTEN: TXn RF Gain Attenuation Level -+ * Format: 7-bit, signed value -+ * Unit: 0.5 dB, Range: -20 dB to -5 dB -+ */ -+#define TX0_RF_GAIN_ATTEN 0x13a8 -+#define TX0_RF_GAIN_ATTEN_LEVEL_0 FIELD32(0x0000007f) -+#define TX0_RF_GAIN_ATTEN_LEVEL_1 FIELD32(0x00007f00) -+#define TX0_RF_GAIN_ATTEN_LEVEL_2 FIELD32(0x007f0000) -+#define TX0_RF_GAIN_ATTEN_LEVEL_3 FIELD32(0x7f000000) -+#define TX1_RF_GAIN_ATTEN 0x13ac -+#define TX1_RF_GAIN_ATTEN_LEVEL_0 FIELD32(0x0000007f) -+#define TX1_RF_GAIN_ATTEN_LEVEL_1 FIELD32(0x00007f00) -+#define TX1_RF_GAIN_ATTEN_LEVEL_2 FIELD32(0x007f0000) -+#define TX1_RF_GAIN_ATTEN_LEVEL_3 FIELD32(0x7f000000) -+ -+/* TX_ALC_CFG_0: TX Automatic Level Control Configuration 0 -+ * TX_ALC_LIMIT_n: TXn upper limit -+ * TX_ALC_CH_INIT_n: TXn channel initial transmission gain -+ * Unit: 0.5 dB, Range: 0 to 23.5 dB -+ */ -+#define TX_ALC_CFG_0 0x13b0 -+#define TX_ALC_CFG_0_CH_INIT_0 FIELD32(0x0000003f) -+#define TX_ALC_CFG_0_CH_INIT_1 FIELD32(0x00003f00) -+#define TX_ALC_CFG_0_LIMIT_0 FIELD32(0x003f0000) -+#define TX_ALC_CFG_0_LIMIT_1 FIELD32(0x3f000000) -+ -+/* TX_ALC_CFG_1: TX Automatic Level Control Configuration 1 -+ * TX_TEMP_COMP: TX Power Temperature Compensation -+ * Unit: 0.5 dB, Range: -10 dB to 10 dB -+ * TXn_GAIN_FINE: TXn Gain Fine Adjustment -+ * Unit: 0.1 dB, Range: -0.8 dB to 0.7 dB -+ * RF_TOS_DLY: Sets the RF_TOS_EN assertion delay after -+ * deassertion of PA_PE. -+ * Unit: 0.25 usec -+ * TXn_RF_GAIN_ATTEN: TXn RF gain attentuation selector -+ * RF_TOS_TIMEOUT: time-out value for RF_TOS_ENABLE -+ * deassertion if RF_TOS_DONE is missing. -+ * Unit: 0.25 usec -+ * RF_TOS_ENABLE: TX offset calibration enable -+ * ROS_BUSY_EN: RX offset calibration busy enable -+ */ -+#define TX_ALC_CFG_1 0x13b4 -+#define TX_ALC_CFG_1_TX_TEMP_COMP FIELD32(0x0000003f) -+#define TX_ALC_CFG_1_TX0_GAIN_FINE FIELD32(0x00000f00) -+#define TX_ALC_CFG_1_TX1_GAIN_FINE FIELD32(0x0000f000) -+#define TX_ALC_CFG_1_RF_TOS_DLY FIELD32(0x00070000) -+#define TX_ALC_CFG_1_TX0_RF_GAIN_ATTEN FIELD32(0x00300000) -+#define TX_ALC_CFG_1_TX1_RF_GAIN_ATTEN FIELD32(0x00c00000) -+#define TX_ALC_CFG_1_RF_TOS_TIMEOUT FIELD32(0x3f000000) -+#define TX_ALC_CFG_1_RF_TOS_ENABLE FIELD32(0x40000000) -+#define TX_ALC_CFG_1_ROS_BUSY_EN FIELD32(0x80000000) -+ -+/* TXn_BB_GAIN_ATTEN: TXn RF Gain Attenuation Level -+ * Format: 5-bit signed values -+ * Unit: 0.5 dB, Range: -8 dB to 7 dB -+ */ -+#define TX0_BB_GAIN_ATTEN 0x13c0 -+#define TX0_BB_GAIN_ATTEN_LEVEL_0 FIELD32(0x0000001f) -+#define TX0_BB_GAIN_ATTEN_LEVEL_1 FIELD32(0x00001f00) -+#define TX0_BB_GAIN_ATTEN_LEVEL_2 FIELD32(0x001f0000) -+#define TX0_BB_GAIN_ATTEN_LEVEL_3 FIELD32(0x1f000000) -+#define TX1_BB_GAIN_ATTEN 0x13c4 -+#define TX1_BB_GAIN_ATTEN_LEVEL_0 FIELD32(0x0000001f) -+#define TX1_BB_GAIN_ATTEN_LEVEL_1 FIELD32(0x00001f00) -+#define TX1_BB_GAIN_ATTEN_LEVEL_2 FIELD32(0x001f0000) -+#define TX1_BB_GAIN_ATTEN_LEVEL_3 FIELD32(0x1f000000) -+ -+/* TX_ALC_VGA3: TX Automatic Level Correction Variable Gain Amplifier 3 */ -+#define TX_ALC_VGA3 0x13c8 -+#define TX_ALC_VGA3_TX0_ALC_VGA3 FIELD32(0x0000001f) -+#define TX_ALC_VGA3_TX1_ALC_VGA3 FIELD32(0x00001f00) -+#define TX_ALC_VGA3_TX0_ALC_VGA2 FIELD32(0x001f0000) -+#define TX_ALC_VGA3_TX1_ALC_VGA2 FIELD32(0x1f000000) -+ - /* TX_PWR_CFG_7 */ - #define TX_PWR_CFG_7 0x13d4 - #define TX_PWR_CFG_7_OFDM54_CH0 FIELD32(0x0000000f) -@@ -1555,6 +1699,10 @@ - #define TX_PWR_CFG_7_MCS7_CH0 FIELD32(0x000f0000) - #define TX_PWR_CFG_7_MCS7_CH1 FIELD32(0x00f00000) - #define TX_PWR_CFG_7_MCS7_CH2 FIELD32(0x0f000000) -+/* bits for new 2T devices */ -+#define TX_PWR_CFG_7B_54MBS FIELD32(0x000000ff) -+#define TX_PWR_CFG_7B_MCS7 FIELD32(0x00ff0000) -+ - - /* TX_PWR_CFG_8 */ - #define TX_PWR_CFG_8 0x13d8 -@@ -1564,12 +1712,17 @@ - #define TX_PWR_CFG_8_MCS23_CH0 FIELD32(0x000f0000) - #define TX_PWR_CFG_8_MCS23_CH1 FIELD32(0x00f00000) - #define TX_PWR_CFG_8_MCS23_CH2 FIELD32(0x0f000000) -+/* bits for new 2T devices */ -+#define TX_PWR_CFG_8B_MCS15 FIELD32(0x000000ff) -+ - - /* TX_PWR_CFG_9 */ - #define TX_PWR_CFG_9 0x13dc - #define TX_PWR_CFG_9_STBC7_CH0 FIELD32(0x0000000f) - #define TX_PWR_CFG_9_STBC7_CH1 FIELD32(0x000000f0) - #define TX_PWR_CFG_9_STBC7_CH2 FIELD32(0x00000f00) -+/* bits for new 2T devices */ -+#define TX_PWR_CFG_9B_STBC_MCS7 FIELD32(0x000000ff) - - /* - * RX_FILTER_CFG: RX configuration register. -@@ -2137,11 +2290,14 @@ struct mac_iveiv_entry { - #define RFCSR1_TX1_PD FIELD8(0x20) - #define RFCSR1_RX2_PD FIELD8(0x40) - #define RFCSR1_TX2_PD FIELD8(0x80) -+#define RFCSR1_TX2_EN_MT7620 FIELD8(0x02) - - /* - * RFCSR 2: - */ - #define RFCSR2_RESCAL_EN FIELD8(0x80) -+#define RFCSR2_RX2_EN_MT7620 FIELD8(0x02) -+#define RFCSR2_TX2_EN_MT7620 FIELD8(0x20) - - /* - * RFCSR 3: -@@ -2160,6 +2316,12 @@ struct mac_iveiv_entry { - #define RFCSR3_BIT5 FIELD8(0x20) - - /* -+ * RFCSR 4: -+ * VCOCAL_EN used by MT7620 -+ */ -+#define RFCSR4_VCOCAL_EN FIELD8(0x80) -+ -+/* - * FRCSR 5: - */ - #define RFCSR5_R1 FIELD8(0x0c) -@@ -2214,6 +2376,7 @@ struct mac_iveiv_entry { - */ - #define RFCSR13_TX_POWER FIELD8(0x1f) - #define RFCSR13_DR0 FIELD8(0xe0) -+#define RFCSR13_RDIV_MT7620 FIELD8(0x03) - - /* - * RFCSR 15: -@@ -2224,6 +2387,8 @@ struct mac_iveiv_entry { - * RFCSR 16: - */ - #define RFCSR16_TXMIXER_GAIN FIELD8(0x07) -+#define RFCSR16_RF_PLL_FREQ_SEL_MT7620 FIELD8(0x0F) -+#define RFCSR16_SDM_MODE_MT7620 FIELD8(0xE0) - - /* - * RFCSR 17: -@@ -2236,6 +2401,8 @@ struct mac_iveiv_entry { - /* RFCSR 18 */ - #define RFCSR18_XO_TUNE_BYPASS FIELD8(0x40) - -+/* RFCSR 19 */ -+#define RFCSR19_K FIELD8(0x03) - - /* - * RFCSR 20: -@@ -2246,11 +2413,14 @@ struct mac_iveiv_entry { - * RFCSR 21: - */ - #define RFCSR21_RX_LO2_EN FIELD8(0x08) -+#define RFCSR21_BIT1 FIELD8(0x01) -+#define RFCSR21_BIT8 FIELD8(0x80) - - /* - * RFCSR 22: - */ - #define RFCSR22_BASEBAND_LOOPBACK FIELD8(0x01) -+#define RFCSR22_FREQPLAN_D_MT7620 FIELD8(0x07) - - /* - * RFCSR 23: -@@ -2273,6 +2443,11 @@ struct mac_iveiv_entry { - #define RFCSR27_R4 FIELD8(0x40) - - /* -+ * RFCSR 28: -+ */ -+#define RFCSR28_CH11_HT40 FIELD8(0x04) -+ -+/* - * RFCSR 29: - */ - #define RFCSR29_ADC6_TEST FIELD8(0x01) -@@ -2333,6 +2508,7 @@ struct mac_iveiv_entry { - */ - #define RFCSR42_BIT1 FIELD8(0x01) - #define RFCSR42_BIT4 FIELD8(0x08) -+#define RFCSR42_TX2_EN_MT7620 FIELD8(0x40) - - /* - * RFCSR 49: -@@ -2435,6 +2611,7 @@ enum rt2800_eeprom_word { - EEPROM_TSSI_BOUND_BG5, - EEPROM_TXPOWER_A1, - EEPROM_TXPOWER_A2, -+ EEPROM_TXPOWER_INIT, - EEPROM_TSSI_BOUND_A1, - EEPROM_TSSI_BOUND_A2, - EEPROM_TSSI_BOUND_A3, -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -index 8d00c599e47a..201b12ed90c6 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -59,6 +59,9 @@ - rt2800_regbusy_read((__dev), BBP_CSR_CFG, BBP_CSR_CFG_BUSY, (__reg)) - #define WAIT_FOR_RFCSR(__dev, __reg) \ - rt2800_regbusy_read((__dev), RF_CSR_CFG, RF_CSR_CFG_BUSY, (__reg)) -+#define WAIT_FOR_RFCSR_MT7620(__dev, __reg) \ -+ rt2800_regbusy_read((__dev), RF_CSR_CFG, RF_CSR_CFG_BUSY_MT7620, \ -+ (__reg)) - #define WAIT_FOR_RF(__dev, __reg) \ - rt2800_regbusy_read((__dev), RF_CSR_CFG0, RF_CSR_CFG0_BUSY, (__reg)) - #define WAIT_FOR_MCU(__dev, __reg) \ -@@ -150,19 +153,56 @@ static void rt2800_rfcsr_write(struct rt2x00_dev *rt2x00dev, - * Wait until the RFCSR becomes available, afterwards we - * can safely write the new data into the register. - */ -- if (WAIT_FOR_RFCSR(rt2x00dev, ®)) { -- reg = 0; -- rt2x00_set_field32(®, RF_CSR_CFG_DATA, value); -- rt2x00_set_field32(®, RF_CSR_CFG_REGNUM, word); -- rt2x00_set_field32(®, RF_CSR_CFG_WRITE, 1); -- rt2x00_set_field32(®, RF_CSR_CFG_BUSY, 1); -+ switch (rt2x00dev->chip.rt) { -+ case RT6352: -+ if (WAIT_FOR_RFCSR_MT7620(rt2x00dev, ®)) { -+ reg = 0; -+ rt2x00_set_field32(®, RF_CSR_CFG_DATA_MT7620, value); -+ rt2x00_set_field32(®, RF_CSR_CFG_REGNUM_MT7620, -+ word); -+ rt2x00_set_field32(®, RF_CSR_CFG_WRITE_MT7620, 1); -+ rt2x00_set_field32(®, RF_CSR_CFG_BUSY_MT7620, 1); -+ -+ rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg); -+ } -+ break; - -- rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg); -+ default: -+ if (WAIT_FOR_RFCSR(rt2x00dev, ®)) { -+ reg = 0; -+ rt2x00_set_field32(®, RF_CSR_CFG_DATA, value); -+ rt2x00_set_field32(®, RF_CSR_CFG_REGNUM, word); -+ rt2x00_set_field32(®, RF_CSR_CFG_WRITE, 1); -+ rt2x00_set_field32(®, RF_CSR_CFG_BUSY, 1); -+ -+ rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg); -+ } -+ break; - } - - mutex_unlock(&rt2x00dev->csr_mutex); - } - -+static void rt2800_rfcsr_write_bank(struct rt2x00_dev *rt2x00dev, const u8 bank, -+ const unsigned int reg, const u8 value) -+{ -+ rt2800_rfcsr_write(rt2x00dev, (reg | (bank << 6)), value); -+} -+ -+static void rt2800_rfcsr_write_chanreg(struct rt2x00_dev *rt2x00dev, -+ const unsigned int reg, const u8 value) -+{ -+ rt2800_rfcsr_write_bank(rt2x00dev, 4, reg, value); -+ rt2800_rfcsr_write_bank(rt2x00dev, 6, reg, value); -+} -+ -+static void rt2800_rfcsr_write_dccal(struct rt2x00_dev *rt2x00dev, -+ const unsigned int reg, const u8 value) -+{ -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, reg, value); -+ rt2800_rfcsr_write_bank(rt2x00dev, 7, reg, value); -+} -+ - static void rt2800_rfcsr_read(struct rt2x00_dev *rt2x00dev, - const unsigned int word, u8 *value) - { -@@ -178,22 +218,48 @@ static void rt2800_rfcsr_read(struct rt2x00_dev *rt2x00dev, - * doesn't become available in time, reg will be 0xffffffff - * which means we return 0xff to the caller. - */ -- if (WAIT_FOR_RFCSR(rt2x00dev, ®)) { -- reg = 0; -- rt2x00_set_field32(®, RF_CSR_CFG_REGNUM, word); -- rt2x00_set_field32(®, RF_CSR_CFG_WRITE, 0); -- rt2x00_set_field32(®, RF_CSR_CFG_BUSY, 1); -+ switch (rt2x00dev->chip.rt) { -+ case RT6352: -+ if (WAIT_FOR_RFCSR_MT7620(rt2x00dev, ®)) { -+ reg = 0; -+ rt2x00_set_field32(®, RF_CSR_CFG_REGNUM_MT7620, -+ word); -+ rt2x00_set_field32(®, RF_CSR_CFG_WRITE_MT7620, 0); -+ rt2x00_set_field32(®, RF_CSR_CFG_BUSY_MT7620, 1); - -- rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg); -+ rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg); - -- WAIT_FOR_RFCSR(rt2x00dev, ®); -- } -+ WAIT_FOR_RFCSR_MT7620(rt2x00dev, ®); -+ } - -- *value = rt2x00_get_field32(reg, RF_CSR_CFG_DATA); -+ *value = rt2x00_get_field32(reg, RF_CSR_CFG_DATA_MT7620); -+ break; -+ -+ default: -+ if (WAIT_FOR_RFCSR(rt2x00dev, ®)) { -+ reg = 0; -+ rt2x00_set_field32(®, RF_CSR_CFG_REGNUM, word); -+ rt2x00_set_field32(®, RF_CSR_CFG_WRITE, 0); -+ rt2x00_set_field32(®, RF_CSR_CFG_BUSY, 1); -+ -+ rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg); -+ -+ WAIT_FOR_RFCSR(rt2x00dev, ®); -+ } -+ -+ *value = rt2x00_get_field32(reg, RF_CSR_CFG_DATA); -+ break; -+ } - - mutex_unlock(&rt2x00dev->csr_mutex); - } - -+static void rt2800_rfcsr_read_bank(struct rt2x00_dev *rt2x00dev, const u8 bank, -+ const unsigned int reg, u8 *value) -+{ -+ rt2800_rfcsr_read(rt2x00dev, (reg | (bank << 6)), value); -+} -+ - static void rt2800_rf_write(struct rt2x00_dev *rt2x00dev, - const unsigned int word, const u32 value) - { -@@ -250,6 +316,7 @@ static const unsigned int rt2800_eeprom_map[EEPROM_WORD_COUNT] = { - [EEPROM_TSSI_BOUND_BG5] = 0x003b, - [EEPROM_TXPOWER_A1] = 0x003c, - [EEPROM_TXPOWER_A2] = 0x0053, -+ [EEPROM_TXPOWER_INIT] = 0x0068, - [EEPROM_TSSI_BOUND_A1] = 0x006a, - [EEPROM_TSSI_BOUND_A2] = 0x006b, - [EEPROM_TSSI_BOUND_A3] = 0x006c, -@@ -524,6 +591,7 @@ void rt2800_get_txwi_rxwi_size(struct rt2x00_dev *rt2x00dev, - break; - - case RT5592: -+ case RT6352: - *txwi_size = TXWI_DESC_SIZE_5WORDS; - *rxwi_size = RXWI_DESC_SIZE_6WORDS; - break; -@@ -2810,7 +2878,8 @@ static void rt2800_config_channel_rf53xx(struct rt2x00_dev *rt2x00dev, - rt2800_rfcsr_write(rt2x00dev, 59, - r59_nonbt_rev[idx]); - } else if (rt2x00_rt(rt2x00dev, RT5390) || -- rt2x00_rt(rt2x00dev, RT5392)) { -+ rt2x00_rt(rt2x00dev, RT5392) || -+ rt2x00_rt(rt2x00dev, RT6352)) { - static const char r59_non_bt[] = {0x8f, 0x8f, - 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8d, - 0x8a, 0x88, 0x88, 0x87, 0x87, 0x86}; -@@ -3104,6 +3173,242 @@ static void rt2800_config_channel_rf55xx(struct rt2x00_dev *rt2x00dev, - rt2800_bbp_write(rt2x00dev, 196, (rf->channel <= 14) ? 0x19 : 0x7F); - } - -+static void rt2800_config_channel_rf7620(struct rt2x00_dev *rt2x00dev, -+ struct ieee80211_conf *conf, -+ struct rf_channel *rf, -+ struct channel_info *info) -+{ -+ struct rt2800_drv_data *drv_data = rt2x00dev->drv_data; -+ u8 rx_agc_fc, tx_agc_fc; -+ u8 rfcsr; -+ -+ /* Frequeny plan setting */ -+ /* Rdiv setting (set 0x03 if Xtal==20) -+ * R13[1:0] -+ */ -+ rt2800_rfcsr_read(rt2x00dev, 13, &rfcsr); -+ rt2x00_set_field8(&rfcsr, RFCSR13_RDIV_MT7620, -+ rt2800_clk_is_20mhz(rt2x00dev) ? 3 : 0); -+ rt2800_rfcsr_write(rt2x00dev, 13, rfcsr); -+ -+ /* N setting -+ * R20[7:0] in rf->rf1 -+ * R21[0] always 0 -+ */ -+ rt2800_rfcsr_read(rt2x00dev, 20, &rfcsr); -+ rfcsr = (rf->rf1 & 0x00ff); -+ rt2800_rfcsr_write(rt2x00dev, 20, rfcsr); -+ -+ rt2800_rfcsr_read(rt2x00dev, 21, &rfcsr); -+ rt2x00_set_field8(&rfcsr, RFCSR21_BIT1, 0); -+ rt2800_rfcsr_write(rt2x00dev, 21, rfcsr); -+ -+ /* K setting (always 0) -+ * R16[3:0] (RF PLL freq selection) -+ */ -+ rt2800_rfcsr_read(rt2x00dev, 16, &rfcsr); -+ rt2x00_set_field8(&rfcsr, RFCSR16_RF_PLL_FREQ_SEL_MT7620, 0); -+ rt2800_rfcsr_write(rt2x00dev, 16, rfcsr); -+ -+ /* D setting (always 0) -+ * R22[2:0] (D=15, R22[2:0]=<111>) -+ */ -+ rt2800_rfcsr_read(rt2x00dev, 22, &rfcsr); -+ rt2x00_set_field8(&rfcsr, RFCSR22_FREQPLAN_D_MT7620, 0); -+ rt2800_rfcsr_write(rt2x00dev, 22, rfcsr); -+ -+ /* Ksd setting -+ * Ksd: R17<7:0> in rf->rf2 -+ * R18<7:0> in rf->rf3 -+ * R19<1:0> in rf->rf4 -+ */ -+ rt2800_rfcsr_read(rt2x00dev, 17, &rfcsr); -+ rfcsr = rf->rf2; -+ rt2800_rfcsr_write(rt2x00dev, 17, rfcsr); -+ -+ rt2800_rfcsr_read(rt2x00dev, 18, &rfcsr); -+ rfcsr = rf->rf3; -+ rt2800_rfcsr_write(rt2x00dev, 18, rfcsr); -+ -+ rt2800_rfcsr_read(rt2x00dev, 19, &rfcsr); -+ rt2x00_set_field8(&rfcsr, RFCSR19_K, rf->rf4); -+ rt2800_rfcsr_write(rt2x00dev, 19, rfcsr); -+ -+ /* Default: XO=20MHz , SDM mode */ -+ rt2800_rfcsr_read(rt2x00dev, 16, &rfcsr); -+ rt2x00_set_field8(&rfcsr, RFCSR16_SDM_MODE_MT7620, 0x80); -+ rt2800_rfcsr_write(rt2x00dev, 16, rfcsr); -+ -+ rt2800_rfcsr_read(rt2x00dev, 21, &rfcsr); -+ rt2x00_set_field8(&rfcsr, RFCSR21_BIT8, 1); -+ rt2800_rfcsr_write(rt2x00dev, 21, rfcsr); -+ -+ rt2800_rfcsr_read(rt2x00dev, 1, &rfcsr); -+ rt2x00_set_field8(&rfcsr, RFCSR1_TX2_EN_MT7620, -+ rt2x00dev->default_ant.tx_chain_num != 1); -+ rt2800_rfcsr_write(rt2x00dev, 1, rfcsr); -+ -+ rt2800_rfcsr_read(rt2x00dev, 2, &rfcsr); -+ rt2x00_set_field8(&rfcsr, RFCSR2_TX2_EN_MT7620, -+ rt2x00dev->default_ant.tx_chain_num != 1); -+ rt2x00_set_field8(&rfcsr, RFCSR2_RX2_EN_MT7620, -+ rt2x00dev->default_ant.rx_chain_num != 1); -+ rt2800_rfcsr_write(rt2x00dev, 2, rfcsr); -+ -+ rt2800_rfcsr_read(rt2x00dev, 42, &rfcsr); -+ rt2x00_set_field8(&rfcsr, RFCSR42_TX2_EN_MT7620, -+ rt2x00dev->default_ant.tx_chain_num != 1); -+ rt2800_rfcsr_write(rt2x00dev, 42, rfcsr); -+ -+ /* RF for DC Cal BW */ -+ if (conf_is_ht40(conf)) { -+ rt2800_rfcsr_write_dccal(rt2x00dev, 6, 0x10); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 7, 0x10); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 8, 0x04); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 58, 0x10); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x10); -+ } else { -+ rt2800_rfcsr_write_dccal(rt2x00dev, 6, 0x20); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 7, 0x20); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 8, 0x00); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 58, 0x20); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x20); -+ } -+ -+ if (conf_is_ht40(conf)) { -+ rt2800_rfcsr_write_dccal(rt2x00dev, 58, 0x08); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x08); -+ } else { -+ rt2800_rfcsr_write_dccal(rt2x00dev, 58, 0x28); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x28); -+ } -+ -+ rt2800_rfcsr_read(rt2x00dev, 28, &rfcsr); -+ rt2x00_set_field8(&rfcsr, RFCSR28_CH11_HT40, -+ conf_is_ht40(conf) && (rf->channel == 11)); -+ rt2800_rfcsr_write(rt2x00dev, 28, rfcsr); -+ -+ if (!test_bit(DEVICE_STATE_SCANNING, &rt2x00dev->flags)) { -+ if (conf_is_ht40(conf)) { -+ rx_agc_fc = drv_data->rx_calibration_bw40; -+ tx_agc_fc = drv_data->tx_calibration_bw40; -+ } else { -+ rx_agc_fc = drv_data->rx_calibration_bw20; -+ tx_agc_fc = drv_data->tx_calibration_bw20; -+ } -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 6, &rfcsr); -+ rfcsr &= (~0x3F); -+ rfcsr |= rx_agc_fc; -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 6, rfcsr); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 7, &rfcsr); -+ rfcsr &= (~0x3F); -+ rfcsr |= rx_agc_fc; -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 7, rfcsr); -+ rt2800_rfcsr_read_bank(rt2x00dev, 7, 6, &rfcsr); -+ rfcsr &= (~0x3F); -+ rfcsr |= rx_agc_fc; -+ rt2800_rfcsr_write_bank(rt2x00dev, 7, 6, rfcsr); -+ rt2800_rfcsr_read_bank(rt2x00dev, 7, 7, &rfcsr); -+ rfcsr &= (~0x3F); -+ rfcsr |= rx_agc_fc; -+ rt2800_rfcsr_write_bank(rt2x00dev, 7, 7, rfcsr); -+ -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 58, &rfcsr); -+ rfcsr &= (~0x3F); -+ rfcsr |= tx_agc_fc; -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 58, rfcsr); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 59, &rfcsr); -+ rfcsr &= (~0x3F); -+ rfcsr |= tx_agc_fc; -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 59, rfcsr); -+ rt2800_rfcsr_read_bank(rt2x00dev, 7, 58, &rfcsr); -+ rfcsr &= (~0x3F); -+ rfcsr |= tx_agc_fc; -+ rt2800_rfcsr_write_bank(rt2x00dev, 7, 58, rfcsr); -+ rt2800_rfcsr_read_bank(rt2x00dev, 7, 59, &rfcsr); -+ rfcsr &= (~0x3F); -+ rfcsr |= tx_agc_fc; -+ rt2800_rfcsr_write_bank(rt2x00dev, 7, 59, rfcsr); -+ } -+} -+ -+static void rt2800_config_alc(struct rt2x00_dev *rt2x00dev, -+ struct ieee80211_channel *chan, -+ int power_level) { -+ u16 eeprom, target_power, max_power; -+ u32 mac_sys_ctrl, mac_status; -+ u32 reg; -+ u8 bbp; -+ int i; -+ -+ /* hardware unit is 0.5dBm, limited to 23.5dBm */ -+ power_level *= 2; -+ if (power_level > 0x2f) -+ power_level = 0x2f; -+ -+ max_power = chan->max_power * 2; -+ if (max_power > 0x2f) -+ max_power = 0x2f; -+ -+ rt2800_register_read(rt2x00dev, TX_ALC_CFG_0, ®); -+ rt2x00_set_field32(®, TX_ALC_CFG_0_CH_INIT_0, power_level); -+ rt2x00_set_field32(®, TX_ALC_CFG_0_CH_INIT_1, power_level); -+ rt2x00_set_field32(®, TX_ALC_CFG_0_LIMIT_0, max_power); -+ rt2x00_set_field32(®, TX_ALC_CFG_0_LIMIT_1, max_power); -+ -+ rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom); -+ if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_INTERNAL_TX_ALC)) { -+ /* init base power by eeprom target power */ -+ rt2800_eeprom_read(rt2x00dev, EEPROM_TXPOWER_INIT, -+ &target_power); -+ rt2x00_set_field32(®, TX_ALC_CFG_0_CH_INIT_0, target_power); -+ rt2x00_set_field32(®, TX_ALC_CFG_0_CH_INIT_1, target_power); -+ } -+ rt2800_register_write(rt2x00dev, TX_ALC_CFG_0, reg); -+ -+ rt2800_register_read(rt2x00dev, TX_ALC_CFG_1, ®); -+ rt2x00_set_field32(®, TX_ALC_CFG_1_TX_TEMP_COMP, 0); -+ rt2800_register_write(rt2x00dev, TX_ALC_CFG_1, reg); -+ -+ /* Save MAC SYS CTRL registers */ -+ rt2800_register_read(rt2x00dev, MAC_SYS_CTRL, &mac_sys_ctrl); -+ /* Disable Tx/Rx */ -+ rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, 0); -+ /* Check MAC Tx/Rx idle */ -+ for (i = 0; i < 10000; i++) { -+ rt2800_register_read(rt2x00dev, MAC_STATUS_CFG, -+ &mac_status); -+ if (mac_status & 0x3) -+ usleep_range(50, 200); -+ else -+ break; -+ } -+ -+ if (i == 10000) -+ rt2x00_warn(rt2x00dev, "Wait MAC Status to MAX !!!\n"); -+ -+ if (chan->center_freq > 2457) { -+ rt2800_bbp_read(rt2x00dev, 30, &bbp); -+ bbp = 0x40; -+ rt2800_bbp_write(rt2x00dev, 30, bbp); -+ rt2800_rfcsr_write(rt2x00dev, 39, 0); -+ if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) -+ rt2800_rfcsr_write(rt2x00dev, 42, 0xfb); -+ else -+ rt2800_rfcsr_write(rt2x00dev, 42, 0x7b); -+ } else { -+ rt2800_bbp_read(rt2x00dev, 30, &bbp); -+ bbp = 0x1f; -+ rt2800_bbp_write(rt2x00dev, 30, bbp); -+ rt2800_rfcsr_write(rt2x00dev, 39, 0x80); -+ if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) -+ rt2800_rfcsr_write(rt2x00dev, 42, 0xdb); -+ else -+ rt2800_rfcsr_write(rt2x00dev, 42, 0x5b); -+ } -+ rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, mac_sys_ctrl); -+} -+ - static void rt2800_bbp_write_with_rx_chain(struct rt2x00_dev *rt2x00dev, - const unsigned int word, - const u8 value) -@@ -3228,7 +3533,7 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, - struct channel_info *info) - { - u32 reg; -- unsigned int tx_pin; -+ u32 tx_pin; - u8 bbp, rfcsr; - - info->default_power1 = rt2800_txpower_to_dev(rt2x00dev, rf->channel, -@@ -3273,6 +3578,9 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, - case RF5592: - rt2800_config_channel_rf55xx(rt2x00dev, conf, rf, info); - break; -+ case RF7620: -+ rt2800_config_channel_rf7620(rt2x00dev, conf, rf, info); -+ break; - default: - rt2800_config_channel_rf2xxx(rt2x00dev, conf, rf, info); - } -@@ -3347,7 +3655,8 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, - - if (rf->channel <= 14) { - if (!rt2x00_rt(rt2x00dev, RT5390) && -- !rt2x00_rt(rt2x00dev, RT5392)) { -+ !rt2x00_rt(rt2x00dev, RT5392) && -+ !rt2x00_rt(rt2x00dev, RT6352)) { - if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) { - rt2800_bbp_write(rt2x00dev, 82, 0x62); - rt2800_bbp_write(rt2x00dev, 75, 0x46); -@@ -3367,7 +3676,7 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, - rt2800_bbp_write(rt2x00dev, 82, 0x94); - else if (rt2x00_rt(rt2x00dev, RT3593)) - rt2800_bbp_write(rt2x00dev, 82, 0x82); -- else -+ else if (!rt2x00_rt(rt2x00dev, RT6352)) - rt2800_bbp_write(rt2x00dev, 82, 0xf2); - - if (rt2x00_rt(rt2x00dev, RT3593)) -@@ -3388,7 +3697,7 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, - if (rt2x00_rt(rt2x00dev, RT3572)) - rt2800_rfcsr_write(rt2x00dev, 8, 0); - -- tx_pin = 0; -+ rt2800_register_read(rt2x00dev, TX_PIN_CFG, &tx_pin); - - switch (rt2x00dev->default_ant.tx_chain_num) { - case 3: -@@ -3437,6 +3746,7 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, - - rt2x00_set_field32(&tx_pin, TX_PIN_CFG_RFTR_EN, 1); - rt2x00_set_field32(&tx_pin, TX_PIN_CFG_TRSW_EN, 1); -+ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_RFRX_EN, 1); /* mt7620 */ - - rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin); - -@@ -3495,7 +3805,7 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, - usleep_range(1000, 1500); - } - -- if (rt2x00_rt(rt2x00dev, RT5592)) { -+ if (rt2x00_rt(rt2x00dev, RT5592) || rt2x00_rt(rt2x00dev, RT6352)) { - rt2800_bbp_write(rt2x00dev, 195, 141); - rt2800_bbp_write(rt2x00dev, 196, conf_is_ht40(conf) ? 0x10 : 0x1a); - -@@ -4182,6 +4492,128 @@ static void rt2800_config_txpower_rt3593(struct rt2x00_dev *rt2x00dev, - (unsigned long) regs[i]); - } - -+static void rt2800_config_txpower_rt6352(struct rt2x00_dev *rt2x00dev, -+ struct ieee80211_channel *chan, -+ int power_level) -+{ -+ u32 reg, pwreg; -+ u16 eeprom; -+ u32 data, gdata; -+ u8 t, i; -+ enum nl80211_band band = chan->band; -+ int delta; -+ -+ /* Warn user if bw_comp is set in EEPROM */ -+ delta = rt2800_get_txpower_bw_comp(rt2x00dev, band); -+ -+ if (delta) -+ rt2x00_warn(rt2x00dev, "ignoring EEPROM HT40 power delta: %d\n", -+ delta); -+ -+ /* populate TX_PWR_CFG_0 up to TX_PWR_CFG_4 from EEPROM for HT20, limit -+ * value to 0x3f and replace 0x20 by 0x21 as this is what the vendor -+ * driver does as well, though it looks kinda wrong. -+ * Maybe some misunderstanding of what a signed 8-bit value is? Maybe -+ * the hardware has a problem handling 0x20, and as the code initially -+ * used a fixed offset between HT20 and HT40 rates they had to work- -+ * around that issue and most likely just forgot about it later on. -+ * Maybe we should use rt2800_get_txpower_bw_comp() here as well, -+ * however, the corresponding EEPROM value is not respected by the -+ * vendor driver, so maybe this is rather being taken care of the -+ * TXALC and the driver doesn't need to handle it...? -+ * Though this is all very awkward, just do as they did, as that's what -+ * board vendors expected when they populated the EEPROM... -+ */ -+ for (i = 0; i < 5; i++) { -+ rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE, -+ i * 2, &eeprom); -+ -+ data = eeprom; -+ -+ t = eeprom & 0x3f; -+ if (t == 32) -+ t++; -+ -+ gdata = t; -+ -+ t = (eeprom & 0x3f00) >> 8; -+ if (t == 32) -+ t++; -+ -+ gdata |= (t << 8); -+ -+ rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE, -+ (i * 2) + 1, &eeprom); -+ -+ t = eeprom & 0x3f; -+ if (t == 32) -+ t++; -+ -+ gdata |= (t << 16); -+ -+ t = (eeprom & 0x3f00) >> 8; -+ if (t == 32) -+ t++; -+ -+ gdata |= (t << 24); -+ data |= (eeprom << 16); -+ -+ if (!test_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags)) { -+ /* HT20 */ -+ if (data != 0xffffffff) -+ rt2800_register_write(rt2x00dev, -+ TX_PWR_CFG_0 + (i * 4), -+ data); -+ } else { -+ /* HT40 */ -+ if (gdata != 0xffffffff) -+ rt2800_register_write(rt2x00dev, -+ TX_PWR_CFG_0 + (i * 4), -+ gdata); -+ } -+ } -+ -+ /* Aparently Ralink ran out of space in the BYRATE calibration section -+ * of the EERPOM which is copied to the corresponding TX_PWR_CFG_x -+ * registers. As recent 2T chips use 8-bit instead of 4-bit values for -+ * power-offsets more space would be needed. Ralink decided to keep the -+ * EEPROM layout untouched and rather have some shared values covering -+ * multiple bitrates. -+ * Populate the registers not covered by the EEPROM in the same way the -+ * vendor driver does. -+ */ -+ -+ /* For OFDM 54MBS use value from OFDM 48MBS */ -+ pwreg = 0; -+ rt2800_register_read(rt2x00dev, TX_PWR_CFG_1, ®); -+ t = rt2x00_get_field32(reg, TX_PWR_CFG_1B_48MBS); -+ rt2x00_set_field32(&pwreg, TX_PWR_CFG_7B_54MBS, t); -+ -+ /* For MCS 7 use value from MCS 6 */ -+ rt2800_register_read(rt2x00dev, TX_PWR_CFG_2, ®); -+ t = rt2x00_get_field32(reg, TX_PWR_CFG_2B_MCS6_MCS7); -+ rt2x00_set_field32(&pwreg, TX_PWR_CFG_7B_MCS7, t); -+ rt2800_register_write(rt2x00dev, TX_PWR_CFG_7, pwreg); -+ -+ /* For MCS 15 use value from MCS 14 */ -+ pwreg = 0; -+ rt2800_register_read(rt2x00dev, TX_PWR_CFG_3, ®); -+ t = rt2x00_get_field32(reg, TX_PWR_CFG_3B_MCS14); -+ rt2x00_set_field32(&pwreg, TX_PWR_CFG_8B_MCS15, t); -+ rt2800_register_write(rt2x00dev, TX_PWR_CFG_8, pwreg); -+ -+ /* For STBC MCS 7 use value from STBC MCS 6 */ -+ pwreg = 0; -+ rt2800_register_read(rt2x00dev, TX_PWR_CFG_4, ®); -+ t = rt2x00_get_field32(reg, TX_PWR_CFG_4B_STBC_MCS6); -+ rt2x00_set_field32(&pwreg, TX_PWR_CFG_9B_STBC_MCS7, t); -+ rt2800_register_write(rt2x00dev, TX_PWR_CFG_9, pwreg); -+ -+ rt2800_config_alc(rt2x00dev, chan, power_level); -+ -+ /* TODO: temperature compensation code! */ -+} -+ - /* - * We configure transmit power using MAC TX_PWR_CFG_{0,...,N} registers and - * BBP R1 register. TX_PWR_CFG_X allow to configure per rate TX power values, -@@ -4378,6 +4810,8 @@ static void rt2800_config_txpower(struct rt2x00_dev *rt2x00dev, - { - if (rt2x00_rt(rt2x00dev, RT3593)) - rt2800_config_txpower_rt3593(rt2x00dev, chan, power_level); -+ else if (rt2x00_rt(rt2x00dev, RT6352)) -+ rt2800_config_txpower_rt6352(rt2x00dev, chan, power_level); - else - rt2800_config_txpower_rt28xx(rt2x00dev, chan, power_level); - } -@@ -4393,6 +4827,7 @@ void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev) - { - u32 tx_pin; - u8 rfcsr; -+ unsigned long min_sleep = 0; - - /* - * A voltage-controlled oscillator(VCO) is an electronic oscillator -@@ -4431,6 +4866,15 @@ void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev) - rt2800_rfcsr_read(rt2x00dev, 3, &rfcsr); - rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1); - rt2800_rfcsr_write(rt2x00dev, 3, rfcsr); -+ min_sleep = 1000; -+ break; -+ case RF7620: -+ rt2800_rfcsr_write(rt2x00dev, 5, 0x40); -+ rt2800_rfcsr_write(rt2x00dev, 4, 0x0C); -+ rt2800_rfcsr_read(rt2x00dev, 4, &rfcsr); -+ rt2x00_set_field8(&rfcsr, RFCSR4_VCOCAL_EN, 1); -+ rt2800_rfcsr_write(rt2x00dev, 4, rfcsr); -+ min_sleep = 2000; - break; - default: - WARN_ONCE(1, "Not supported RF chipet %x for VCO recalibration", -@@ -4438,7 +4882,8 @@ void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev) - return; - } - -- usleep_range(1000, 1500); -+ if (min_sleep > 0) -+ usleep_range(min_sleep, min_sleep * 2); - - rt2800_register_read(rt2x00dev, TX_PIN_CFG, &tx_pin); - if (rt2x00dev->rf_channel <= 14) { -@@ -4470,6 +4915,42 @@ void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev) - } - rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin); - -+ if (rt2x00_rt(rt2x00dev, RT6352)) { -+ if (rt2x00dev->default_ant.tx_chain_num == 1) { -+ rt2800_bbp_write(rt2x00dev, 91, 0x07); -+ rt2800_bbp_write(rt2x00dev, 95, 0x1A); -+ rt2800_bbp_write(rt2x00dev, 195, 128); -+ rt2800_bbp_write(rt2x00dev, 196, 0xA0); -+ rt2800_bbp_write(rt2x00dev, 195, 170); -+ rt2800_bbp_write(rt2x00dev, 196, 0x12); -+ rt2800_bbp_write(rt2x00dev, 195, 171); -+ rt2800_bbp_write(rt2x00dev, 196, 0x10); -+ } else { -+ rt2800_bbp_write(rt2x00dev, 91, 0x06); -+ rt2800_bbp_write(rt2x00dev, 95, 0x9A); -+ rt2800_bbp_write(rt2x00dev, 195, 128); -+ rt2800_bbp_write(rt2x00dev, 196, 0xE0); -+ rt2800_bbp_write(rt2x00dev, 195, 170); -+ rt2800_bbp_write(rt2x00dev, 196, 0x30); -+ rt2800_bbp_write(rt2x00dev, 195, 171); -+ rt2800_bbp_write(rt2x00dev, 196, 0x30); -+ } -+ -+ if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) { -+ rt2800_bbp_write(rt2x00dev, 75, 0x60); -+ rt2800_bbp_write(rt2x00dev, 76, 0x44); -+ rt2800_bbp_write(rt2x00dev, 79, 0x1C); -+ rt2800_bbp_write(rt2x00dev, 80, 0x0C); -+ rt2800_bbp_write(rt2x00dev, 82, 0xB6); -+ } -+ -+ /* On 11A, We should delay and wait RF/BBP to be stable -+ * and the appropriate time should be 1000 micro seconds -+ * 2005/06/05 - On 11G, we also need this delay time. -+ * Otherwise it's difficult to pass the WHQL. -+ */ -+ usleep_range(1000, 1500); -+ } - } - EXPORT_SYMBOL_GPL(rt2800_vco_calibration); - -@@ -4568,7 +5049,8 @@ static u8 rt2800_get_default_vgc(struct rt2x00_dev *rt2x00dev) - rt2x00_rt(rt2x00dev, RT3593) || - rt2x00_rt(rt2x00dev, RT5390) || - rt2x00_rt(rt2x00dev, RT5392) || -- rt2x00_rt(rt2x00dev, RT5592)) -+ rt2x00_rt(rt2x00dev, RT5592) || -+ rt2x00_rt(rt2x00dev, RT6352)) - vgc = 0x1c + (2 * rt2x00dev->lna_gain); - else - vgc = 0x2e + rt2x00dev->lna_gain; -@@ -4795,7 +5277,8 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev) - 0x00000000); - } - } else if (rt2x00_rt(rt2x00dev, RT5390) || -- rt2x00_rt(rt2x00dev, RT5392)) { -+ rt2x00_rt(rt2x00dev, RT5392) || -+ rt2x00_rt(rt2x00dev, RT6352)) { - rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404); - rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606); - rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000); -@@ -4805,6 +5288,24 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev) - rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000); - } else if (rt2x00_rt(rt2x00dev, RT5350)) { - rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404); -+ } else if (rt2x00_rt(rt2x00dev, RT6352)) { -+ rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000401); -+ rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x000C0000); -+ rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000); -+ rt2800_register_write(rt2x00dev, MIMO_PS_CFG, 0x00000002); -+ rt2800_register_write(rt2x00dev, TX_PIN_CFG, 0x00150F0F); -+ rt2800_register_write(rt2x00dev, TX_ALC_VGA3, 0x06060606); -+ rt2800_register_write(rt2x00dev, TX0_BB_GAIN_ATTEN, 0x0); -+ rt2800_register_write(rt2x00dev, TX1_BB_GAIN_ATTEN, 0x0); -+ rt2800_register_write(rt2x00dev, TX0_RF_GAIN_ATTEN, 0x6C6C666C); -+ rt2800_register_write(rt2x00dev, TX1_RF_GAIN_ATTEN, 0x6C6C666C); -+ rt2800_register_write(rt2x00dev, TX0_RF_GAIN_CORRECT, -+ 0x3630363A); -+ rt2800_register_write(rt2x00dev, TX1_RF_GAIN_CORRECT, -+ 0x3630363A); -+ rt2800_register_read(rt2x00dev, TX_ALC_CFG_1, ®); -+ rt2x00_set_field32(®, TX_ALC_CFG_1_ROS_BUSY_EN, 0); -+ rt2800_register_write(rt2x00dev, TX_ALC_CFG_1, reg); - } else { - rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000000); - rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606); -@@ -5786,6 +6287,231 @@ static void rt2800_init_bbp_5592(struct rt2x00_dev *rt2x00dev) - rt2800_bbp_write(rt2x00dev, 103, 0xc0); - } - -+static void rt2800_bbp_glrt_write(struct rt2x00_dev *rt2x00dev, -+ const u8 reg, const u8 value) -+{ -+ rt2800_bbp_write(rt2x00dev, 195, reg); -+ rt2800_bbp_write(rt2x00dev, 196, value); -+} -+ -+static void rt2800_bbp_dcoc_write(struct rt2x00_dev *rt2x00dev, -+ const u8 reg, const u8 value) -+{ -+ rt2800_bbp_write(rt2x00dev, 158, reg); -+ rt2800_bbp_write(rt2x00dev, 159, value); -+} -+ -+static void rt2800_bbp_dcoc_read(struct rt2x00_dev *rt2x00dev, -+ const u8 reg, u8 *value) -+{ -+ rt2800_bbp_write(rt2x00dev, 158, reg); -+ rt2800_bbp_read(rt2x00dev, 159, value); -+} -+ -+static void rt2800_init_bbp_6352(struct rt2x00_dev *rt2x00dev) -+{ -+ u8 bbp; -+ -+ /* Apply Maximum Likelihood Detection (MLD) for 2 stream case */ -+ rt2800_bbp_read(rt2x00dev, 105, &bbp); -+ rt2x00_set_field8(&bbp, BBP105_MLD, -+ rt2x00dev->default_ant.rx_chain_num == 2); -+ rt2800_bbp_write(rt2x00dev, 105, bbp); -+ -+ /* Avoid data loss and CRC errors */ -+ rt2800_bbp4_mac_if_ctrl(rt2x00dev); -+ -+ /* Fix I/Q swap issue */ -+ rt2800_bbp_read(rt2x00dev, 1, &bbp); -+ bbp |= 0x04; -+ rt2800_bbp_write(rt2x00dev, 1, bbp); -+ -+ /* BBP for G band */ -+ rt2800_bbp_write(rt2x00dev, 3, 0x08); -+ rt2800_bbp_write(rt2x00dev, 4, 0x00); /* rt2800_bbp4_mac_if_ctrl? */ -+ rt2800_bbp_write(rt2x00dev, 6, 0x08); -+ rt2800_bbp_write(rt2x00dev, 14, 0x09); -+ rt2800_bbp_write(rt2x00dev, 15, 0xFF); -+ rt2800_bbp_write(rt2x00dev, 16, 0x01); -+ rt2800_bbp_write(rt2x00dev, 20, 0x06); -+ rt2800_bbp_write(rt2x00dev, 21, 0x00); -+ rt2800_bbp_write(rt2x00dev, 22, 0x00); -+ rt2800_bbp_write(rt2x00dev, 27, 0x00); -+ rt2800_bbp_write(rt2x00dev, 28, 0x00); -+ rt2800_bbp_write(rt2x00dev, 30, 0x00); -+ rt2800_bbp_write(rt2x00dev, 31, 0x48); -+ rt2800_bbp_write(rt2x00dev, 47, 0x40); -+ rt2800_bbp_write(rt2x00dev, 62, 0x00); -+ rt2800_bbp_write(rt2x00dev, 63, 0x00); -+ rt2800_bbp_write(rt2x00dev, 64, 0x00); -+ rt2800_bbp_write(rt2x00dev, 65, 0x2C); -+ rt2800_bbp_write(rt2x00dev, 66, 0x1C); -+ rt2800_bbp_write(rt2x00dev, 67, 0x20); -+ rt2800_bbp_write(rt2x00dev, 68, 0xDD); -+ rt2800_bbp_write(rt2x00dev, 69, 0x10); -+ rt2800_bbp_write(rt2x00dev, 70, 0x05); -+ rt2800_bbp_write(rt2x00dev, 73, 0x18); -+ rt2800_bbp_write(rt2x00dev, 74, 0x0F); -+ rt2800_bbp_write(rt2x00dev, 75, 0x60); -+ rt2800_bbp_write(rt2x00dev, 76, 0x44); -+ rt2800_bbp_write(rt2x00dev, 77, 0x59); -+ rt2800_bbp_write(rt2x00dev, 78, 0x1E); -+ rt2800_bbp_write(rt2x00dev, 79, 0x1C); -+ rt2800_bbp_write(rt2x00dev, 80, 0x0C); -+ rt2800_bbp_write(rt2x00dev, 81, 0x3A); -+ rt2800_bbp_write(rt2x00dev, 82, 0xB6); -+ rt2800_bbp_write(rt2x00dev, 83, 0x9A); -+ rt2800_bbp_write(rt2x00dev, 84, 0x9A); -+ rt2800_bbp_write(rt2x00dev, 86, 0x38); -+ rt2800_bbp_write(rt2x00dev, 88, 0x90); -+ rt2800_bbp_write(rt2x00dev, 91, 0x04); -+ rt2800_bbp_write(rt2x00dev, 92, 0x02); -+ rt2800_bbp_write(rt2x00dev, 95, 0x9A); -+ rt2800_bbp_write(rt2x00dev, 96, 0x00); -+ rt2800_bbp_write(rt2x00dev, 103, 0xC0); -+ rt2800_bbp_write(rt2x00dev, 104, 0x92); -+ /* FIXME BBP105 owerwrite */ -+ rt2800_bbp_write(rt2x00dev, 105, 0x3C); -+ rt2800_bbp_write(rt2x00dev, 106, 0x12); -+ rt2800_bbp_write(rt2x00dev, 109, 0x00); -+ rt2800_bbp_write(rt2x00dev, 134, 0x10); -+ rt2800_bbp_write(rt2x00dev, 135, 0xA6); -+ rt2800_bbp_write(rt2x00dev, 137, 0x04); -+ rt2800_bbp_write(rt2x00dev, 142, 0x30); -+ rt2800_bbp_write(rt2x00dev, 143, 0xF7); -+ rt2800_bbp_write(rt2x00dev, 160, 0xEC); -+ rt2800_bbp_write(rt2x00dev, 161, 0xC4); -+ rt2800_bbp_write(rt2x00dev, 162, 0x77); -+ rt2800_bbp_write(rt2x00dev, 163, 0xF9); -+ rt2800_bbp_write(rt2x00dev, 164, 0x00); -+ rt2800_bbp_write(rt2x00dev, 165, 0x00); -+ rt2800_bbp_write(rt2x00dev, 186, 0x00); -+ rt2800_bbp_write(rt2x00dev, 187, 0x00); -+ rt2800_bbp_write(rt2x00dev, 188, 0x00); -+ rt2800_bbp_write(rt2x00dev, 186, 0x00); -+ rt2800_bbp_write(rt2x00dev, 187, 0x01); -+ rt2800_bbp_write(rt2x00dev, 188, 0x00); -+ rt2800_bbp_write(rt2x00dev, 189, 0x00); -+ -+ rt2800_bbp_write(rt2x00dev, 91, 0x06); -+ rt2800_bbp_write(rt2x00dev, 92, 0x04); -+ rt2800_bbp_write(rt2x00dev, 93, 0x54); -+ rt2800_bbp_write(rt2x00dev, 99, 0x50); -+ rt2800_bbp_write(rt2x00dev, 148, 0x84); -+ rt2800_bbp_write(rt2x00dev, 167, 0x80); -+ rt2800_bbp_write(rt2x00dev, 178, 0xFF); -+ rt2800_bbp_write(rt2x00dev, 106, 0x13); -+ -+ /* BBP for G band GLRT function (BBP_128 ~ BBP_221) */ -+ rt2800_bbp_glrt_write(rt2x00dev, 0, 0x00); -+ rt2800_bbp_glrt_write(rt2x00dev, 1, 0x14); -+ rt2800_bbp_glrt_write(rt2x00dev, 2, 0x20); -+ rt2800_bbp_glrt_write(rt2x00dev, 3, 0x0A); -+ rt2800_bbp_glrt_write(rt2x00dev, 10, 0x16); -+ rt2800_bbp_glrt_write(rt2x00dev, 11, 0x06); -+ rt2800_bbp_glrt_write(rt2x00dev, 12, 0x02); -+ rt2800_bbp_glrt_write(rt2x00dev, 13, 0x07); -+ rt2800_bbp_glrt_write(rt2x00dev, 14, 0x05); -+ rt2800_bbp_glrt_write(rt2x00dev, 15, 0x09); -+ rt2800_bbp_glrt_write(rt2x00dev, 16, 0x20); -+ rt2800_bbp_glrt_write(rt2x00dev, 17, 0x08); -+ rt2800_bbp_glrt_write(rt2x00dev, 18, 0x4A); -+ rt2800_bbp_glrt_write(rt2x00dev, 19, 0x00); -+ rt2800_bbp_glrt_write(rt2x00dev, 20, 0x00); -+ rt2800_bbp_glrt_write(rt2x00dev, 128, 0xE0); -+ rt2800_bbp_glrt_write(rt2x00dev, 129, 0x1F); -+ rt2800_bbp_glrt_write(rt2x00dev, 130, 0x4F); -+ rt2800_bbp_glrt_write(rt2x00dev, 131, 0x32); -+ rt2800_bbp_glrt_write(rt2x00dev, 132, 0x08); -+ rt2800_bbp_glrt_write(rt2x00dev, 133, 0x28); -+ rt2800_bbp_glrt_write(rt2x00dev, 134, 0x19); -+ rt2800_bbp_glrt_write(rt2x00dev, 135, 0x0A); -+ rt2800_bbp_glrt_write(rt2x00dev, 138, 0x16); -+ rt2800_bbp_glrt_write(rt2x00dev, 139, 0x10); -+ rt2800_bbp_glrt_write(rt2x00dev, 140, 0x10); -+ rt2800_bbp_glrt_write(rt2x00dev, 141, 0x1A); -+ rt2800_bbp_glrt_write(rt2x00dev, 142, 0x36); -+ rt2800_bbp_glrt_write(rt2x00dev, 143, 0x2C); -+ rt2800_bbp_glrt_write(rt2x00dev, 144, 0x26); -+ rt2800_bbp_glrt_write(rt2x00dev, 145, 0x24); -+ rt2800_bbp_glrt_write(rt2x00dev, 146, 0x42); -+ rt2800_bbp_glrt_write(rt2x00dev, 147, 0x40); -+ rt2800_bbp_glrt_write(rt2x00dev, 148, 0x30); -+ rt2800_bbp_glrt_write(rt2x00dev, 149, 0x29); -+ rt2800_bbp_glrt_write(rt2x00dev, 150, 0x4C); -+ rt2800_bbp_glrt_write(rt2x00dev, 151, 0x46); -+ rt2800_bbp_glrt_write(rt2x00dev, 152, 0x3D); -+ rt2800_bbp_glrt_write(rt2x00dev, 153, 0x40); -+ rt2800_bbp_glrt_write(rt2x00dev, 154, 0x3E); -+ rt2800_bbp_glrt_write(rt2x00dev, 155, 0x38); -+ rt2800_bbp_glrt_write(rt2x00dev, 156, 0x3D); -+ rt2800_bbp_glrt_write(rt2x00dev, 157, 0x2F); -+ rt2800_bbp_glrt_write(rt2x00dev, 158, 0x3C); -+ rt2800_bbp_glrt_write(rt2x00dev, 159, 0x34); -+ rt2800_bbp_glrt_write(rt2x00dev, 160, 0x2C); -+ rt2800_bbp_glrt_write(rt2x00dev, 161, 0x2F); -+ rt2800_bbp_glrt_write(rt2x00dev, 162, 0x3C); -+ rt2800_bbp_glrt_write(rt2x00dev, 163, 0x35); -+ rt2800_bbp_glrt_write(rt2x00dev, 164, 0x2E); -+ rt2800_bbp_glrt_write(rt2x00dev, 165, 0x2F); -+ rt2800_bbp_glrt_write(rt2x00dev, 166, 0x49); -+ rt2800_bbp_glrt_write(rt2x00dev, 167, 0x41); -+ rt2800_bbp_glrt_write(rt2x00dev, 168, 0x36); -+ rt2800_bbp_glrt_write(rt2x00dev, 169, 0x39); -+ rt2800_bbp_glrt_write(rt2x00dev, 170, 0x30); -+ rt2800_bbp_glrt_write(rt2x00dev, 171, 0x30); -+ rt2800_bbp_glrt_write(rt2x00dev, 172, 0x0E); -+ rt2800_bbp_glrt_write(rt2x00dev, 173, 0x0D); -+ rt2800_bbp_glrt_write(rt2x00dev, 174, 0x28); -+ rt2800_bbp_glrt_write(rt2x00dev, 175, 0x21); -+ rt2800_bbp_glrt_write(rt2x00dev, 176, 0x1C); -+ rt2800_bbp_glrt_write(rt2x00dev, 177, 0x16); -+ rt2800_bbp_glrt_write(rt2x00dev, 178, 0x50); -+ rt2800_bbp_glrt_write(rt2x00dev, 179, 0x4A); -+ rt2800_bbp_glrt_write(rt2x00dev, 180, 0x43); -+ rt2800_bbp_glrt_write(rt2x00dev, 181, 0x50); -+ rt2800_bbp_glrt_write(rt2x00dev, 182, 0x10); -+ rt2800_bbp_glrt_write(rt2x00dev, 183, 0x10); -+ rt2800_bbp_glrt_write(rt2x00dev, 184, 0x10); -+ rt2800_bbp_glrt_write(rt2x00dev, 185, 0x10); -+ rt2800_bbp_glrt_write(rt2x00dev, 200, 0x7D); -+ rt2800_bbp_glrt_write(rt2x00dev, 201, 0x14); -+ rt2800_bbp_glrt_write(rt2x00dev, 202, 0x32); -+ rt2800_bbp_glrt_write(rt2x00dev, 203, 0x2C); -+ rt2800_bbp_glrt_write(rt2x00dev, 204, 0x36); -+ rt2800_bbp_glrt_write(rt2x00dev, 205, 0x4C); -+ rt2800_bbp_glrt_write(rt2x00dev, 206, 0x43); -+ rt2800_bbp_glrt_write(rt2x00dev, 207, 0x2C); -+ rt2800_bbp_glrt_write(rt2x00dev, 208, 0x2E); -+ rt2800_bbp_glrt_write(rt2x00dev, 209, 0x36); -+ rt2800_bbp_glrt_write(rt2x00dev, 210, 0x30); -+ rt2800_bbp_glrt_write(rt2x00dev, 211, 0x6E); -+ -+ /* BBP for G band DCOC function */ -+ rt2800_bbp_dcoc_write(rt2x00dev, 140, 0x0C); -+ rt2800_bbp_dcoc_write(rt2x00dev, 141, 0x00); -+ rt2800_bbp_dcoc_write(rt2x00dev, 142, 0x10); -+ rt2800_bbp_dcoc_write(rt2x00dev, 143, 0x10); -+ rt2800_bbp_dcoc_write(rt2x00dev, 144, 0x10); -+ rt2800_bbp_dcoc_write(rt2x00dev, 145, 0x10); -+ rt2800_bbp_dcoc_write(rt2x00dev, 146, 0x08); -+ rt2800_bbp_dcoc_write(rt2x00dev, 147, 0x40); -+ rt2800_bbp_dcoc_write(rt2x00dev, 148, 0x04); -+ rt2800_bbp_dcoc_write(rt2x00dev, 149, 0x04); -+ rt2800_bbp_dcoc_write(rt2x00dev, 150, 0x08); -+ rt2800_bbp_dcoc_write(rt2x00dev, 151, 0x08); -+ rt2800_bbp_dcoc_write(rt2x00dev, 152, 0x03); -+ rt2800_bbp_dcoc_write(rt2x00dev, 153, 0x03); -+ rt2800_bbp_dcoc_write(rt2x00dev, 154, 0x03); -+ rt2800_bbp_dcoc_write(rt2x00dev, 155, 0x02); -+ rt2800_bbp_dcoc_write(rt2x00dev, 156, 0x40); -+ rt2800_bbp_dcoc_write(rt2x00dev, 157, 0x40); -+ rt2800_bbp_dcoc_write(rt2x00dev, 158, 0x64); -+ rt2800_bbp_dcoc_write(rt2x00dev, 159, 0x64); -+ -+ rt2800_bbp4_mac_if_ctrl(rt2x00dev); -+} -+ - static void rt2800_init_bbp(struct rt2x00_dev *rt2x00dev) - { - unsigned int i; -@@ -5830,6 +6556,9 @@ static void rt2800_init_bbp(struct rt2x00_dev *rt2x00dev) - case RT5592: - rt2800_init_bbp_5592(rt2x00dev); - return; -+ case RT6352: -+ rt2800_init_bbp_6352(rt2x00dev); -+ break; - } - - for (i = 0; i < EEPROM_BBP_SIZE; i++) { -@@ -6901,6 +7630,615 @@ static void rt2800_init_rfcsr_5592(struct rt2x00_dev *rt2x00dev) - rt2800_led_open_drain_enable(rt2x00dev); - } - -+static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev, -+ bool set_bw, bool is_ht40) -+{ -+ u8 bbp_val; -+ -+ rt2800_bbp_read(rt2x00dev, 21, &bbp_val); -+ bbp_val |= 0x1; -+ rt2800_bbp_write(rt2x00dev, 21, bbp_val); -+ usleep_range(100, 200); -+ -+ if (set_bw) { -+ rt2800_bbp_read(rt2x00dev, 4, &bbp_val); -+ rt2x00_set_field8(&bbp_val, BBP4_BANDWIDTH, 2 * is_ht40); -+ rt2800_bbp_write(rt2x00dev, 4, bbp_val); -+ usleep_range(100, 200); -+ } -+ -+ rt2800_bbp_read(rt2x00dev, 21, &bbp_val); -+ bbp_val &= (~0x1); -+ rt2800_bbp_write(rt2x00dev, 21, bbp_val); -+ usleep_range(100, 200); -+} -+ -+static int rt2800_rf_lp_config(struct rt2x00_dev *rt2x00dev, bool btxcal) -+{ -+ u8 rf_val; -+ -+ if (btxcal) -+ rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x04); -+ else -+ rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x02); -+ -+ rt2800_register_write(rt2x00dev, RF_BYPASS0, 0x06); -+ -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 17, &rf_val); -+ rf_val |= 0x80; -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 17, rf_val); -+ -+ if (btxcal) { -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 18, 0xC1); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 19, 0x20); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 20, 0x02); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 3, &rf_val); -+ rf_val &= (~0x3F); -+ rf_val |= 0x3F; -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 3, rf_val); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 4, &rf_val); -+ rf_val &= (~0x3F); -+ rf_val |= 0x3F; -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 4, rf_val); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 5, 0x31); -+ } else { -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 18, 0xF1); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 19, 0x18); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 20, 0x02); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 3, &rf_val); -+ rf_val &= (~0x3F); -+ rf_val |= 0x34; -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 3, rf_val); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 4, &rf_val); -+ rf_val &= (~0x3F); -+ rf_val |= 0x34; -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 4, rf_val); -+ } -+ -+ return 0; -+} -+ -+static char rt2800_lp_tx_filter_bw_cal(struct rt2x00_dev *rt2x00dev) -+{ -+ unsigned int cnt; -+ u8 bbp_val; -+ char cal_val; -+ -+ rt2800_bbp_dcoc_write(rt2x00dev, 0, 0x82); -+ -+ cnt = 0; -+ do { -+ usleep_range(500, 2000); -+ rt2800_bbp_read(rt2x00dev, 159, &bbp_val); -+ if (bbp_val == 0x02 || cnt == 20) -+ break; -+ -+ cnt++; -+ } while (cnt < 20); -+ -+ rt2800_bbp_dcoc_read(rt2x00dev, 0x39, &bbp_val); -+ cal_val = bbp_val & 0x7F; -+ if (cal_val >= 0x40) -+ cal_val -= 128; -+ -+ return cal_val; -+} -+ -+static void rt2800_bw_filter_calibration(struct rt2x00_dev *rt2x00dev, -+ bool btxcal) -+{ -+ struct rt2800_drv_data *drv_data = rt2x00dev->drv_data; -+ u8 tx_agc_fc = 0, rx_agc_fc = 0, cmm_agc_fc; -+ u8 filter_target; -+ u8 tx_filter_target_20m = 0x09, tx_filter_target_40m = 0x02; -+ u8 rx_filter_target_20m = 0x27, rx_filter_target_40m = 0x31; -+ int loop = 0, is_ht40, cnt; -+ u8 bbp_val, rf_val; -+ char cal_r32_init, cal_r32_val, cal_diff; -+ u8 saverfb5r00, saverfb5r01, saverfb5r03, saverfb5r04, saverfb5r05; -+ u8 saverfb5r06, saverfb5r07; -+ u8 saverfb5r08, saverfb5r17, saverfb5r18, saverfb5r19, saverfb5r20; -+ u8 saverfb5r37, saverfb5r38, saverfb5r39, saverfb5r40, saverfb5r41; -+ u8 saverfb5r42, saverfb5r43, saverfb5r44, saverfb5r45, saverfb5r46; -+ u8 saverfb5r58, saverfb5r59; -+ u8 savebbp159r0, savebbp159r2, savebbpr23; -+ u32 MAC_RF_CONTROL0, MAC_RF_BYPASS0; -+ -+ /* Save MAC registers */ -+ rt2800_register_read(rt2x00dev, RF_CONTROL0, &MAC_RF_CONTROL0); -+ rt2800_register_read(rt2x00dev, RF_BYPASS0, &MAC_RF_BYPASS0); -+ -+ /* save BBP registers */ -+ rt2800_bbp_read(rt2x00dev, 23, &savebbpr23); -+ -+ rt2800_bbp_dcoc_read(rt2x00dev, 0, &savebbp159r0); -+ rt2800_bbp_dcoc_read(rt2x00dev, 2, &savebbp159r2); -+ -+ /* Save RF registers */ -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 0, &saverfb5r00); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 1, &saverfb5r01); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 3, &saverfb5r03); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 4, &saverfb5r04); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 5, &saverfb5r05); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 6, &saverfb5r06); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 7, &saverfb5r07); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 8, &saverfb5r08); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 17, &saverfb5r17); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 18, &saverfb5r18); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 19, &saverfb5r19); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 20, &saverfb5r20); -+ -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 37, &saverfb5r37); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 38, &saverfb5r38); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 39, &saverfb5r39); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 40, &saverfb5r40); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 41, &saverfb5r41); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 42, &saverfb5r42); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 43, &saverfb5r43); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 44, &saverfb5r44); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 45, &saverfb5r45); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 46, &saverfb5r46); -+ -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 58, &saverfb5r58); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 59, &saverfb5r59); -+ -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 0, &rf_val); -+ rf_val |= 0x3; -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 0, rf_val); -+ -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 1, &rf_val); -+ rf_val |= 0x1; -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 1, rf_val); -+ -+ cnt = 0; -+ do { -+ usleep_range(500, 2000); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 1, &rf_val); -+ if (((rf_val & 0x1) == 0x00) || (cnt == 40)) -+ break; -+ cnt++; -+ } while (cnt < 40); -+ -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 0, &rf_val); -+ rf_val &= (~0x3); -+ rf_val |= 0x1; -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 0, rf_val); -+ -+ /* I-3 */ -+ rt2800_bbp_read(rt2x00dev, 23, &bbp_val); -+ bbp_val &= (~0x1F); -+ bbp_val |= 0x10; -+ rt2800_bbp_write(rt2x00dev, 23, bbp_val); -+ -+ do { -+ /* I-4,5,6,7,8,9 */ -+ if (loop == 0) { -+ is_ht40 = false; -+ -+ if (btxcal) -+ filter_target = tx_filter_target_20m; -+ else -+ filter_target = rx_filter_target_20m; -+ } else { -+ is_ht40 = true; -+ -+ if (btxcal) -+ filter_target = tx_filter_target_40m; -+ else -+ filter_target = rx_filter_target_40m; -+ } -+ -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 8, &rf_val); -+ rf_val &= (~0x04); -+ if (loop == 1) -+ rf_val |= 0x4; -+ -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 8, rf_val); -+ -+ rt2800_bbp_core_soft_reset(rt2x00dev, true, is_ht40); -+ -+ rt2800_rf_lp_config(rt2x00dev, btxcal); -+ if (btxcal) { -+ tx_agc_fc = 0; -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 58, &rf_val); -+ rf_val &= (~0x7F); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 58, rf_val); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 59, &rf_val); -+ rf_val &= (~0x7F); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 59, rf_val); -+ } else { -+ rx_agc_fc = 0; -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 6, &rf_val); -+ rf_val &= (~0x7F); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 6, rf_val); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 7, &rf_val); -+ rf_val &= (~0x7F); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 7, rf_val); -+ } -+ -+ usleep_range(1000, 2000); -+ -+ rt2800_bbp_dcoc_read(rt2x00dev, 2, &bbp_val); -+ bbp_val &= (~0x6); -+ rt2800_bbp_dcoc_write(rt2x00dev, 2, bbp_val); -+ -+ rt2800_bbp_core_soft_reset(rt2x00dev, false, is_ht40); -+ -+ cal_r32_init = rt2800_lp_tx_filter_bw_cal(rt2x00dev); -+ -+ rt2800_bbp_dcoc_read(rt2x00dev, 2, &bbp_val); -+ bbp_val |= 0x6; -+ rt2800_bbp_dcoc_write(rt2x00dev, 2, bbp_val); -+do_cal: -+ if (btxcal) { -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 58, &rf_val); -+ rf_val &= (~0x7F); -+ rf_val |= tx_agc_fc; -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 58, rf_val); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 59, &rf_val); -+ rf_val &= (~0x7F); -+ rf_val |= tx_agc_fc; -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 59, rf_val); -+ } else { -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 6, &rf_val); -+ rf_val &= (~0x7F); -+ rf_val |= rx_agc_fc; -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 6, rf_val); -+ rt2800_rfcsr_read_bank(rt2x00dev, 5, 7, &rf_val); -+ rf_val &= (~0x7F); -+ rf_val |= rx_agc_fc; -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 7, rf_val); -+ } -+ -+ usleep_range(500, 1000); -+ -+ rt2800_bbp_core_soft_reset(rt2x00dev, false, is_ht40); -+ -+ cal_r32_val = rt2800_lp_tx_filter_bw_cal(rt2x00dev); -+ -+ cal_diff = cal_r32_init - cal_r32_val; -+ -+ if (btxcal) -+ cmm_agc_fc = tx_agc_fc; -+ else -+ cmm_agc_fc = rx_agc_fc; -+ -+ if (((cal_diff > filter_target) && (cmm_agc_fc == 0)) || -+ ((cal_diff < filter_target) && (cmm_agc_fc == 0x3f))) { -+ if (btxcal) -+ tx_agc_fc = 0; -+ else -+ rx_agc_fc = 0; -+ } else if ((cal_diff <= filter_target) && (cmm_agc_fc < 0x3f)) { -+ if (btxcal) -+ tx_agc_fc++; -+ else -+ rx_agc_fc++; -+ goto do_cal; -+ } -+ -+ if (btxcal) { -+ if (loop == 0) -+ drv_data->tx_calibration_bw20 = tx_agc_fc; -+ else -+ drv_data->tx_calibration_bw40 = tx_agc_fc; -+ } else { -+ if (loop == 0) -+ drv_data->rx_calibration_bw20 = rx_agc_fc; -+ else -+ drv_data->rx_calibration_bw40 = rx_agc_fc; -+ } -+ -+ loop++; -+ } while (loop <= 1); -+ -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 0, saverfb5r00); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 1, saverfb5r01); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 3, saverfb5r03); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 4, saverfb5r04); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 5, saverfb5r05); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 6, saverfb5r06); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 7, saverfb5r07); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 8, saverfb5r08); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 17, saverfb5r17); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 18, saverfb5r18); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 19, saverfb5r19); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 20, saverfb5r20); -+ -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 37, saverfb5r37); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 38, saverfb5r38); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 39, saverfb5r39); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 40, saverfb5r40); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 41, saverfb5r41); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 42, saverfb5r42); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 43, saverfb5r43); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 44, saverfb5r44); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 45, saverfb5r45); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 46, saverfb5r46); -+ -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 58, saverfb5r58); -+ rt2800_rfcsr_write_bank(rt2x00dev, 5, 59, saverfb5r59); -+ -+ rt2800_bbp_write(rt2x00dev, 23, savebbpr23); -+ -+ rt2800_bbp_dcoc_write(rt2x00dev, 0, savebbp159r0); -+ rt2800_bbp_dcoc_write(rt2x00dev, 2, savebbp159r2); -+ -+ rt2800_bbp_read(rt2x00dev, 4, &bbp_val); -+ rt2x00_set_field8(&bbp_val, BBP4_BANDWIDTH, -+ 2 * test_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags)); -+ rt2800_bbp_write(rt2x00dev, 4, bbp_val); -+ -+ rt2800_register_write(rt2x00dev, RF_CONTROL0, MAC_RF_CONTROL0); -+ rt2800_register_write(rt2x00dev, RF_BYPASS0, MAC_RF_BYPASS0); -+} -+ -+static void rt2800_init_rfcsr_6352(struct rt2x00_dev *rt2x00dev) -+{ -+ /* Initialize RF central register to default value */ -+ rt2800_rfcsr_write(rt2x00dev, 0, 0x02); -+ rt2800_rfcsr_write(rt2x00dev, 1, 0x03); -+ rt2800_rfcsr_write(rt2x00dev, 2, 0x33); -+ rt2800_rfcsr_write(rt2x00dev, 3, 0xFF); -+ rt2800_rfcsr_write(rt2x00dev, 4, 0x0C); -+ rt2800_rfcsr_write(rt2x00dev, 5, 0x40); -+ rt2800_rfcsr_write(rt2x00dev, 6, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 7, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 8, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 9, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 10, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 11, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 12, rt2x00dev->freq_offset); -+ rt2800_rfcsr_write(rt2x00dev, 13, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 14, 0x40); -+ rt2800_rfcsr_write(rt2x00dev, 15, 0x22); -+ rt2800_rfcsr_write(rt2x00dev, 16, 0x4C); -+ rt2800_rfcsr_write(rt2x00dev, 17, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 18, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 19, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 20, 0xA0); -+ rt2800_rfcsr_write(rt2x00dev, 21, 0x12); -+ rt2800_rfcsr_write(rt2x00dev, 22, 0x07); -+ rt2800_rfcsr_write(rt2x00dev, 23, 0x13); -+ rt2800_rfcsr_write(rt2x00dev, 24, 0xFE); -+ rt2800_rfcsr_write(rt2x00dev, 25, 0x24); -+ rt2800_rfcsr_write(rt2x00dev, 26, 0x7A); -+ rt2800_rfcsr_write(rt2x00dev, 27, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 28, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 29, 0x05); -+ rt2800_rfcsr_write(rt2x00dev, 30, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 31, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 32, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 33, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 34, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 35, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 36, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 37, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 38, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 39, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 40, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 41, 0xD0); -+ rt2800_rfcsr_write(rt2x00dev, 42, 0x5B); -+ rt2800_rfcsr_write(rt2x00dev, 43, 0x00); -+ -+ rt2800_rfcsr_write(rt2x00dev, 11, 0x21); -+ if (rt2800_clk_is_20mhz(rt2x00dev)) -+ rt2800_rfcsr_write(rt2x00dev, 13, 0x03); -+ else -+ rt2800_rfcsr_write(rt2x00dev, 13, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 14, 0x7C); -+ rt2800_rfcsr_write(rt2x00dev, 16, 0x80); -+ rt2800_rfcsr_write(rt2x00dev, 17, 0x99); -+ rt2800_rfcsr_write(rt2x00dev, 18, 0x99); -+ rt2800_rfcsr_write(rt2x00dev, 19, 0x09); -+ rt2800_rfcsr_write(rt2x00dev, 20, 0x50); -+ rt2800_rfcsr_write(rt2x00dev, 21, 0xB0); -+ rt2800_rfcsr_write(rt2x00dev, 22, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 23, 0x06); -+ rt2800_rfcsr_write(rt2x00dev, 24, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 25, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 26, 0x5D); -+ rt2800_rfcsr_write(rt2x00dev, 27, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 28, 0x61); -+ rt2800_rfcsr_write(rt2x00dev, 29, 0xB5); -+ rt2800_rfcsr_write(rt2x00dev, 43, 0x02); -+ -+ rt2800_rfcsr_write(rt2x00dev, 28, 0x62); -+ rt2800_rfcsr_write(rt2x00dev, 29, 0xAD); -+ rt2800_rfcsr_write(rt2x00dev, 39, 0x80); -+ -+ /* Initialize RF channel register to default value */ -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 0, 0x03); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 1, 0x00); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 2, 0x00); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 3, 0x00); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 4, 0x00); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 5, 0x08); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 6, 0x00); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 7, 0x51); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 8, 0x53); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 9, 0x16); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 10, 0x61); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 11, 0x53); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 12, 0x22); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 13, 0x3D); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x06); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 15, 0x13); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 16, 0x22); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x27); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 18, 0x02); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 19, 0xA7); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 20, 0x01); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 21, 0x52); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 22, 0x80); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 23, 0xB3); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 24, 0x00); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 25, 0x00); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 26, 0x00); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 27, 0x00); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 28, 0x5C); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 29, 0x6B); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 30, 0x6B); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 31, 0x31); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 32, 0x5D); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 33, 0x00); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 34, 0xE6); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 35, 0x55); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 36, 0x00); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 37, 0xBB); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 38, 0xB3); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 39, 0xB3); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 40, 0x03); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 41, 0x00); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 42, 0x00); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0xB3); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0xD3); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0xD5); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 46, 0x07); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x68); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xEF); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 49, 0x1C); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x07); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0xA8); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0x85); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 57, 0x10); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x07); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0x6A); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0x85); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 61, 0x10); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 62, 0x1C); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 63, 0x00); -+ -+ rt2800_rfcsr_write_bank(rt2x00dev, 6, 45, 0xC5); -+ -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 9, 0x47); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 10, 0x71); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 11, 0x33); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x0E); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x23); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 19, 0xA4); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 20, 0x02); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 21, 0x12); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 28, 0x1C); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 29, 0xEB); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 32, 0x7D); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 34, 0xD6); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 36, 0x08); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 38, 0xB4); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0xD3); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0xB3); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0xD5); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 46, 0x27); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x69); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xFF); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x20); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x66); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xFF); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 57, 0x1C); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x20); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0x6B); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xF7); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 61, 0x09); -+ -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 10, 0x51); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x06); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 19, 0xA7); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 28, 0x2C); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x64); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 8, 0x51); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 9, 0x36); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 11, 0x53); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x16); -+ -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x6C); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xFC); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 49, 0x1F); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x27); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x66); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0x6B); -+ -+ /* Initialize RF channel register for DRQFN */ -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0xD3); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0xE3); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0xE5); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x28); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x68); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xF7); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x02); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xC7); -+ -+ /* Initialize RF DC calibration register to default value */ -+ rt2800_rfcsr_write_dccal(rt2x00dev, 0, 0x47); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 1, 0x00); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 2, 0x00); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 3, 0x00); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 4, 0x00); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 6, 0x10); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 7, 0x10); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 8, 0x04); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 9, 0x00); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 10, 0x07); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 11, 0x01); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 12, 0x07); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 13, 0x07); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 14, 0x07); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 15, 0x20); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 16, 0x22); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x00); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 18, 0x00); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 19, 0x00); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 20, 0x00); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 21, 0xF1); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 22, 0x11); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 23, 0x02); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 24, 0x41); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 25, 0x20); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 26, 0x00); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 27, 0xD7); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 28, 0xA2); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 29, 0x20); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 30, 0x49); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 31, 0x20); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 32, 0x04); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 33, 0xF1); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 34, 0xA1); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 35, 0x01); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 41, 0x00); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 42, 0x00); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 43, 0x00); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 44, 0x00); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 45, 0x00); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 46, 0x00); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 47, 0x3E); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 48, 0x3D); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 49, 0x3E); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 50, 0x3D); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 51, 0x3E); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 52, 0x3D); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 53, 0x00); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 54, 0x00); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 55, 0x00); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 56, 0x00); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 57, 0x00); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 58, 0x10); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x10); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 60, 0x0A); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 61, 0x00); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 62, 0x00); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 63, 0x00); -+ -+ rt2800_rfcsr_write_dccal(rt2x00dev, 3, 0x08); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 4, 0x04); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x20); -+ -+ rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C); -+ -+ rt2800_bw_filter_calibration(rt2x00dev, true); -+ rt2800_bw_filter_calibration(rt2x00dev, false); -+} -+ - static void rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev) - { - if (rt2800_is_305x_soc(rt2x00dev)) { -@@ -6941,6 +8279,9 @@ static void rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev) - case RT5592: - rt2800_init_rfcsr_5592(rt2x00dev); - break; -+ case RT6352: -+ rt2800_init_rfcsr_6352(rt2x00dev); -+ break; - } - } - -@@ -7307,7 +8648,8 @@ static int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev) - */ - if (rt2x00_rt(rt2x00dev, RT3290) || - rt2x00_rt(rt2x00dev, RT5390) || -- rt2x00_rt(rt2x00dev, RT5392)) -+ rt2x00_rt(rt2x00dev, RT5392) || -+ rt2x00_rt(rt2x00dev, RT6352)) - rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf); - else if (rt2x00_rt(rt2x00dev, RT3352)) - rf = RF3322; -@@ -7339,6 +8681,7 @@ static int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev) - case RF5390: - case RF5392: - case RF5592: -+ case RF7620: - break; - default: - rt2x00_err(rt2x00dev, "Invalid RF chipset 0x%04x detected\n", -@@ -7746,6 +9089,23 @@ static const struct rf_channel rf_vals_5592_xtal40[] = { - {196, 83, 0, 12, 1}, - }; - -+static const struct rf_channel rf_vals_7620[] = { -+ {1, 0x50, 0x99, 0x99, 1}, -+ {2, 0x50, 0x44, 0x44, 2}, -+ {3, 0x50, 0xEE, 0xEE, 2}, -+ {4, 0x50, 0x99, 0x99, 3}, -+ {5, 0x51, 0x44, 0x44, 0}, -+ {6, 0x51, 0xEE, 0xEE, 0}, -+ {7, 0x51, 0x99, 0x99, 1}, -+ {8, 0x51, 0x44, 0x44, 2}, -+ {9, 0x51, 0xEE, 0xEE, 2}, -+ {10, 0x51, 0x99, 0x99, 3}, -+ {11, 0x52, 0x44, 0x44, 0}, -+ {12, 0x52, 0xEE, 0xEE, 0}, -+ {13, 0x52, 0x99, 0x99, 1}, -+ {14, 0x52, 0x33, 0x33, 3}, -+}; -+ - static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev) - { - struct hw_mode_spec *spec = &rt2x00dev->spec; -@@ -7849,6 +9209,11 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev) - spec->channels = rf_vals_3x; - break; - -+ case RF7620: -+ spec->num_channels = ARRAY_SIZE(rf_vals_7620); -+ spec->channels = rf_vals_7620; -+ break; -+ - case RF3052: - case RF3053: - spec->num_channels = ARRAY_SIZE(rf_vals_3x); -@@ -7980,6 +9345,7 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev) - case RF5390: - case RF5392: - case RF5592: -+ case RF7620: - __set_bit(CAPABILITY_VCO_RECALIBRATION, &rt2x00dev->cap_flags); - break; - } -@@ -8024,6 +9390,9 @@ static int rt2800_probe_rt(struct rt2x00_dev *rt2x00dev) - return -ENODEV; - } - -+ if (rt == RT5390 && rt2x00_is_soc(rt2x00dev)) -+ rt = RT6352; -+ - rt2x00_set_rt(rt2x00dev, rt, rev); - - return 0; -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -index d9ef260d542a..f357531d9488 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -@@ -33,6 +33,10 @@ - struct rt2800_drv_data { - u8 calibration_bw20; - u8 calibration_bw40; -+ char rx_calibration_bw20; -+ char rx_calibration_bw40; -+ char tx_calibration_bw20; -+ char tx_calibration_bw40; - u8 bbp25; - u8 bbp26; - u8 txmixer_gain_24g; -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00.h b/drivers/net/wireless/ralink/rt2x00/rt2x00.h -index ce340bfd71a0..8fdd2f9726ee 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h -@@ -174,6 +174,7 @@ struct rt2x00_chip { - #define RT5390 0x5390 /* 2.4GHz */ - #define RT5392 0x5392 /* 2.4GHz */ - #define RT5592 0x5592 -+#define RT6352 0x6352 /* WSOC 2.4GHz */ - - u16 rf; - u16 rev; --- -2.12.1 - diff --git a/package/kernel/mac80211/patches/021-01-rt2800-fix-LNA-gain-assignment-for-MT7620.patch b/package/kernel/mac80211/patches/021-01-rt2800-fix-LNA-gain-assignment-for-MT7620.patch deleted file mode 100644 index 3270ea2c56..0000000000 --- a/package/kernel/mac80211/patches/021-01-rt2800-fix-LNA-gain-assignment-for-MT7620.patch +++ /dev/null @@ -1,54 +0,0 @@ -From 0109238d62a99ea779a7e28e21868118e7b8d69d Mon Sep 17 00:00:00 2001 -From: Daniel Golle -Date: Mon, 10 Apr 2017 14:28:14 +0200 -Subject: [PATCH 1/2] rt2800: fix LNA gain assignment for MT7620 -To: Stanislaw Gruszka -Cc: Helmut Schaa , - linux-wireless@vger.kernel.org, - Kalle Valo - -The base value used for MT7620 differs from Rt5392 which resulted in -quite bad RX signal quality. Fix this by using the correct base value as -well as the LNA calibration values for HT20. - -Reported-by: Tom Psyborg -Signed-off-by: Daniel Golle ---- - drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 18 ++++++++++++++++-- - 1 file changed, 16 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -index ba06ac2d876d..7135519a638c 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -3806,11 +3806,25 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, - } - - if (rt2x00_rt(rt2x00dev, RT5592) || rt2x00_rt(rt2x00dev, RT6352)) { -+ reg = 0x10; -+ if (!conf_is_ht40(conf)) { -+ if (rt2x00_rt(rt2x00dev, RT6352) && -+ rt2x00_has_cap_external_lna_bg(rt2x00dev)) { -+ reg |= 0x5; -+ } else { -+ reg |= 0xa; -+ } -+ } - rt2800_bbp_write(rt2x00dev, 195, 141); -- rt2800_bbp_write(rt2x00dev, 196, conf_is_ht40(conf) ? 0x10 : 0x1a); -+ rt2800_bbp_write(rt2x00dev, 196, reg); - - /* AGC init */ -- reg = (rf->channel <= 14 ? 0x1c : 0x24) + 2 * rt2x00dev->lna_gain; -+ if (rt2x00_rt(rt2x00dev, RT6352)) -+ reg = 0x04; -+ else -+ reg = rf->channel <= 14 ? 0x1c : 0x24; -+ -+ reg += 2 * rt2x00dev->lna_gain; - rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg); - - rt2800_iq_calibrate(rt2x00dev, rf->channel); --- -2.12.2 - diff --git a/package/kernel/mac80211/patches/021-02-rt2800-do-VCO-calibration-after-programming-ALC.patch b/package/kernel/mac80211/patches/021-02-rt2800-do-VCO-calibration-after-programming-ALC.patch deleted file mode 100644 index 1dafb78f1c..0000000000 --- a/package/kernel/mac80211/patches/021-02-rt2800-do-VCO-calibration-after-programming-ALC.patch +++ /dev/null @@ -1,34 +0,0 @@ -From feb608c7986c14bab153f31f8e96f251072e6578 Mon Sep 17 00:00:00 2001 -From: Daniel Golle -Date: Mon, 10 Apr 2017 15:33:20 +0200 -Subject: [PATCH 2/2] rt2800: do VCO calibration after programming ALC -To: Stanislaw Gruszka -Cc: Helmut Schaa , - linux-wireless@vger.kernel.org, - Kalle Valo - -Scanning fails if we don't do VCO calibration every time. -The vendor driver duplicates the VCO calibration function into the -channel switching logic, we can do the same with less duplication. - -Signed-off-by: Daniel Golle ---- - drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -index 7135519a638c..870bf315f98b 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -3407,6 +3407,8 @@ static void rt2800_config_alc(struct rt2x00_dev *rt2x00dev, - rt2800_rfcsr_write(rt2x00dev, 42, 0x5b); - } - rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, mac_sys_ctrl); -+ -+ rt2800_vco_calibration(rt2x00dev); - } - - static void rt2800_bbp_write_with_rx_chain(struct rt2x00_dev *rt2x00dev, --- -2.12.2 - diff --git a/package/kernel/mac80211/patches/021-03-rt2800-fix-mt7620-vco-calibration-registers.patch b/package/kernel/mac80211/patches/021-03-rt2800-fix-mt7620-vco-calibration-registers.patch deleted file mode 100644 index 708b0b2d31..0000000000 --- a/package/kernel/mac80211/patches/021-03-rt2800-fix-mt7620-vco-calibration-registers.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 02c452f317b4a4d06c433c294e66896a389731c1 Mon Sep 17 00:00:00 2001 -From: Daniel Golle -Date: Tue, 18 Apr 2017 11:09:53 +0200 -Subject: [PATCH] rt2800: fix mt7620 vco calibration registers -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit -To: Stanislaw Gruszka -Cc: Helmut Schaa , - linux-wireless@vger.kernel.org, - Kalle Valo , - Tom Psyborg - -Use register values from init LNA function instead of the ones from -restore LNA function. Apply register values based on rx path -configuration. - -Signed-off-by: Tomislav Požega -Signed-off-by: Daniel Golle ---- - drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -index 870bf315f98b..86cffee6876a 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -4932,7 +4932,7 @@ void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev) - rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin); - - if (rt2x00_rt(rt2x00dev, RT6352)) { -- if (rt2x00dev->default_ant.tx_chain_num == 1) { -+ if (rt2x00dev->default_ant.rx_chain_num == 1) { - rt2800_bbp_write(rt2x00dev, 91, 0x07); - rt2800_bbp_write(rt2x00dev, 95, 0x1A); - rt2800_bbp_write(rt2x00dev, 195, 128); -@@ -4953,8 +4953,8 @@ void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev) - } - - if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) { -- rt2800_bbp_write(rt2x00dev, 75, 0x60); -- rt2800_bbp_write(rt2x00dev, 76, 0x44); -+ rt2800_bbp_write(rt2x00dev, 75, 0x68); -+ rt2800_bbp_write(rt2x00dev, 76, 0x4C); - rt2800_bbp_write(rt2x00dev, 79, 0x1C); - rt2800_bbp_write(rt2x00dev, 80, 0x0C); - rt2800_bbp_write(rt2x00dev, 82, 0xB6); --- -2.12.2 - diff --git a/package/kernel/mac80211/patches/021-04-rt2800-fix-mt7620-E2-channel-registers.patch b/package/kernel/mac80211/patches/021-04-rt2800-fix-mt7620-E2-channel-registers.patch deleted file mode 100644 index 284a347f25..0000000000 --- a/package/kernel/mac80211/patches/021-04-rt2800-fix-mt7620-E2-channel-registers.patch +++ /dev/null @@ -1,41 +0,0 @@ -From c426cb0ed15ee12dfdc8c53ddd1449ac617023cf Mon Sep 17 00:00:00 2001 -From: Daniel Golle -Date: Tue, 18 Apr 2017 11:45:37 +0200 -Subject: [PATCH] rt2800: fix mt7620 E2 channel registers -To: Stanislaw Gruszka -Cc: Helmut Schaa , - linux-wireless@vger.kernel.org, - Kalle Valo , - Tom Psyborg - -From: Tomislav Požega - -update RF register 47 and 54 values according to vendor driver - -Signed-off-by: Tomislav Požega -Signed-off-by: Daniel Golle ---- - drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -index 86cffee6876a..8585cdc3de53 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -8145,9 +8145,11 @@ static void rt2800_init_rfcsr_6352(struct rt2x00_dev *rt2x00dev) - rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0xB3); - rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0xD5); - rt2800_rfcsr_write_chanreg(rt2x00dev, 46, 0x27); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x69); -+ rt2800_rfcsr_write_bank(rt2x00dev, 4, 47, 0x67); -+ rt2800_rfcsr_write_bank(rt2x00dev, 6, 47, 0x69); - rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xFF); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x20); -+ rt2800_rfcsr_write_bank(rt2x00dev, 4, 54, 0x27); -+ rt2800_rfcsr_write_bank(rt2x00dev, 6, 54, 0x20); - rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x66); - rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xFF); - rt2800_rfcsr_write_chanreg(rt2x00dev, 57, 0x1C); --- -2.12.2 - diff --git a/package/kernel/mac80211/patches/060-no_local_ssb_bcma.patch b/package/kernel/mac80211/patches/060-no_local_ssb_bcma.patch index 527938f015..1fc52f9ab0 100644 --- a/package/kernel/mac80211/patches/060-no_local_ssb_bcma.patch +++ b/package/kernel/mac80211/patches/060-no_local_ssb_bcma.patch @@ -1,6 +1,6 @@ ---- a/.local-symbols -+++ b/.local-symbols -@@ -482,45 +482,6 @@ USB_IPHETH= +--- a/local-symbols ++++ b/local-symbols +@@ -383,45 +383,6 @@ USB_IPHETH= USB_SIERRA_NET= USB_VL600= USB_NET_CH9200= @@ -48,7 +48,7 @@ NFC_NCI= --- a/drivers/net/wireless/broadcom/b43/main.c +++ b/drivers/net/wireless/broadcom/b43/main.c -@@ -2866,7 +2866,7 @@ static struct ssb_device *b43_ssb_gpio_d +@@ -2876,7 +2876,7 @@ static struct ssb_device *b43_ssb_gpio_d { struct ssb_bus *bus = dev->dev->sdev->bus; @@ -57,7 +57,7 @@ return (bus->chipco.dev ? bus->chipco.dev : bus->pcicore.dev); #else return bus->chipco.dev; -@@ -4883,7 +4883,7 @@ static int b43_wireless_core_init(struct +@@ -4893,7 +4893,7 @@ static int b43_wireless_core_init(struct } if (sprom->boardflags_lo & B43_BFL_XTAL_NOSLOW) hf |= B43_HF_DSCRQ; /* Disable slowclock requests from ucode. */ @@ -110,7 +110,7 @@ --- a/Kconfig.sources +++ b/Kconfig.sources @@ -9,9 +9,6 @@ source "$BACKPORT_DIR/drivers/net/wirele - source "$BACKPORT_DIR/drivers/net/ethernet/Kconfig" + #source "$BACKPORT_DIR/drivers/net/ethernet/Kconfig" source "$BACKPORT_DIR/drivers/net/usb/Kconfig" -source "$BACKPORT_DIR/drivers/ssb/Kconfig" @@ -118,15 +118,15 @@ - source "$BACKPORT_DIR/net/nfc/Kconfig" - source "$BACKPORT_DIR/drivers/media/Kconfig" + #source "$BACKPORT_DIR/drivers/media/Kconfig" --- a/Makefile.kernel +++ b/Makefile.kernel -@@ -38,8 +38,6 @@ obj-$(CPTCFG_MAC80211) += net/mac80211/ +@@ -39,8 +39,6 @@ obj-$(CPTCFG_MAC80211) += net/mac80211/ obj-$(CPTCFG_WLAN) += drivers/net/wireless/ - obj-$(CPTCFG_BT) += net/bluetooth/ - obj-$(CPTCFG_BT) += drivers/bluetooth/ + #obj-$(CPTCFG_BT) += net/bluetooth/ + #obj-$(CPTCFG_BT) += drivers/bluetooth/ -obj-$(CPTCFG_SSB) += drivers/ssb/ -obj-$(CPTCFG_BCMA) += drivers/bcma/ - obj-$(CPTCFG_ETHERNET) += drivers/net/ethernet/ + #obj-$(CPTCFG_ETHERNET) += drivers/net/ethernet/ obj-$(CPTCFG_USB_NET_RNDIS_WLAN) += drivers/net/usb/ obj-$(CPTCFG_NFC) += net/nfc/ diff --git a/package/kernel/mac80211/patches/080-ath10k_thermal_config.patch b/package/kernel/mac80211/patches/080-ath10k_thermal_config.patch index e08fa32a3b..796615b03c 100644 --- a/package/kernel/mac80211/patches/080-ath10k_thermal_config.patch +++ b/package/kernel/mac80211/patches/080-ath10k_thermal_config.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath10k/Kconfig +++ b/drivers/net/wireless/ath/ath10k/Kconfig -@@ -48,6 +48,12 @@ config ATH10K_TRACING +@@ -65,6 +65,12 @@ config ATH10K_TRACING ---help--- Select this to ath10k use tracing infrastructure. diff --git a/package/kernel/mac80211/patches/090-remove-cred.patch b/package/kernel/mac80211/patches/090-remove-cred.patch deleted file mode 100644 index 3adb2afb86..0000000000 --- a/package/kernel/mac80211/patches/090-remove-cred.patch +++ /dev/null @@ -1,15 +0,0 @@ -This is only needed for kernel < 2.6.29 and conflicts with kernel 4.4.42 - ---- a/backport-include/linux/cred.h -+++ /dev/null -@@ -1,10 +0,0 @@ --#ifndef __BACKPORT_LINUX_CRED_H --#define __BACKPORT_LINUX_CRED_H --#include_next --#include -- --#ifndef current_user_ns --#define current_user_ns() (current->nsproxy->user_ns) --#endif -- --#endif /* __BACKPORT_LINUX_CRED_H */ diff --git a/package/kernel/mac80211/patches/100-remove-cryptoapi-dependencies.patch b/package/kernel/mac80211/patches/100-remove-cryptoapi-dependencies.patch index 95fea441a4..0febc57b3f 100644 --- a/package/kernel/mac80211/patches/100-remove-cryptoapi-dependencies.patch +++ b/package/kernel/mac80211/patches/100-remove-cryptoapi-dependencies.patch @@ -6,9 +6,9 @@ depends on CRYPTO_AES - select BPAUTO_CRYPTO_CCM - depends on CRYPTO_GCM + depends on CRYPTO_CMAC depends on CRC32 ---help--- - This option enables the hardware independent IEEE 802.11 --- a/net/mac80211/Makefile +++ b/net/mac80211/Makefile @@ -16,9 +16,7 @@ mac80211-y := \ @@ -43,122 +43,118 @@ - struct aead_request *aead_req; - int reqsize = sizeof(*aead_req) + crypto_aead_reqsize(tfm); - u8 *__aad; -- ++ int i; + - aead_req = kzalloc(reqsize + CCM_AAD_LEN, GFP_ATOMIC); - if (!aead_req) - return -ENOMEM; -- -- __aad = (u8 *)aead_req + reqsize; -- memcpy(__aad, aad, CCM_AAD_LEN); -- -- sg_init_table(sg, 3); -- sg_set_buf(&sg[0], &__aad[2], be16_to_cpup((__be16 *)__aad)); -- sg_set_buf(&sg[1], data, data_len); -- sg_set_buf(&sg[2], mic, mic_len); -- -- aead_request_set_tfm(aead_req, tfm); -- aead_request_set_crypt(aead_req, sg, sg, data_len, b_0); -- aead_request_set_ad(aead_req, sg[0].length); -+ int i; - -- crypto_aead_encrypt(aead_req); -- kzfree(aead_req); + crypto_cipher_encrypt_one(tfm, b, b_0); -- return 0; +- __aad = (u8 *)aead_req + reqsize; +- memcpy(__aad, aad, CCM_AAD_LEN); + /* Extra Authenticate-only data (always two AES blocks) */ + for (i = 0; i < AES_BLOCK_SIZE; i++) + aad[i] ^= b[i]; + crypto_cipher_encrypt_one(tfm, b, aad); -+ + +- sg_init_table(sg, 3); +- sg_set_buf(&sg[0], &__aad[2], be16_to_cpup((__be16 *)__aad)); +- sg_set_buf(&sg[1], data, data_len); +- sg_set_buf(&sg[2], mic, mic_len); + aad += AES_BLOCK_SIZE; -+ + +- aead_request_set_tfm(aead_req, tfm); +- aead_request_set_crypt(aead_req, sg, sg, data_len, b_0); +- aead_request_set_ad(aead_req, sg[0].length); + for (i = 0; i < AES_BLOCK_SIZE; i++) + aad[i] ^= b[i]; + crypto_cipher_encrypt_one(tfm, a, aad); -+ + +- crypto_aead_encrypt(aead_req); +- kzfree(aead_req); + /* Mask out bits from auth-only-b_0 */ + b_0[0] &= 0x07; -+ + +- return 0; + /* S_0 is used to encrypt T (= MIC) */ + b_0[14] = 0; + b_0[15] = 0; + crypto_cipher_encrypt_one(tfm, s_0, b_0); -+} -+ + } + +-int ieee80211_aes_ccm_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad, +- u8 *data, size_t data_len, u8 *mic, +- size_t mic_len) + +void ieee80211_aes_ccm_encrypt(struct crypto_cipher *tfm, u8 *b_0, u8 *aad, + u8 *data, size_t data_len, u8 *mic, + size_t mic_len) -+{ -+ int i, j, last_len, num_blocks; -+ u8 b[AES_BLOCK_SIZE]; -+ u8 s_0[AES_BLOCK_SIZE]; -+ u8 e[AES_BLOCK_SIZE]; -+ u8 *pos, *cpos; -+ -+ num_blocks = DIV_ROUND_UP(data_len, AES_BLOCK_SIZE); -+ last_len = data_len % AES_BLOCK_SIZE; -+ aes_ccm_prepare(tfm, b_0, aad, s_0, b, b); -+ -+ /* Process payload blocks */ -+ pos = data; -+ cpos = data; -+ for (j = 1; j <= num_blocks; j++) { -+ int blen = (j == num_blocks && last_len) ? -+ last_len : AES_BLOCK_SIZE; -+ -+ /* Authentication followed by encryption */ -+ for (i = 0; i < blen; i++) -+ b[i] ^= pos[i]; -+ crypto_cipher_encrypt_one(tfm, b, b); -+ -+ b_0[14] = (j >> 8) & 0xff; -+ b_0[15] = j & 0xff; -+ crypto_cipher_encrypt_one(tfm, e, b_0); -+ for (i = 0; i < blen; i++) -+ *cpos++ = *pos++ ^ e[i]; -+ } -+ -+ for (i = 0; i < mic_len; i++) -+ mic[i] = b[i] ^ s_0[i]; - } - --int ieee80211_aes_ccm_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad, -+int ieee80211_aes_ccm_decrypt(struct crypto_cipher *tfm, u8 *b_0, u8 *aad, - u8 *data, size_t data_len, u8 *mic, - size_t mic_len) { - struct scatterlist sg[3]; - struct aead_request *aead_req; - int reqsize = sizeof(*aead_req) + crypto_aead_reqsize(tfm); - u8 *__aad; - int err; -- ++ int i, j, last_len, num_blocks; ++ u8 b[AES_BLOCK_SIZE]; ++ u8 s_0[AES_BLOCK_SIZE]; ++ u8 e[AES_BLOCK_SIZE]; ++ u8 *pos, *cpos; + - if (data_len == 0) - return -EINVAL; -- ++ num_blocks = DIV_ROUND_UP(data_len, AES_BLOCK_SIZE); ++ last_len = data_len % AES_BLOCK_SIZE; ++ aes_ccm_prepare(tfm, b_0, aad, s_0, b, b); + - aead_req = kzalloc(reqsize + CCM_AAD_LEN, GFP_ATOMIC); - if (!aead_req) - return -ENOMEM; -- ++ /* Process payload blocks */ ++ pos = data; ++ cpos = data; ++ for (j = 1; j <= num_blocks; j++) { ++ int blen = (j == num_blocks && last_len) ? ++ last_len : AES_BLOCK_SIZE; + - __aad = (u8 *)aead_req + reqsize; - memcpy(__aad, aad, CCM_AAD_LEN); -- ++ /* Authentication followed by encryption */ ++ for (i = 0; i < blen; i++) ++ b[i] ^= pos[i]; ++ crypto_cipher_encrypt_one(tfm, b, b); + - sg_init_table(sg, 3); - sg_set_buf(&sg[0], &__aad[2], be16_to_cpup((__be16 *)__aad)); - sg_set_buf(&sg[1], data, data_len); - sg_set_buf(&sg[2], mic, mic_len); -- ++ b_0[14] = (j >> 8) & 0xff; ++ b_0[15] = j & 0xff; ++ crypto_cipher_encrypt_one(tfm, e, b_0); ++ for (i = 0; i < blen; i++) ++ *cpos++ = *pos++ ^ e[i]; ++ } + - aead_request_set_tfm(aead_req, tfm); - aead_request_set_crypt(aead_req, sg, sg, data_len + mic_len, b_0); - aead_request_set_ad(aead_req, sg[0].length); ++ for (i = 0; i < mic_len; i++) ++ mic[i] = b[i] ^ s_0[i]; ++} + +- err = crypto_aead_decrypt(aead_req); +- kzfree(aead_req); ++int ieee80211_aes_ccm_decrypt(struct crypto_cipher *tfm, u8 *b_0, u8 *aad, ++ u8 *data, size_t data_len, u8 *mic, ++ size_t mic_len) ++{ + int i, j, last_len, num_blocks; + u8 *pos, *cpos; + u8 a[AES_BLOCK_SIZE]; + u8 b[AES_BLOCK_SIZE]; + u8 s_0[AES_BLOCK_SIZE]; -+ + +- return err; + num_blocks = DIV_ROUND_UP(data_len, AES_BLOCK_SIZE); + last_len = data_len % AES_BLOCK_SIZE; + aes_ccm_prepare(tfm, b_0, aad, s_0, a, b); @@ -185,11 +181,7 @@ + if ((mic[i] ^ s_0[i]) != a[i]) + return -1; + } - -- err = crypto_aead_decrypt(aead_req); -- kzfree(aead_req); -- -- return err; ++ + return 0; } @@ -202,12 +194,12 @@ { - struct crypto_aead *tfm; - int err; -+ struct crypto_cipher *tfm; - +- - tfm = crypto_alloc_aead("ccm(aes)", 0, CRYPTO_ALG_ASYNC); - if (IS_ERR(tfm)) - return tfm; -- ++ struct crypto_cipher *tfm; + - err = crypto_aead_setkey(tfm, key, key_len); - if (err) - goto free_aead; @@ -275,7 +267,7 @@ struct { --- a/net/mac80211/wpa.c +++ b/net/mac80211/wpa.c -@@ -305,7 +305,8 @@ ieee80211_crypto_tkip_decrypt(struct iee +@@ -306,7 +306,8 @@ ieee80211_crypto_tkip_decrypt(struct iee } @@ -285,7 +277,7 @@ { __le16 mask_fc; int a4_included, mgmt; -@@ -335,14 +336,8 @@ static void ccmp_special_blocks(struct s +@@ -336,14 +337,8 @@ static void ccmp_special_blocks(struct s else qos_tid = 0; @@ -302,7 +294,7 @@ /* Nonce: Nonce Flags | A2 | PN * Nonce Flags: Priority (b0..b3) | Management (b4) | Reserved (b5..b7) -@@ -350,6 +345,8 @@ static void ccmp_special_blocks(struct s +@@ -351,6 +346,8 @@ static void ccmp_special_blocks(struct s b_0[1] = qos_tid | (mgmt << 4); memcpy(&b_0[2], hdr->addr2, ETH_ALEN); memcpy(&b_0[8], pn, IEEE80211_CCMP_PN_LEN); @@ -311,7 +303,7 @@ /* AAD (extra authenticate-only data) / masked 802.11 header * FC | A1 | A2 | A3 | SC | [A4] | [QC] */ -@@ -406,7 +403,7 @@ static int ccmp_encrypt_skb(struct ieee8 +@@ -407,7 +404,7 @@ static int ccmp_encrypt_skb(struct ieee8 u8 *pos; u8 pn[6]; u64 pn64; @@ -320,7 +312,7 @@ u8 b_0[AES_BLOCK_SIZE]; if (info->control.hw_key && -@@ -461,9 +458,11 @@ static int ccmp_encrypt_skb(struct ieee8 +@@ -462,9 +459,11 @@ static int ccmp_encrypt_skb(struct ieee8 return 0; pos += IEEE80211_CCMP_HDR_LEN; @@ -335,7 +327,7 @@ } -@@ -536,7 +535,7 @@ ieee80211_crypto_ccmp_decrypt(struct iee +@@ -537,7 +536,7 @@ ieee80211_crypto_ccmp_decrypt(struct iee u8 aad[2 * AES_BLOCK_SIZE]; u8 b_0[AES_BLOCK_SIZE]; /* hardware didn't decrypt/verify MIC */ @@ -344,7 +336,7 @@ if (ieee80211_aes_ccm_decrypt( key->u.ccmp.tfm, b_0, aad, -@@ -638,7 +637,7 @@ static int gcmp_encrypt_skb(struct ieee8 +@@ -639,7 +638,7 @@ static int gcmp_encrypt_skb(struct ieee8 u8 *pos; u8 pn[6]; u64 pn64; @@ -353,7 +345,7 @@ u8 j_0[AES_BLOCK_SIZE]; if (info->control.hw_key && -@@ -695,8 +694,10 @@ static int gcmp_encrypt_skb(struct ieee8 +@@ -696,8 +695,10 @@ static int gcmp_encrypt_skb(struct ieee8 pos += IEEE80211_GCMP_HDR_LEN; gcmp_special_blocks(skb, pn, j_0, aad); @@ -366,7 +358,7 @@ } ieee80211_tx_result -@@ -1120,9 +1121,9 @@ ieee80211_crypto_aes_gmac_encrypt(struct +@@ -1121,9 +1122,9 @@ ieee80211_crypto_aes_gmac_encrypt(struct struct ieee80211_key *key = tx->key; struct ieee80211_mmie_16 *mmie; struct ieee80211_hdr *hdr; @@ -378,7 +370,7 @@ if (WARN_ON(skb_queue_len(&tx->skbs) != 1)) return TX_DROP; -@@ -1168,7 +1169,7 @@ ieee80211_crypto_aes_gmac_decrypt(struct +@@ -1169,7 +1170,7 @@ ieee80211_crypto_aes_gmac_decrypt(struct struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); struct ieee80211_key *key = rx->key; struct ieee80211_mmie_16 *mmie; diff --git a/package/kernel/mac80211/patches/110-mac80211_keep_keys_on_stop_ap.patch b/package/kernel/mac80211/patches/110-mac80211_keep_keys_on_stop_ap.patch index ff619129d9..005e3e5d5d 100644 --- a/package/kernel/mac80211/patches/110-mac80211_keep_keys_on_stop_ap.patch +++ b/package/kernel/mac80211/patches/110-mac80211_keep_keys_on_stop_ap.patch @@ -2,7 +2,7 @@ Used for AP+STA support in OpenWrt - preserve AP mode keys across STA reconnects --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c -@@ -1014,7 +1014,6 @@ static int ieee80211_stop_ap(struct wiph +@@ -1056,7 +1056,6 @@ static int ieee80211_stop_ap(struct wiph sdata->u.ap.driver_smps_mode = IEEE80211_SMPS_OFF; __sta_info_flush(sdata, true); diff --git a/package/kernel/mac80211/patches/130-disable-fils.patch b/package/kernel/mac80211/patches/130-disable-fils.patch new file mode 100644 index 0000000000..1f03589878 --- /dev/null +++ b/package/kernel/mac80211/patches/130-disable-fils.patch @@ -0,0 +1,32 @@ +Disable FILS support, since it pulls in crypto hash support + +--- a/net/mac80211/fils_aead.h ++++ b/net/mac80211/fils_aead.h +@@ -10,7 +10,7 @@ + #ifndef FILS_AEAD_H + #define FILS_AEAD_H + +-#if LINUX_VERSION_IS_GEQ(4,3,0) ++#if 0 /* LINUX_VERSION_IS_GEQ(4,3,0) */ + int fils_encrypt_assoc_req(struct sk_buff *skb, + struct ieee80211_mgd_assoc_data *assoc_data); + int fils_decrypt_assoc_resp(struct ieee80211_sub_if_data *sdata, +--- a/net/mac80211/fils_aead.c ++++ b/net/mac80211/fils_aead.c +@@ -1,4 +1,4 @@ +-#if LINUX_VERSION_IS_GEQ(4,3,0) ++#if 0 /* LINUX_VERSION_IS_GEQ(4,3,0) */ + /* + * FILS AEAD for (Re)Association Request/Response frames + * Copyright 2016, Qualcomm Atheros, Inc. +--- a/net/mac80211/main.c ++++ b/net/mac80211/main.c +@@ -550,7 +550,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_ + NL80211_FEATURE_MAC_ON_CREATE | + NL80211_FEATURE_USERSPACE_MPM | + NL80211_FEATURE_FULL_AP_CLIENT_STATE; +-#if LINUX_VERSION_IS_GEQ(4,3,0) ++#if 0 /* LINUX_VERSION_IS_GEQ(4,3,0) */ + wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_FILS_STA); + #endif + diff --git a/package/kernel/mac80211/patches/130-mac80211-hwsim-hrtimer-clock.patch b/package/kernel/mac80211/patches/130-mac80211-hwsim-hrtimer-clock.patch deleted file mode 100644 index 828ed83cb7..0000000000 --- a/package/kernel/mac80211/patches/130-mac80211-hwsim-hrtimer-clock.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/drivers/net/wireless/mac80211_hwsim.c -+++ b/drivers/net/wireless/mac80211_hwsim.c -@@ -2678,7 +2678,7 @@ static int mac80211_hwsim_new_radio(stru - - tasklet_hrtimer_init(&data->beacon_timer, - mac80211_hwsim_beacon, -- CLOCK_MONOTONIC_RAW, HRTIMER_MODE_ABS); -+ CLOCK_MONOTONIC, HRTIMER_MODE_ABS); - - spin_lock_bh(&hwsim_radio_lock); - list_add_tail(&data->list, &hwsim_radios); diff --git a/package/kernel/mac80211/patches/131-Revert-mac80211-aes-cmac-switch-to-shash-CMAC-driver.patch b/package/kernel/mac80211/patches/131-Revert-mac80211-aes-cmac-switch-to-shash-CMAC-driver.patch new file mode 100644 index 0000000000..f2bee9b05c --- /dev/null +++ b/package/kernel/mac80211/patches/131-Revert-mac80211-aes-cmac-switch-to-shash-CMAC-driver.patch @@ -0,0 +1,198 @@ +From: Felix Fietkau +Date: Sat, 7 Oct 2017 09:37:28 +0200 +Subject: [PATCH] Revert "mac80211: aes-cmac: switch to shash CMAC + driver" + +This reverts commit 26717828b75dd5c46e97f7f4a9b937d038bb2852. +Reduces mac80211 dependencies for LEDE + +Signed-off-by: Felix Fietkau +--- + +--- a/net/mac80211/aes_cmac.c ++++ b/net/mac80211/aes_cmac.c +@@ -22,50 +22,126 @@ + #define CMAC_TLEN_256 16 /* CMAC TLen = 128 bits (16 octets) */ + #define AAD_LEN 20 + +-static const u8 zero[CMAC_TLEN_256]; + +-void ieee80211_aes_cmac(struct crypto_shash *tfm, const u8 *aad, +- const u8 *data, size_t data_len, u8 *mic) ++void gf_mulx(u8 *pad) + { +- SHASH_DESC_ON_STACK(desc, tfm); +- u8 out[AES_BLOCK_SIZE]; ++ int i, carry; + +- desc->tfm = tfm; ++ carry = pad[0] & 0x80; ++ for (i = 0; i < AES_BLOCK_SIZE - 1; i++) ++ pad[i] = (pad[i] << 1) | (pad[i + 1] >> 7); ++ pad[AES_BLOCK_SIZE - 1] <<= 1; ++ if (carry) ++ pad[AES_BLOCK_SIZE - 1] ^= 0x87; ++} + +- crypto_shash_init(desc); +- crypto_shash_update(desc, aad, AAD_LEN); +- crypto_shash_update(desc, data, data_len - CMAC_TLEN); +- crypto_shash_finup(desc, zero, CMAC_TLEN, out); ++void aes_cmac_vector(struct crypto_cipher *tfm, size_t num_elem, ++ const u8 *addr[], const size_t *len, u8 *mac, ++ size_t mac_len) ++{ ++ u8 cbc[AES_BLOCK_SIZE], pad[AES_BLOCK_SIZE]; ++ const u8 *pos, *end; ++ size_t i, e, left, total_len; + +- memcpy(mic, out, CMAC_TLEN); ++ memset(cbc, 0, AES_BLOCK_SIZE); ++ ++ total_len = 0; ++ for (e = 0; e < num_elem; e++) ++ total_len += len[e]; ++ left = total_len; ++ ++ e = 0; ++ pos = addr[0]; ++ end = pos + len[0]; ++ ++ while (left >= AES_BLOCK_SIZE) { ++ for (i = 0; i < AES_BLOCK_SIZE; i++) { ++ cbc[i] ^= *pos++; ++ if (pos >= end) { ++ e++; ++ pos = addr[e]; ++ end = pos + len[e]; ++ } ++ } ++ if (left > AES_BLOCK_SIZE) ++ crypto_cipher_encrypt_one(tfm, cbc, cbc); ++ left -= AES_BLOCK_SIZE; ++ } ++ ++ memset(pad, 0, AES_BLOCK_SIZE); ++ crypto_cipher_encrypt_one(tfm, pad, pad); ++ gf_mulx(pad); ++ ++ if (left || total_len == 0) { ++ for (i = 0; i < left; i++) { ++ cbc[i] ^= *pos++; ++ if (pos >= end) { ++ e++; ++ pos = addr[e]; ++ end = pos + len[e]; ++ } ++ } ++ cbc[left] ^= 0x80; ++ gf_mulx(pad); ++ } ++ ++ for (i = 0; i < AES_BLOCK_SIZE; i++) ++ pad[i] ^= cbc[i]; ++ crypto_cipher_encrypt_one(tfm, pad, pad); ++ memcpy(mac, pad, mac_len); + } + +-void ieee80211_aes_cmac_256(struct crypto_shash *tfm, const u8 *aad, ++ ++void ieee80211_aes_cmac(struct crypto_cipher *tfm, const u8 *aad, ++ const u8 *data, size_t data_len, u8 *mic) ++{ ++ const u8 *addr[3]; ++ size_t len[3]; ++ u8 zero[CMAC_TLEN]; ++ ++ memset(zero, 0, CMAC_TLEN); ++ addr[0] = aad; ++ len[0] = AAD_LEN; ++ addr[1] = data; ++ len[1] = data_len - CMAC_TLEN; ++ addr[2] = zero; ++ len[2] = CMAC_TLEN; ++ ++ aes_cmac_vector(tfm, 3, addr, len, mic, CMAC_TLEN); ++} ++ ++void ieee80211_aes_cmac_256(struct crypto_cipher *tfm, const u8 *aad, + const u8 *data, size_t data_len, u8 *mic) + { +- SHASH_DESC_ON_STACK(desc, tfm); ++ const u8 *addr[3]; ++ size_t len[3]; ++ u8 zero[CMAC_TLEN_256]; + +- desc->tfm = tfm; ++ memset(zero, 0, CMAC_TLEN_256); ++ addr[0] = aad; ++ len[0] = AAD_LEN; ++ addr[1] = data; ++ len[1] = data_len - CMAC_TLEN_256; ++ addr[2] = zero; ++ len[2] = CMAC_TLEN_256; + +- crypto_shash_init(desc); +- crypto_shash_update(desc, aad, AAD_LEN); +- crypto_shash_update(desc, data, data_len - CMAC_TLEN_256); +- crypto_shash_finup(desc, zero, CMAC_TLEN_256, mic); ++ aes_cmac_vector(tfm, 3, addr, len, mic, CMAC_TLEN_256); + } + +-struct crypto_shash *ieee80211_aes_cmac_key_setup(const u8 key[], +- size_t key_len) ++struct crypto_cipher *ieee80211_aes_cmac_key_setup(const u8 key[], ++ size_t key_len) + { +- struct crypto_shash *tfm; ++ struct crypto_cipher *tfm; + +- tfm = crypto_alloc_shash("cmac(aes)", 0, 0); ++ tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC); + if (!IS_ERR(tfm)) +- crypto_shash_setkey(tfm, key, key_len); ++ crypto_cipher_setkey(tfm, key, key_len); + + return tfm; + } + +-void ieee80211_aes_cmac_key_free(struct crypto_shash *tfm) ++ ++void ieee80211_aes_cmac_key_free(struct crypto_cipher *tfm) + { +- crypto_free_shash(tfm); ++ crypto_free_cipher(tfm); + } +--- a/net/mac80211/aes_cmac.h ++++ b/net/mac80211/aes_cmac.h +@@ -10,14 +10,13 @@ + #define AES_CMAC_H + + #include +-#include + +-struct crypto_shash *ieee80211_aes_cmac_key_setup(const u8 key[], +- size_t key_len); +-void ieee80211_aes_cmac(struct crypto_shash *tfm, const u8 *aad, ++struct crypto_cipher *ieee80211_aes_cmac_key_setup(const u8 key[], ++ size_t key_len); ++void ieee80211_aes_cmac(struct crypto_cipher *tfm, const u8 *aad, + const u8 *data, size_t data_len, u8 *mic); +-void ieee80211_aes_cmac_256(struct crypto_shash *tfm, const u8 *aad, ++void ieee80211_aes_cmac_256(struct crypto_cipher *tfm, const u8 *aad, + const u8 *data, size_t data_len, u8 *mic); +-void ieee80211_aes_cmac_key_free(struct crypto_shash *tfm); ++void ieee80211_aes_cmac_key_free(struct crypto_cipher *tfm); + + #endif /* AES_CMAC_H */ +--- a/net/mac80211/key.h ++++ b/net/mac80211/key.h +@@ -93,7 +93,7 @@ struct ieee80211_key { + } ccmp; + struct { + u8 rx_pn[IEEE80211_CMAC_PN_LEN]; +- struct crypto_shash *tfm; ++ struct crypto_cipher *tfm; + u32 replays; /* dot11RSNAStatsCMACReplays */ + u32 icverrors; /* dot11RSNAStatsCMACICVErrors */ + } aes_cmac; diff --git a/package/kernel/mac80211/patches/132-mac80211-remove-cmac-dependency.patch b/package/kernel/mac80211/patches/132-mac80211-remove-cmac-dependency.patch new file mode 100644 index 0000000000..9d185e61e7 --- /dev/null +++ b/package/kernel/mac80211/patches/132-mac80211-remove-cmac-dependency.patch @@ -0,0 +1,10 @@ +--- a/net/mac80211/Kconfig ++++ b/net/mac80211/Kconfig +@@ -5,7 +5,6 @@ config MAC80211 + depends on CRYPTO + depends on CRYPTO_ARC4 + depends on CRYPTO_AES +- depends on CRYPTO_CMAC + depends on CRC32 + ---help--- + This option enables the hardware independent IEEE 802.11 diff --git a/package/kernel/mac80211/patches/150-disable_addr_notifier.patch b/package/kernel/mac80211/patches/150-disable_addr_notifier.patch index ca1e53f8df..42a692a1fc 100644 --- a/package/kernel/mac80211/patches/150-disable_addr_notifier.patch +++ b/package/kernel/mac80211/patches/150-disable_addr_notifier.patch @@ -1,6 +1,6 @@ --- a/net/mac80211/main.c +++ b/net/mac80211/main.c -@@ -291,7 +291,7 @@ void ieee80211_restart_hw(struct ieee802 +@@ -292,7 +292,7 @@ void ieee80211_restart_hw(struct ieee802 } EXPORT_SYMBOL(ieee80211_restart_hw); @@ -9,7 +9,7 @@ static int ieee80211_ifa_changed(struct notifier_block *nb, unsigned long data, void *arg) { -@@ -350,7 +350,7 @@ static int ieee80211_ifa_changed(struct +@@ -351,7 +351,7 @@ static int ieee80211_ifa_changed(struct } #endif @@ -18,7 +18,7 @@ static int ieee80211_ifa6_changed(struct notifier_block *nb, unsigned long data, void *arg) { -@@ -1111,14 +1111,14 @@ int ieee80211_register_hw(struct ieee802 +@@ -1115,14 +1115,14 @@ int ieee80211_register_hw(struct ieee802 if (result) goto fail_flows; @@ -35,7 +35,7 @@ local->ifa6_notifier.notifier_call = ieee80211_ifa6_changed; result = register_inet6addr_notifier(&local->ifa6_notifier); if (result) -@@ -1127,13 +1127,13 @@ int ieee80211_register_hw(struct ieee802 +@@ -1131,13 +1131,13 @@ int ieee80211_register_hw(struct ieee802 return 0; @@ -52,7 +52,7 @@ fail_ifa: #endif ieee80211_txq_teardown_flows(local); -@@ -1163,10 +1163,10 @@ void ieee80211_unregister_hw(struct ieee +@@ -1167,10 +1167,10 @@ void ieee80211_unregister_hw(struct ieee tasklet_kill(&local->tx_pending_tasklet); tasklet_kill(&local->tasklet); diff --git a/package/kernel/mac80211/patches/210-ap_scan.patch b/package/kernel/mac80211/patches/210-ap_scan.patch index 3b613bba0e..e9999e32b9 100644 --- a/package/kernel/mac80211/patches/210-ap_scan.patch +++ b/package/kernel/mac80211/patches/210-ap_scan.patch @@ -1,6 +1,6 @@ --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c -@@ -2165,7 +2165,7 @@ static int ieee80211_scan(struct wiphy * +@@ -2212,7 +2212,7 @@ static int ieee80211_scan(struct wiphy * * the frames sent while scanning on other channel will be * lost) */ diff --git a/package/kernel/mac80211/patches/301-ath9k_hw-issue-external-reset-for-QCA955x.patch b/package/kernel/mac80211/patches/301-ath9k_hw-issue-external-reset-for-QCA955x.patch index 5eb69b898d..34d7d3b1cf 100644 --- a/package/kernel/mac80211/patches/301-ath9k_hw-issue-external-reset-for-QCA955x.patch +++ b/package/kernel/mac80211/patches/301-ath9k_hw-issue-external-reset-for-QCA955x.patch @@ -29,21 +29,6 @@ Signed-off-by: Felix Fietkau - npend = ath9k_hw_numtxpending(ah, i); - if (npend) - break; -- } -- -- if (ah->external_reset && -- (npend || type == ATH9K_RESET_COLD)) { -- int reset_err = 0; -- -- ath_dbg(ath9k_hw_common(ah), RESET, -- "reset MAC via external reset\n"); -- -- reset_err = ah->external_reset(); -- if (reset_err) { -- ath_err(ath9k_hw_common(ah), -- "External reset failed, err=%d\n", -- reset_err); -- return false; + if (type == ATH9K_RESET_COLD) + return true; + @@ -59,35 +44,47 @@ Signed-off-by: Felix Fietkau + for (i = 0; i < AR_NUM_QCU; i++) { + if (ath9k_hw_numtxpending(ah, i)) + return true; - } -+ } -+ ++ } + } + +- if (ah->external_reset && +- (npend || type == ATH9K_RESET_COLD)) { +- int reset_err = 0; + return false; +} -+ + +- ath_dbg(ath9k_hw_common(ah), RESET, +- "reset MAC via external reset\n"); +static bool ath9k_hw_external_reset(struct ath_hw *ah, int type) +{ + int err; -+ + +- reset_err = ah->external_reset(); +- if (reset_err) { +- ath_err(ath9k_hw_common(ah), +- "External reset failed, err=%d\n", +- reset_err); +- return false; +- } + if (!ah->external_reset || !ath9k_hw_need_external_reset(ah, type)) + return true; -+ -+ ath_dbg(ath9k_hw_common(ah), RESET, -+ "reset MAC via external reset\n"); - REG_WRITE(ah, AR_RTC_RESET, 1); ++ ath_dbg(ath9k_hw_common(ah), RESET, ++ "reset MAC via external reset\n"); ++ + err = ah->external_reset(); + if (err) { + ath_err(ath9k_hw_common(ah), + "External reset failed, err=%d\n", err); + return false; - } - ++ } ++ + if (AR_SREV_9550(ah)) { + REG_WRITE(ah, AR_RTC_RESET, 0); + udelay(10); -+ } -+ + } + + REG_WRITE(ah, AR_RTC_RESET, 1); + udelay(10); + diff --git a/package/kernel/mac80211/patches/304-ath9k-force-rx_clear-when-disabling-rx.patch b/package/kernel/mac80211/patches/304-ath9k-force-rx_clear-when-disabling-rx.patch index eb6862db6d..8aaccf49b4 100644 --- a/package/kernel/mac80211/patches/304-ath9k-force-rx_clear-when-disabling-rx.patch +++ b/package/kernel/mac80211/patches/304-ath9k-force-rx_clear-when-disabling-rx.patch @@ -12,7 +12,7 @@ Signed-off-by: Helmut Schaa --- a/drivers/net/wireless/ath/ath9k/mac.c +++ b/drivers/net/wireless/ath/ath9k/mac.c -@@ -677,13 +677,18 @@ void ath9k_hw_startpcureceive(struct ath +@@ -678,13 +678,18 @@ void ath9k_hw_startpcureceive(struct ath ath9k_ani_reset(ah, is_scanning); diff --git a/package/kernel/mac80211/patches/305-ath9k-limit-retries-for-powersave-response-frames.patch b/package/kernel/mac80211/patches/305-ath9k-limit-retries-for-powersave-response-frames.patch index 5923594be3..31825b819c 100644 --- a/package/kernel/mac80211/patches/305-ath9k-limit-retries-for-powersave-response-frames.patch +++ b/package/kernel/mac80211/patches/305-ath9k-limit-retries-for-powersave-response-frames.patch @@ -40,7 +40,7 @@ Signed-off-by: Felix Fietkau } static void ath_txq_skb_done(struct ath_softc *sc, struct ath_txq *txq, -@@ -1522,7 +1537,7 @@ ath_tx_form_burst(struct ath_softc *sc, +@@ -1502,7 +1517,7 @@ ath_tx_form_burst(struct ath_softc *sc, break; } @@ -49,7 +49,7 @@ Signed-off-by: Felix Fietkau } while (1); } -@@ -1552,7 +1567,7 @@ static bool ath_tx_sched_aggr(struct ath +@@ -1532,7 +1547,7 @@ static bool ath_tx_sched_aggr(struct ath return false; } @@ -58,7 +58,7 @@ Signed-off-by: Felix Fietkau if (aggr) aggr_len = ath_tx_form_aggr(sc, txq, tid, &bf_q, bf); else -@@ -1710,7 +1725,7 @@ void ath9k_release_buffered_frames(struc +@@ -1690,7 +1705,7 @@ void ath9k_release_buffered_frames(struc break; list_add_tail(&bf->list, &bf_q); @@ -67,7 +67,7 @@ Signed-off-by: Felix Fietkau if (bf_isampdu(bf)) { ath_tx_addto_baw(sc, tid, bf); bf->bf_state.bf_type &= ~BUF_AGGR; -@@ -2410,7 +2425,7 @@ int ath_tx_start(struct ieee80211_hw *hw +@@ -2390,7 +2405,7 @@ int ath_tx_start(struct ieee80211_hw *hw if (txctl->paprd) bf->bf_state.bfs_paprd_timestamp = jiffies; @@ -76,7 +76,7 @@ Signed-off-by: Felix Fietkau ath_tx_send_normal(sc, txq, tid, skb); out: -@@ -2449,7 +2464,7 @@ void ath_tx_cabq(struct ieee80211_hw *hw +@@ -2429,7 +2444,7 @@ void ath_tx_cabq(struct ieee80211_hw *hw break; bf->bf_lastbf = bf; @@ -85,7 +85,7 @@ Signed-off-by: Felix Fietkau ath_buf_set_rate(sc, bf, &info, fi->framelen, false); duration += info.rates[0].PktDuration; if (bf_tail) -@@ -2968,7 +2983,7 @@ int ath9k_tx99_send(struct ath_softc *sc +@@ -2946,7 +2961,7 @@ int ath9k_tx99_send(struct ath_softc *sc return -EINVAL; } diff --git a/package/kernel/mac80211/patches/306-Revert-ath9k-interpret-requested-txpower-in-EIRP-dom.patch b/package/kernel/mac80211/patches/306-Revert-ath9k-interpret-requested-txpower-in-EIRP-dom.patch index 956ab83903..35d07430eb 100644 --- a/package/kernel/mac80211/patches/306-Revert-ath9k-interpret-requested-txpower-in-EIRP-dom.patch +++ b/package/kernel/mac80211/patches/306-Revert-ath9k-interpret-requested-txpower-in-EIRP-dom.patch @@ -8,7 +8,7 @@ This reverts commit 71f5137bf010c6faffab50c0ec15374c59c4a411. --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c -@@ -2931,7 +2931,8 @@ void ath9k_hw_apply_txpower(struct ath_h +@@ -2935,7 +2935,8 @@ void ath9k_hw_apply_txpower(struct ath_h { struct ath_regulatory *reg = ath9k_hw_regulatory(ah); struct ieee80211_channel *channel; @@ -18,7 +18,7 @@ This reverts commit 71f5137bf010c6faffab50c0ec15374c59c4a411. if (!chan) return; -@@ -2939,10 +2940,15 @@ void ath9k_hw_apply_txpower(struct ath_h +@@ -2943,10 +2944,15 @@ void ath9k_hw_apply_txpower(struct ath_h channel = chan->chan; chan_pwr = min_t(int, channel->max_power * 2, MAX_RATE_POWER); new_pwr = min_t(int, chan_pwr, reg->power_limit); diff --git a/package/kernel/mac80211/patches/307-mac80211-add-hdrlen-to-ieee80211_tx_data.patch b/package/kernel/mac80211/patches/307-mac80211-add-hdrlen-to-ieee80211_tx_data.patch index 1a6fd8471c..baaca173c7 100644 --- a/package/kernel/mac80211/patches/307-mac80211-add-hdrlen-to-ieee80211_tx_data.patch +++ b/package/kernel/mac80211/patches/307-mac80211-add-hdrlen-to-ieee80211_tx_data.patch @@ -21,7 +21,7 @@ Signed-off-by: Janusz Dziedzic --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c -@@ -925,7 +925,7 @@ ieee80211_tx_h_fragment(struct ieee80211 +@@ -921,7 +921,7 @@ ieee80211_tx_h_fragment(struct ieee80211 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); struct ieee80211_hdr *hdr = (void *)skb->data; int frag_threshold = tx->local->hw.wiphy->frag_threshold; @@ -30,7 +30,7 @@ Signed-off-by: Janusz Dziedzic int fragnum; /* no matter what happens, tx->skb moves to tx->skbs */ -@@ -946,8 +946,6 @@ ieee80211_tx_h_fragment(struct ieee80211 +@@ -942,8 +942,6 @@ ieee80211_tx_h_fragment(struct ieee80211 if (WARN_ON(info->flags & IEEE80211_TX_CTL_AMPDU)) return TX_DROP; @@ -39,7 +39,7 @@ Signed-off-by: Janusz Dziedzic /* internal error, why isn't DONTFRAG set? */ if (WARN_ON(skb->len + FCS_LEN <= frag_threshold)) return TX_DROP; -@@ -1179,6 +1177,8 @@ ieee80211_tx_prepare(struct ieee80211_su +@@ -1175,6 +1173,8 @@ ieee80211_tx_prepare(struct ieee80211_su hdr = (struct ieee80211_hdr *) skb->data; @@ -48,7 +48,7 @@ Signed-off-by: Janusz Dziedzic if (likely(sta)) { if (!IS_ERR(sta)) tx->sta = sta; -@@ -3437,6 +3437,7 @@ begin: +@@ -3434,6 +3434,7 @@ begin: tx.local = local; tx.skb = skb; tx.sdata = vif_to_sdata(info->control.vif); @@ -56,7 +56,7 @@ Signed-off-by: Janusz Dziedzic if (txq->sta) tx.sta = container_of(txq->sta, struct sta_info, sta); -@@ -3731,6 +3732,7 @@ ieee80211_build_data_template(struct iee +@@ -3756,6 +3757,7 @@ ieee80211_build_data_template(struct iee hdr = (void *)skb->data; tx.sta = sta_info_get(sdata, hdr->addr1); tx.skb = skb; @@ -66,7 +66,7 @@ Signed-off-by: Janusz Dziedzic rcu_read_unlock(); --- a/net/mac80211/util.c +++ b/net/mac80211/util.c -@@ -1227,6 +1227,7 @@ void ieee80211_send_auth(struct ieee8021 +@@ -1232,6 +1232,7 @@ void ieee80211_send_auth(struct ieee8021 struct ieee80211_local *local = sdata->local; struct sk_buff *skb; struct ieee80211_mgmt *mgmt; @@ -74,8 +74,8 @@ Signed-off-by: Janusz Dziedzic int err; /* 24 + 6 = header + auth_algo + auth_transaction + status_code */ -@@ -1251,8 +1252,10 @@ void ieee80211_send_auth(struct ieee8021 - memcpy(skb_put(skb, extra_len), extra, extra_len); +@@ -1255,8 +1256,10 @@ void ieee80211_send_auth(struct ieee8021 + skb_put_data(skb, extra, extra_len); if (auth_alg == WLAN_AUTH_SHARED_KEY && transaction == 3) { + hdrlen = ieee80211_hdrlen(mgmt->frame_control); @@ -155,7 +155,7 @@ Signed-off-by: Janusz Dziedzic size_t klen, u8 *data, size_t data_len); --- a/net/mac80211/wpa.c +++ b/net/mac80211/wpa.c -@@ -43,7 +43,7 @@ ieee80211_tx_h_michael_mic_add(struct ie +@@ -44,7 +44,7 @@ ieee80211_tx_h_michael_mic_add(struct ie skb->len < 24 || !ieee80211_is_data_present(hdr->frame_control)) return TX_CONTINUE; @@ -164,7 +164,7 @@ Signed-off-by: Janusz Dziedzic if (skb->len < hdrlen) return TX_DROP; -@@ -186,7 +186,6 @@ mic_fail_no_key: +@@ -187,7 +187,6 @@ mic_fail_no_key: static int tkip_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb) { @@ -172,7 +172,7 @@ Signed-off-by: Janusz Dziedzic struct ieee80211_key *key = tx->key; struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); unsigned int hdrlen; -@@ -201,7 +200,7 @@ static int tkip_encrypt_skb(struct ieee8 +@@ -202,7 +201,7 @@ static int tkip_encrypt_skb(struct ieee8 return 0; } @@ -181,7 +181,7 @@ Signed-off-by: Janusz Dziedzic len = skb->len - hdrlen; if (info->control.hw_key) -@@ -419,7 +418,7 @@ static int ccmp_encrypt_skb(struct ieee8 +@@ -420,7 +419,7 @@ static int ccmp_encrypt_skb(struct ieee8 return 0; } @@ -190,7 +190,7 @@ Signed-off-by: Janusz Dziedzic len = skb->len - hdrlen; if (info->control.hw_key) -@@ -652,7 +651,7 @@ static int gcmp_encrypt_skb(struct ieee8 +@@ -653,7 +652,7 @@ static int gcmp_encrypt_skb(struct ieee8 return 0; } @@ -199,7 +199,7 @@ Signed-off-by: Janusz Dziedzic len = skb->len - hdrlen; if (info->control.hw_key) -@@ -792,7 +791,6 @@ static ieee80211_tx_result +@@ -793,7 +792,6 @@ static ieee80211_tx_result ieee80211_crypto_cs_encrypt(struct ieee80211_tx_data *tx, struct sk_buff *skb) { @@ -207,7 +207,7 @@ Signed-off-by: Janusz Dziedzic struct ieee80211_key *key = tx->key; struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); int hdrlen; -@@ -808,8 +806,7 @@ ieee80211_crypto_cs_encrypt(struct ieee8 +@@ -809,8 +807,7 @@ ieee80211_crypto_cs_encrypt(struct ieee8 pskb_expand_head(skb, iv_len, 0, GFP_ATOMIC))) return TX_DROP; diff --git a/package/kernel/mac80211/patches/308-mac80211-add-NEED_ALIGNED4_SKBS-hw-flag.patch b/package/kernel/mac80211/patches/308-mac80211-add-NEED_ALIGNED4_SKBS-hw-flag.patch index 43455773f1..762458ba78 100644 --- a/package/kernel/mac80211/patches/308-mac80211-add-NEED_ALIGNED4_SKBS-hw-flag.patch +++ b/package/kernel/mac80211/patches/308-mac80211-add-NEED_ALIGNED4_SKBS-hw-flag.patch @@ -23,7 +23,7 @@ Signed-off-by: Janusz Dziedzic --- a/include/net/mac80211.h +++ b/include/net/mac80211.h -@@ -2043,6 +2043,9 @@ struct ieee80211_txq { +@@ -2056,6 +2056,9 @@ struct ieee80211_txq { * The stack will not do fragmentation. * The callback for @set_frag_threshold should be set as well. * @@ -33,7 +33,7 @@ Signed-off-by: Janusz Dziedzic * @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays */ enum ieee80211_hw_flags { -@@ -2085,6 +2088,7 @@ enum ieee80211_hw_flags { +@@ -2098,6 +2101,7 @@ enum ieee80211_hw_flags { IEEE80211_HW_TX_FRAG_LIST, IEEE80211_HW_REPORTS_LOW_ACK, IEEE80211_HW_SUPPORTS_TX_FRAG, @@ -53,7 +53,7 @@ Signed-off-by: Janusz Dziedzic --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h -@@ -1553,6 +1553,29 @@ ieee80211_vif_get_num_mcast_if(struct ie +@@ -1547,6 +1547,29 @@ ieee80211_vif_get_num_mcast_if(struct ie return -1; } @@ -85,7 +85,7 @@ Signed-off-by: Janusz Dziedzic unsigned int mpdu_len, --- a/net/mac80211/sta_info.h +++ b/net/mac80211/sta_info.h -@@ -282,7 +282,7 @@ struct ieee80211_fast_tx { +@@ -290,7 +290,7 @@ struct ieee80211_fast_tx { u8 hdr_len; u8 sa_offs, da_offs, pn_offs; u8 band; @@ -96,7 +96,7 @@ Signed-off-by: Janusz Dziedzic struct rcu_head rcu_head; --- a/net/mac80211/status.c +++ b/net/mac80211/status.c -@@ -693,9 +693,22 @@ void ieee80211_tx_monitor(struct ieee802 +@@ -642,9 +642,22 @@ void ieee80211_tx_monitor(struct ieee802 struct sk_buff *skb2; struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); struct ieee80211_sub_if_data *sdata; @@ -137,7 +137,7 @@ Signed-off-by: Janusz Dziedzic --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c -@@ -1176,8 +1176,7 @@ ieee80211_tx_prepare(struct ieee80211_su +@@ -1172,8 +1172,7 @@ ieee80211_tx_prepare(struct ieee80211_su info->flags &= ~IEEE80211_TX_INTFL_NEED_TXPROCESSING; hdr = (struct ieee80211_hdr *) skb->data; @@ -147,7 +147,7 @@ Signed-off-by: Janusz Dziedzic if (likely(sta)) { if (!IS_ERR(sta)) -@@ -2152,7 +2151,7 @@ netdev_tx_t ieee80211_monitor_start_xmit +@@ -2150,7 +2149,7 @@ netdev_tx_t ieee80211_monitor_start_xmit goto fail; hdr = (struct ieee80211_hdr *)(skb->data + len_rthdr); @@ -156,7 +156,7 @@ Signed-off-by: Janusz Dziedzic if (skb->len < len_rthdr + hdrlen) goto fail; -@@ -2370,7 +2369,7 @@ static struct sk_buff *ieee80211_build_h +@@ -2368,7 +2367,7 @@ static struct sk_buff *ieee80211_build_h struct ieee80211_chanctx_conf *chanctx_conf; struct ieee80211_sub_if_data *ap_sdata; enum nl80211_band band; @@ -165,7 +165,7 @@ Signed-off-by: Janusz Dziedzic if (IS_ERR(sta)) sta = NULL; -@@ -2590,6 +2589,9 @@ static struct sk_buff *ieee80211_build_h +@@ -2588,6 +2587,9 @@ static struct sk_buff *ieee80211_build_h hdrlen += 2; } @@ -175,7 +175,7 @@ Signed-off-by: Janusz Dziedzic /* * Drop unicast frames to unauthorised stations unless they are * EAPOL frames from the local station. -@@ -2670,6 +2672,7 @@ static struct sk_buff *ieee80211_build_h +@@ -2668,6 +2670,7 @@ static struct sk_buff *ieee80211_build_h skb_pull(skb, skip_header_bytes); head_need = hdrlen + encaps_len + meshhdrlen - skb_headroom(skb); @@ -183,7 +183,7 @@ Signed-off-by: Janusz Dziedzic /* * So we need to modify the skb header and hence need a copy of -@@ -2702,6 +2705,9 @@ static struct sk_buff *ieee80211_build_h +@@ -2700,6 +2703,9 @@ static struct sk_buff *ieee80211_build_h memcpy(skb_push(skb, meshhdrlen), &mesh_hdr, meshhdrlen); #endif @@ -193,7 +193,7 @@ Signed-off-by: Janusz Dziedzic if (ieee80211_is_data_qos(fc)) { __le16 *qos_control; -@@ -2877,6 +2883,9 @@ void ieee80211_check_fast_xmit(struct st +@@ -2875,6 +2881,9 @@ void ieee80211_check_fast_xmit(struct st fc |= cpu_to_le16(IEEE80211_STYPE_QOS_DATA); } @@ -203,7 +203,7 @@ Signed-off-by: Janusz Dziedzic /* We store the key here so there's no point in using rcu_dereference() * but that's fine because the code that changes the pointers will call * this function after doing so. For a single CPU that would be enough, -@@ -3464,7 +3473,7 @@ begin: +@@ -3461,7 +3470,7 @@ begin: if (tx.key && (tx.key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) @@ -214,7 +214,7 @@ Signed-off-by: Janusz Dziedzic tx.key, skb); --- a/net/mac80211/util.c +++ b/net/mac80211/util.c -@@ -1225,6 +1225,7 @@ void ieee80211_send_auth(struct ieee8021 +@@ -1230,6 +1230,7 @@ void ieee80211_send_auth(struct ieee8021 u32 tx_flags) { struct ieee80211_local *local = sdata->local; @@ -222,8 +222,8 @@ Signed-off-by: Janusz Dziedzic struct sk_buff *skb; struct ieee80211_mgmt *mgmt; unsigned int hdrlen; -@@ -1252,7 +1253,7 @@ void ieee80211_send_auth(struct ieee8021 - memcpy(skb_put(skb, extra_len), extra, extra_len); +@@ -1256,7 +1257,7 @@ void ieee80211_send_auth(struct ieee8021 + skb_put_data(skb, extra, extra_len); if (auth_alg == WLAN_AUTH_SHARED_KEY && transaction == 3) { - hdrlen = ieee80211_hdrlen(mgmt->frame_control); diff --git a/package/kernel/mac80211/patches/309-mac80211-minstrel-Enable-STBC-and-LDPC-for-VHT-Rates.patch b/package/kernel/mac80211/patches/309-mac80211-minstrel-Enable-STBC-and-LDPC-for-VHT-Rates.patch index a62b1bb28e..609b15b832 100644 --- a/package/kernel/mac80211/patches/309-mac80211-minstrel-Enable-STBC-and-LDPC-for-VHT-Rates.patch +++ b/package/kernel/mac80211/patches/309-mac80211-minstrel-Enable-STBC-and-LDPC-for-VHT-Rates.patch @@ -10,7 +10,7 @@ Signed-off-by: Chaitanya TK --- a/include/linux/ieee80211.h +++ b/include/linux/ieee80211.h -@@ -1553,6 +1553,7 @@ struct ieee80211_vht_operation { +@@ -1556,6 +1556,7 @@ struct ieee80211_vht_operation { #define IEEE80211_VHT_CAP_RXSTBC_3 0x00000300 #define IEEE80211_VHT_CAP_RXSTBC_4 0x00000400 #define IEEE80211_VHT_CAP_RXSTBC_MASK 0x00000700 diff --git a/package/kernel/mac80211/patches/310-ath9k-fix-moredata-bit-in-PS-buffered-frame-release.patch b/package/kernel/mac80211/patches/310-ath9k-fix-moredata-bit-in-PS-buffered-frame-release.patch index b2a74ccbac..c9c74bb836 100644 --- a/package/kernel/mac80211/patches/310-ath9k-fix-moredata-bit-in-PS-buffered-frame-release.patch +++ b/package/kernel/mac80211/patches/310-ath9k-fix-moredata-bit-in-PS-buffered-frame-release.patch @@ -7,7 +7,7 @@ Signed-off-by: Felix Fietkau --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c -@@ -1694,6 +1694,22 @@ void ath_tx_aggr_wakeup(struct ath_softc +@@ -1674,6 +1674,22 @@ void ath_tx_aggr_wakeup(struct ath_softc } } @@ -30,7 +30,7 @@ Signed-off-by: Felix Fietkau void ath9k_release_buffered_frames(struct ieee80211_hw *hw, struct ieee80211_sta *sta, u16 tids, int nframes, -@@ -1724,6 +1740,7 @@ void ath9k_release_buffered_frames(struc +@@ -1704,6 +1720,7 @@ void ath9k_release_buffered_frames(struc if (!bf) break; @@ -38,7 +38,7 @@ Signed-off-by: Felix Fietkau list_add_tail(&bf->list, &bf_q); ath_set_rates(tid->an->vif, tid->an->sta, bf, true); if (bf_isampdu(bf)) { -@@ -1747,6 +1764,9 @@ void ath9k_release_buffered_frames(struc +@@ -1727,6 +1744,9 @@ void ath9k_release_buffered_frames(struc if (list_empty(&bf_q)) return; diff --git a/package/kernel/mac80211/patches/311-ath9k-clear-potentially-stale-EOSP-status-bit-in-int.patch b/package/kernel/mac80211/patches/311-ath9k-clear-potentially-stale-EOSP-status-bit-in-int.patch index 9863dffc90..1893187e8a 100644 --- a/package/kernel/mac80211/patches/311-ath9k-clear-potentially-stale-EOSP-status-bit-in-int.patch +++ b/package/kernel/mac80211/patches/311-ath9k-clear-potentially-stale-EOSP-status-bit-in-int.patch @@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c -@@ -1004,7 +1004,8 @@ ath_tx_get_tid_subframe(struct ath_softc +@@ -984,7 +984,8 @@ ath_tx_get_tid_subframe(struct ath_softc bf->bf_lastbf = bf; tx_info = IEEE80211_SKB_CB(skb); diff --git a/package/kernel/mac80211/patches/313-ath9k-fix-block-ack-window-tracking-issues.patch b/package/kernel/mac80211/patches/313-ath9k-fix-block-ack-window-tracking-issues.patch index fb8df08afe..59de1dfe1a 100644 --- a/package/kernel/mac80211/patches/313-ath9k-fix-block-ack-window-tracking-issues.patch +++ b/package/kernel/mac80211/patches/313-ath9k-fix-block-ack-window-tracking-issues.patch @@ -75,7 +75,7 @@ Signed-off-by: Felix Fietkau ath_tx_complete_buf(sc, bf, txq, &bf_head, NULL, ts, -@@ -1046,11 +1054,14 @@ ath_tx_get_tid_subframe(struct ath_softc +@@ -1026,11 +1034,14 @@ ath_tx_get_tid_subframe(struct ath_softc INIT_LIST_HEAD(&bf_head); list_add(&bf->list, &bf_head); @@ -91,7 +91,7 @@ Signed-off-by: Felix Fietkau return bf; } -@@ -1108,8 +1119,6 @@ ath_tx_form_aggr(struct ath_softc *sc, s +@@ -1088,8 +1099,6 @@ ath_tx_form_aggr(struct ath_softc *sc, s bf->bf_next = NULL; /* link buffers of this frame to the aggregate */ @@ -100,7 +100,7 @@ Signed-off-by: Felix Fietkau bf->bf_state.ndelim = ndelim; list_add_tail(&bf->list, bf_q); -@@ -1745,10 +1754,8 @@ void ath9k_release_buffered_frames(struc +@@ -1725,10 +1734,8 @@ void ath9k_release_buffered_frames(struc ath9k_set_moredata(sc, bf, true); list_add_tail(&bf->list, &bf_q); ath_set_rates(tid->an->vif, tid->an->sta, bf, true); diff --git a/package/kernel/mac80211/patches/314-ath9k-rename-tx_complete_work-to-hw_check_work.patch b/package/kernel/mac80211/patches/314-ath9k-rename-tx_complete_work-to-hw_check_work.patch deleted file mode 100644 index 5465df3ccf..0000000000 --- a/package/kernel/mac80211/patches/314-ath9k-rename-tx_complete_work-to-hw_check_work.patch +++ /dev/null @@ -1,175 +0,0 @@ -From: Felix Fietkau -Date: Wed, 25 Jan 2017 12:57:05 +0100 -Subject: [PATCH] ath9k: rename tx_complete_work to hw_check_work - -Also include common MAC alive check. This should make the hang checks -more reliable for modes where beacons are not sent and is used as a -starting point for further hang check improvements - -Signed-off-by: Felix Fietkau ---- - ---- a/drivers/net/wireless/ath/ath9k/ath9k.h -+++ b/drivers/net/wireless/ath/ath9k/ath9k.h -@@ -108,7 +108,7 @@ int ath_descdma_setup(struct ath_softc * - #define ATH_AGGR_MIN_QDEPTH 2 - /* minimum h/w qdepth for non-aggregated traffic */ - #define ATH_NON_AGGR_MIN_QDEPTH 8 --#define ATH_TX_COMPLETE_POLL_INT 1000 -+#define ATH_HW_CHECK_POLL_INT 1000 - #define ATH_TXFIFO_DEPTH 8 - #define ATH_TX_ERROR 0x01 - -@@ -745,7 +745,7 @@ void ath9k_csa_update(struct ath_softc * - #define ATH_PAPRD_TIMEOUT 100 /* msecs */ - #define ATH_PLL_WORK_INTERVAL 100 - --void ath_tx_complete_poll_work(struct work_struct *work); -+void ath_hw_check_work(struct work_struct *work); - void ath_reset_work(struct work_struct *work); - bool ath_hw_check(struct ath_softc *sc); - void ath_hw_pll_work(struct work_struct *work); -@@ -1053,7 +1053,7 @@ struct ath_softc { - #ifdef CPTCFG_ATH9K_DEBUGFS - struct ath9k_debug debug; - #endif -- struct delayed_work tx_complete_work; -+ struct delayed_work hw_check_work; - struct delayed_work hw_pll_work; - struct timer_list sleep_timer; - ---- a/drivers/net/wireless/ath/ath9k/init.c -+++ b/drivers/net/wireless/ath/ath9k/init.c -@@ -681,6 +681,7 @@ static int ath9k_init_softc(u16 devid, s - INIT_WORK(&sc->hw_reset_work, ath_reset_work); - INIT_WORK(&sc->paprd_work, ath_paprd_calibrate); - INIT_DELAYED_WORK(&sc->hw_pll_work, ath_hw_pll_work); -+ INIT_DELAYED_WORK(&sc->hw_check_work, ath_hw_check_work); - - ath9k_init_channel_context(sc); - ---- a/drivers/net/wireless/ath/ath9k/link.c -+++ b/drivers/net/wireless/ath/ath9k/link.c -@@ -20,20 +20,13 @@ - * TX polling - checks if the TX engine is stuck somewhere - * and issues a chip reset if so. - */ --void ath_tx_complete_poll_work(struct work_struct *work) -+static bool ath_tx_complete_check(struct ath_softc *sc) - { -- struct ath_softc *sc = container_of(work, struct ath_softc, -- tx_complete_work.work); - struct ath_txq *txq; - int i; -- bool needreset = false; -- - -- if (sc->tx99_state) { -- ath_dbg(ath9k_hw_common(sc->sc_ah), RESET, -- "skip tx hung detection on tx99\n"); -- return; -- } -+ if (sc->tx99_state) -+ return true; - - for (i = 0; i < IEEE80211_NUM_ACS; i++) { - txq = sc->tx.txq_map[i]; -@@ -41,25 +34,36 @@ void ath_tx_complete_poll_work(struct wo - ath_txq_lock(sc, txq); - if (txq->axq_depth) { - if (txq->axq_tx_inprogress) { -- needreset = true; - ath_txq_unlock(sc, txq); -- break; -- } else { -- txq->axq_tx_inprogress = true; -+ goto reset; - } -+ -+ txq->axq_tx_inprogress = true; - } - ath_txq_unlock(sc, txq); - } - -- if (needreset) { -- ath_dbg(ath9k_hw_common(sc->sc_ah), RESET, -- "tx hung, resetting the chip\n"); -- ath9k_queue_reset(sc, RESET_TYPE_TX_HANG); -+ return true; -+ -+reset: -+ ath_dbg(ath9k_hw_common(sc->sc_ah), RESET, -+ "tx hung, resetting the chip\n"); -+ ath9k_queue_reset(sc, RESET_TYPE_TX_HANG); -+ return false; -+ -+} -+ -+void ath_hw_check_work(struct work_struct *work) -+{ -+ struct ath_softc *sc = container_of(work, struct ath_softc, -+ hw_check_work.work); -+ -+ if (!ath_hw_check(sc) || -+ !ath_tx_complete_check(sc)) - return; -- } - -- ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, -- msecs_to_jiffies(ATH_TX_COMPLETE_POLL_INT)); -+ ieee80211_queue_delayed_work(sc->hw, &sc->hw_check_work, -+ msecs_to_jiffies(ATH_HW_CHECK_POLL_INT)); - } - - /* ---- a/drivers/net/wireless/ath/ath9k/main.c -+++ b/drivers/net/wireless/ath/ath9k/main.c -@@ -181,7 +181,7 @@ void ath9k_ps_restore(struct ath_softc * - static void __ath_cancel_work(struct ath_softc *sc) - { - cancel_work_sync(&sc->paprd_work); -- cancel_delayed_work_sync(&sc->tx_complete_work); -+ cancel_delayed_work_sync(&sc->hw_check_work); - cancel_delayed_work_sync(&sc->hw_pll_work); - - #ifdef CPTCFG_ATH9K_BTCOEX_SUPPORT -@@ -198,7 +198,8 @@ void ath_cancel_work(struct ath_softc *s - - void ath_restart_work(struct ath_softc *sc) - { -- ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, 0); -+ ieee80211_queue_delayed_work(sc->hw, &sc->hw_check_work, -+ ATH_HW_CHECK_POLL_INT); - - if (AR_SREV_9340(sc->sc_ah) || AR_SREV_9330(sc->sc_ah)) - ieee80211_queue_delayed_work(sc->hw, &sc->hw_pll_work, -@@ -2091,7 +2092,7 @@ void __ath9k_flush(struct ieee80211_hw * - int timeout; - bool drain_txq; - -- cancel_delayed_work_sync(&sc->tx_complete_work); -+ cancel_delayed_work_sync(&sc->hw_check_work); - - if (ah->ah_flags & AH_UNPLUGGED) { - ath_dbg(common, ANY, "Device has been unplugged!\n"); -@@ -2129,7 +2130,8 @@ void __ath9k_flush(struct ieee80211_hw * - ath9k_ps_restore(sc); - } - -- ieee80211_queue_delayed_work(hw, &sc->tx_complete_work, 0); -+ ieee80211_queue_delayed_work(hw, &sc->hw_check_work, -+ ATH_HW_CHECK_POLL_INT); - } - - static bool ath9k_tx_frames_pending(struct ieee80211_hw *hw) ---- a/drivers/net/wireless/ath/ath9k/xmit.c -+++ b/drivers/net/wireless/ath/ath9k/xmit.c -@@ -2916,8 +2916,6 @@ int ath_tx_init(struct ath_softc *sc, in - return error; - } - -- INIT_DELAYED_WORK(&sc->tx_complete_work, ath_tx_complete_poll_work); -- - if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) - error = ath_tx_edma_init(sc); - diff --git a/package/kernel/mac80211/patches/324-ath9k_hw-fix-channel-maximum-power-level-test.patch b/package/kernel/mac80211/patches/314-ath9k_hw-fix-channel-maximum-power-level-test.patch similarity index 100% rename from package/kernel/mac80211/patches/324-ath9k_hw-fix-channel-maximum-power-level-test.patch rename to package/kernel/mac80211/patches/314-ath9k_hw-fix-channel-maximum-power-level-test.patch diff --git a/package/kernel/mac80211/patches/315-ath9k-adjust-tx-power-reduction-for-US-regulatory-do.patch b/package/kernel/mac80211/patches/315-ath9k-adjust-tx-power-reduction-for-US-regulatory-do.patch new file mode 100644 index 0000000000..78083517bc --- /dev/null +++ b/package/kernel/mac80211/patches/315-ath9k-adjust-tx-power-reduction-for-US-regulatory-do.patch @@ -0,0 +1,24 @@ +From: Felix Fietkau +Date: Wed, 19 Jul 2017 08:49:31 +0200 +Subject: [PATCH] ath9k: adjust tx power reduction for US regulatory + domain + +FCC regulatory rules allow for up to 3 dBi antenna gain. Account for +this in the EEPROM based tx power reduction code. + +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/wireless/ath/ath9k/hw.c ++++ b/drivers/net/wireless/ath/ath9k/hw.c +@@ -2954,6 +2954,10 @@ void ath9k_hw_apply_txpower(struct ath_h + if (ant_gain > max_gain) + ant_reduction = ant_gain - max_gain; + ++ /* FCC allows maximum antenna gain of 3 dBi */ ++ if (reg->region == NL80211_DFS_FCC) ++ ant_reduction = max_t(int, ant_reduction - 6, 0); ++ + ah->eep_ops->set_txpower(ah, chan, ctl, ant_reduction, new_pwr, test); + } + diff --git a/package/kernel/mac80211/patches/315-ath9k_hw-check-if-the-chip-failed-to-wake-up.patch b/package/kernel/mac80211/patches/315-ath9k_hw-check-if-the-chip-failed-to-wake-up.patch deleted file mode 100644 index b0cb74ad05..0000000000 --- a/package/kernel/mac80211/patches/315-ath9k_hw-check-if-the-chip-failed-to-wake-up.patch +++ /dev/null @@ -1,30 +0,0 @@ -From: Felix Fietkau -Date: Wed, 25 Jan 2017 12:58:17 +0100 -Subject: [PATCH] ath9k_hw: check if the chip failed to wake up - -In an RFC patch, Sven Eckelmann and Simon Wunderlich reported: - -"QCA 802.11n chips (especially AR9330/AR9340) sometimes end up in a -state in which a read of AR_CFG always returns 0xdeadbeef. -This should not happen when when the power_mode of the device is -ATH9K_PM_AWAKE." - -Include the check for the default register state in the existing MAC -hang check. - -Signed-off-by: Felix Fietkau ---- - ---- a/drivers/net/wireless/ath/ath9k/hw.c -+++ b/drivers/net/wireless/ath/ath9k/hw.c -@@ -1624,6 +1624,10 @@ bool ath9k_hw_check_alive(struct ath_hw - int count = 50; - u32 reg, last_val; - -+ /* Check if chip failed to wake up */ -+ if (REG_READ(ah, AR_CFG) == 0xdeadbeef) -+ return false; -+ - if (AR_SREV_9300(ah)) - return !ath9k_hw_detect_mac_hang(ah); - diff --git a/package/kernel/mac80211/patches/316-ath9k-fix-more-data-flag-for-buffered-multicast-pack.patch b/package/kernel/mac80211/patches/316-ath9k-fix-more-data-flag-for-buffered-multicast-pack.patch new file mode 100644 index 0000000000..096eb56a2d --- /dev/null +++ b/package/kernel/mac80211/patches/316-ath9k-fix-more-data-flag-for-buffered-multicast-pack.patch @@ -0,0 +1,41 @@ +From: Felix Fietkau +Date: Sun, 23 Jul 2017 14:58:22 +0200 +Subject: [PATCH] ath9k: fix more-data flag for buffered multicast + packets + +The flag needs to be cleared for the last packet in the list, not the +first one. Fixes some issues with multicast packet loss for powersave +clients connected to an ath9k AP. + +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/wireless/ath/ath9k/xmit.c ++++ b/drivers/net/wireless/ath/ath9k/xmit.c +@@ -2451,7 +2451,6 @@ void ath_tx_cabq(struct ieee80211_hw *hw + .txq = sc->beacon.cabq + }; + struct ath_tx_info info = {}; +- struct ieee80211_hdr *hdr; + struct ath_buf *bf_tail = NULL; + struct ath_buf *bf; + LIST_HEAD(bf_q); +@@ -2495,15 +2494,10 @@ void ath_tx_cabq(struct ieee80211_hw *hw + if (list_empty(&bf_q)) + return; + +- bf = list_first_entry(&bf_q, struct ath_buf, list); +- hdr = (struct ieee80211_hdr *) bf->bf_mpdu->data; +- +- if (hdr->frame_control & cpu_to_le16(IEEE80211_FCTL_MOREDATA)) { +- hdr->frame_control &= ~cpu_to_le16(IEEE80211_FCTL_MOREDATA); +- dma_sync_single_for_device(sc->dev, bf->bf_buf_addr, +- sizeof(*hdr), DMA_TO_DEVICE); +- } ++ bf = list_last_entry(&bf_q, struct ath_buf, list); ++ ath9k_set_moredata(sc, bf, false); + ++ bf = list_first_entry(&bf_q, struct ath_buf, list); + ath_txq_lock(sc, txctl.txq); + ath_tx_fill_desc(sc, bf, txctl.txq, 0); + ath_tx_txqaddbuf(sc, txctl.txq, &bf_q, false); diff --git a/package/kernel/mac80211/patches/316-ath9k-fix-race-condition-in-enabling-disabling-IRQs.patch b/package/kernel/mac80211/patches/316-ath9k-fix-race-condition-in-enabling-disabling-IRQs.patch deleted file mode 100644 index 7a41206132..0000000000 --- a/package/kernel/mac80211/patches/316-ath9k-fix-race-condition-in-enabling-disabling-IRQs.patch +++ /dev/null @@ -1,197 +0,0 @@ -From: Felix Fietkau -Date: Wed, 25 Jan 2017 15:10:37 +0100 -Subject: [PATCH] ath9k: fix race condition in enabling/disabling IRQs - -The code currently relies on refcounting to disable IRQs from within the -IRQ handler and re-enabling them again after the tasklet has run. - -However, due to race conditions sometimes the IRQ handler might be -called twice, or the tasklet may not run at all (if interrupted in the -middle of a reset). - -This can cause nasty imbalances in the irq-disable refcount which will -get the driver permanently stuck until the entire radio has been stopped -and started again (ath_reset will not recover from this). - -Instead of using this fragile logic, change the code to ensure that -running the irq handler during tasklet processing is safe, and leave the -refcount untouched. - -Cc: stable@vger.kernel.org -Signed-off-by: Felix Fietkau ---- - ---- a/drivers/net/wireless/ath/ath9k/ath9k.h -+++ b/drivers/net/wireless/ath/ath9k/ath9k.h -@@ -998,6 +998,7 @@ struct ath_softc { - struct survey_info *cur_survey; - struct survey_info survey[ATH9K_NUM_CHANNELS]; - -+ spinlock_t intr_lock; - struct tasklet_struct intr_tq; - struct tasklet_struct bcon_tasklet; - struct ath_hw *sc_ah; ---- a/drivers/net/wireless/ath/ath9k/init.c -+++ b/drivers/net/wireless/ath/ath9k/init.c -@@ -669,6 +669,7 @@ static int ath9k_init_softc(u16 devid, s - common->bt_ant_diversity = 1; - - spin_lock_init(&common->cc_lock); -+ spin_lock_init(&sc->intr_lock); - spin_lock_init(&sc->sc_serial_rw); - spin_lock_init(&sc->sc_pm_lock); - spin_lock_init(&sc->chan_lock); ---- a/drivers/net/wireless/ath/ath9k/mac.c -+++ b/drivers/net/wireless/ath/ath9k/mac.c -@@ -810,21 +810,12 @@ void ath9k_hw_disable_interrupts(struct - } - EXPORT_SYMBOL(ath9k_hw_disable_interrupts); - --void ath9k_hw_enable_interrupts(struct ath_hw *ah) -+static void __ath9k_hw_enable_interrupts(struct ath_hw *ah) - { - struct ath_common *common = ath9k_hw_common(ah); - u32 sync_default = AR_INTR_SYNC_DEFAULT; - u32 async_mask; - -- if (!(ah->imask & ATH9K_INT_GLOBAL)) -- return; -- -- if (!atomic_inc_and_test(&ah->intr_ref_cnt)) { -- ath_dbg(common, INTERRUPT, "Do not enable IER ref count %d\n", -- atomic_read(&ah->intr_ref_cnt)); -- return; -- } -- - if (AR_SREV_9340(ah) || AR_SREV_9550(ah) || AR_SREV_9531(ah) || - AR_SREV_9561(ah)) - sync_default &= ~AR_INTR_SYNC_HOST1_FATAL; -@@ -846,6 +837,39 @@ void ath9k_hw_enable_interrupts(struct a - ath_dbg(common, INTERRUPT, "AR_IMR 0x%x IER 0x%x\n", - REG_READ(ah, AR_IMR), REG_READ(ah, AR_IER)); - } -+ -+void ath9k_hw_resume_interrupts(struct ath_hw *ah) -+{ -+ struct ath_common *common = ath9k_hw_common(ah); -+ -+ if (!(ah->imask & ATH9K_INT_GLOBAL)) -+ return; -+ -+ if (atomic_read(&ah->intr_ref_cnt) != 0) { -+ ath_dbg(common, INTERRUPT, "Do not enable IER ref count %d\n", -+ atomic_read(&ah->intr_ref_cnt)); -+ return; -+ } -+ -+ __ath9k_hw_enable_interrupts(ah); -+} -+EXPORT_SYMBOL(ath9k_hw_resume_interrupts); -+ -+void ath9k_hw_enable_interrupts(struct ath_hw *ah) -+{ -+ struct ath_common *common = ath9k_hw_common(ah); -+ -+ if (!(ah->imask & ATH9K_INT_GLOBAL)) -+ return; -+ -+ if (!atomic_inc_and_test(&ah->intr_ref_cnt)) { -+ ath_dbg(common, INTERRUPT, "Do not enable IER ref count %d\n", -+ atomic_read(&ah->intr_ref_cnt)); -+ return; -+ } -+ -+ __ath9k_hw_enable_interrupts(ah); -+} - EXPORT_SYMBOL(ath9k_hw_enable_interrupts); - - void ath9k_hw_set_interrupts(struct ath_hw *ah) ---- a/drivers/net/wireless/ath/ath9k/mac.h -+++ b/drivers/net/wireless/ath/ath9k/mac.h -@@ -744,6 +744,7 @@ void ath9k_hw_set_interrupts(struct ath_ - void ath9k_hw_enable_interrupts(struct ath_hw *ah); - void ath9k_hw_disable_interrupts(struct ath_hw *ah); - void ath9k_hw_kill_interrupts(struct ath_hw *ah); -+void ath9k_hw_resume_interrupts(struct ath_hw *ah); - - void ar9002_hw_attach_mac_ops(struct ath_hw *ah); - ---- a/drivers/net/wireless/ath/ath9k/main.c -+++ b/drivers/net/wireless/ath/ath9k/main.c -@@ -374,21 +374,20 @@ void ath9k_tasklet(unsigned long data) - struct ath_common *common = ath9k_hw_common(ah); - enum ath_reset_type type; - unsigned long flags; -- u32 status = sc->intrstatus; -+ u32 status; - u32 rxmask; - -+ spin_lock_irqsave(&sc->intr_lock, flags); -+ status = sc->intrstatus; -+ sc->intrstatus = 0; -+ spin_unlock_irqrestore(&sc->intr_lock, flags); -+ - ath9k_ps_wakeup(sc); - spin_lock(&sc->sc_pcu_lock); - - if (status & ATH9K_INT_FATAL) { - type = RESET_TYPE_FATAL_INT; - ath9k_queue_reset(sc, type); -- -- /* -- * Increment the ref. counter here so that -- * interrupts are enabled in the reset routine. -- */ -- atomic_inc(&ah->intr_ref_cnt); - ath_dbg(common, RESET, "FATAL: Skipping interrupts\n"); - goto out; - } -@@ -404,11 +403,6 @@ void ath9k_tasklet(unsigned long data) - type = RESET_TYPE_BB_WATCHDOG; - ath9k_queue_reset(sc, type); - -- /* -- * Increment the ref. counter here so that -- * interrupts are enabled in the reset routine. -- */ -- atomic_inc(&ah->intr_ref_cnt); - ath_dbg(common, RESET, - "BB_WATCHDOG: Skipping interrupts\n"); - goto out; -@@ -421,7 +415,6 @@ void ath9k_tasklet(unsigned long data) - if ((sc->gtt_cnt >= MAX_GTT_CNT) && !ath9k_hw_check_alive(ah)) { - type = RESET_TYPE_TX_GTT; - ath9k_queue_reset(sc, type); -- atomic_inc(&ah->intr_ref_cnt); - ath_dbg(common, RESET, - "GTT: Skipping interrupts\n"); - goto out; -@@ -478,7 +471,7 @@ void ath9k_tasklet(unsigned long data) - ath9k_btcoex_handle_interrupt(sc, status); - - /* re-enable hardware interrupt */ -- ath9k_hw_enable_interrupts(ah); -+ ath9k_hw_resume_interrupts(ah); - out: - spin_unlock(&sc->sc_pcu_lock); - ath9k_ps_restore(sc); -@@ -542,7 +535,9 @@ irqreturn_t ath_isr(int irq, void *dev) - return IRQ_NONE; - - /* Cache the status */ -- sc->intrstatus = status; -+ spin_lock(&sc->intr_lock); -+ sc->intrstatus |= status; -+ spin_unlock(&sc->intr_lock); - - if (status & SCHED_INTR) - sched = true; -@@ -588,7 +583,7 @@ chip_reset: - - if (sched) { - /* turn off every interrupt */ -- ath9k_hw_disable_interrupts(ah); -+ ath9k_hw_kill_interrupts(ah); - tasklet_schedule(&sc->intr_tq); - } - diff --git a/package/kernel/mac80211/patches/317-Revert-ath10k-disable-wake_tx_queue-for-older-device.patch b/package/kernel/mac80211/patches/317-Revert-ath10k-disable-wake_tx_queue-for-older-device.patch new file mode 100644 index 0000000000..5e18f285ab --- /dev/null +++ b/package/kernel/mac80211/patches/317-Revert-ath10k-disable-wake_tx_queue-for-older-device.patch @@ -0,0 +1,27 @@ +From: dave taht +Date: Wed, 5 Oct 2016 20:09:15 -0700 +Subject: [PATCH] Revert "ath10k: disable wake_tx_queue for older + devices" + +This reverts commit 4ca1807815aa6801aaced7fdefa9edacc2521767 +in the hope that we've fixed all the performance problems now. +--- + +--- a/drivers/net/wireless/ath/ath10k/mac.c ++++ b/drivers/net/wireless/ath/ath10k/mac.c +@@ -8286,15 +8286,6 @@ int ath10k_mac_register(struct ath10k *a + ath10k_warn(ar, "failed to initialise DFS pattern detector\n"); + } + +- /* Current wake_tx_queue implementation imposes a significant +- * performance penalty in some setups. The tx scheduling code needs +- * more work anyway so disable the wake_tx_queue unless firmware +- * supports the pull-push mechanism. +- */ +- if (!test_bit(ATH10K_FW_FEATURE_PEER_FLOW_CONTROL, +- ar->running_fw->fw_file.fw_features)) +- ar->ops->wake_tx_queue = NULL; +- + ret = ath10k_mac_init_rd(ar); + if (ret) { + ath10k_err(ar, "failed to derive regdom: %d\n", ret); diff --git a/package/kernel/mac80211/patches/318-0001-brcmfmac-check-brcmf_bus_get_memdump-result-for-erro.patch b/package/kernel/mac80211/patches/318-0001-brcmfmac-check-brcmf_bus_get_memdump-result-for-erro.patch deleted file mode 100644 index 4ae4c606c5..0000000000 --- a/package/kernel/mac80211/patches/318-0001-brcmfmac-check-brcmf_bus_get_memdump-result-for-erro.patch +++ /dev/null @@ -1,52 +0,0 @@ -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Mon, 30 Jan 2017 16:09:51 +0100 -Subject: [PATCH] brcmfmac: check brcmf_bus_get_memdump result for error -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This method may be unsupported (see: USB bus) or may just fail (see: -SDIO bus). -While at it rework logic in brcmf_sdio_bus_get_memdump function to avoid -too many conditional code nesting levels. - -Signed-off-by: Rafał Miłecki -Acked-by: Arend van Spriel -Signed-off-by: Kalle Valo ---- - ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c -@@ -32,16 +32,25 @@ static int brcmf_debug_create_memdump(st - { - void *dump; - size_t ramsize; -+ int err; - - ramsize = brcmf_bus_get_ramsize(bus); -- if (ramsize) { -- dump = vzalloc(len + ramsize); -- if (!dump) -- return -ENOMEM; -- memcpy(dump, data, len); -- brcmf_bus_get_memdump(bus, dump + len, ramsize); -- dev_coredumpv(bus->dev, dump, len + ramsize, GFP_KERNEL); -+ if (!ramsize) -+ return -ENOTSUPP; -+ -+ dump = vzalloc(len + ramsize); -+ if (!dump) -+ return -ENOMEM; -+ -+ memcpy(dump, data, len); -+ err = brcmf_bus_get_memdump(bus, dump + len, ramsize); -+ if (err) { -+ vfree(dump); -+ return err; - } -+ -+ dev_coredumpv(bus->dev, dump, len + ramsize, GFP_KERNEL); -+ - return 0; - } - diff --git a/package/kernel/mac80211/patches/319-0002-brcmfmac-be-more-verbose-when-PSM-s-watchdog-fires.patch b/package/kernel/mac80211/patches/319-0002-brcmfmac-be-more-verbose-when-PSM-s-watchdog-fires.patch deleted file mode 100644 index 2a3b83864e..0000000000 --- a/package/kernel/mac80211/patches/319-0002-brcmfmac-be-more-verbose-when-PSM-s-watchdog-fires.patch +++ /dev/null @@ -1,38 +0,0 @@ -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Mon, 30 Jan 2017 16:09:52 +0100 -Subject: [PATCH] brcmfmac: be more verbose when PSM's watchdog fires -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -It's important to inform user so he knows things went wrong. He may also -want to get memory dump for further debugging purposes. - -Signed-off-by: Rafał Miłecki -Acked-by: Arend van Spriel -Signed-off-by: Kalle Valo ---- - ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c -@@ -58,10 +58,18 @@ static int brcmf_debug_psm_watchdog_noti - const struct brcmf_event_msg *evtmsg, - void *data) - { -+ int err; -+ - brcmf_dbg(TRACE, "enter: bsscfgidx=%d\n", ifp->bsscfgidx); - -- return brcmf_debug_create_memdump(ifp->drvr->bus_if, data, -- evtmsg->datalen); -+ brcmf_err("PSM's watchdog has fired!\n"); -+ -+ err = brcmf_debug_create_memdump(ifp->drvr->bus_if, data, -+ evtmsg->datalen); -+ if (err) -+ brcmf_err("Failed to get memory dump, %d\n", err); -+ -+ return err; - } - - void brcmf_debugfs_init(void) diff --git a/package/kernel/mac80211/patches/319-0003-brcmfmac-use-wiphy_read_of_freq_limits-to-respect-li.patch b/package/kernel/mac80211/patches/319-0003-brcmfmac-use-wiphy_read_of_freq_limits-to-respect-li.patch deleted file mode 100644 index 6448bad5e9..0000000000 --- a/package/kernel/mac80211/patches/319-0003-brcmfmac-use-wiphy_read_of_freq_limits-to-respect-li.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 0f83ff69735651cc7a3d150466a5257ff829b62b Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Tue, 17 Jan 2017 23:35:50 +0100 -Subject: [PATCH] brcmfmac: use wiphy_read_of_freq_limits to respect limits - from DT -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This new helper reads extra frequency limits specified in DT and -disables unavailable chanels. This is useful for devices (like home -routers) with chipsets limited e.g. by board design. - -In order to respect info read from DT we simply need to check for -IEEE80211_CHAN_DISABLED bit when constructing channel info. - -Signed-off-by: Rafał Miłecki -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 6 ++++++ - 1 file changed, 6 insertions(+) - ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -@@ -5908,6 +5908,9 @@ static int brcmf_construct_chaninfo(stru - continue; - } - -+ if (channel->orig_flags & IEEE80211_CHAN_DISABLED) -+ continue; -+ - /* assuming the chanspecs order is HT20, - * HT40 upper, HT40 lower, and VHT80. - */ -@@ -6509,6 +6512,9 @@ static int brcmf_setup_wiphy(struct wiph - wiphy->bands[NL80211_BAND_5GHZ] = band; - } - } -+ -+ wiphy_read_of_freq_limits(wiphy); -+ - return 0; - } - diff --git a/package/kernel/mac80211/patches/319-0004-brcmfmac-merge-two-brcmf_err-macros-into-one.patch b/package/kernel/mac80211/patches/319-0004-brcmfmac-merge-two-brcmf_err-macros-into-one.patch deleted file mode 100644 index defd5792ea..0000000000 --- a/package/kernel/mac80211/patches/319-0004-brcmfmac-merge-two-brcmf_err-macros-into-one.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 9587a01a7ead9efc5032c16e0d9668de58be1186 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Thu, 2 Feb 2017 22:33:13 +0100 -Subject: [PATCH] brcmfmac: merge two brcmf_err macros into one -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This allows simplifying the code by adding a simple IS_ENABLED check for -CONFIG_BRCMDB symbol. - -Signed-off-by: Rafał Miłecki -Acked-by: Arend van Spriel -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h | 8 ++------ - 1 file changed, 2 insertions(+), 6 deletions(-) - ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h -@@ -45,20 +45,16 @@ - #undef pr_fmt - #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt - -+#ifndef CPTCFG_BRCM_TRACING - /* Macro for error messages. net_ratelimit() is used when driver - * debugging is not selected. When debugging the driver error - * messages are as important as other tracing or even more so. - */ --#ifndef CPTCFG_BRCM_TRACING --#ifdef CPTCFG_BRCMDBG --#define brcmf_err(fmt, ...) pr_err("%s: " fmt, __func__, ##__VA_ARGS__) --#else - #define brcmf_err(fmt, ...) \ - do { \ -- if (net_ratelimit()) \ -+ if (IS_ENABLED(CPTCFG_BRCMDBG) || net_ratelimit()) \ - pr_err("%s: " fmt, __func__, ##__VA_ARGS__); \ - } while (0) --#endif - #else - __printf(2, 3) - void __brcmf_err(const char *func, const char *fmt, ...); diff --git a/package/kernel/mac80211/patches/319-0005-brcmfmac-switch-to-C-function-__brcmf_err-for-printi.patch b/package/kernel/mac80211/patches/319-0005-brcmfmac-switch-to-C-function-__brcmf_err-for-printi.patch deleted file mode 100644 index 5baf6960ec..0000000000 --- a/package/kernel/mac80211/patches/319-0005-brcmfmac-switch-to-C-function-__brcmf_err-for-printi.patch +++ /dev/null @@ -1,69 +0,0 @@ -From 087fa712a00685dac4bcc64b7c3dc8ae6bee8026 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Thu, 2 Feb 2017 22:33:14 +0100 -Subject: [PATCH] brcmfmac: switch to C function (__brcmf_err) for printing - errors -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This will allow extending code and using more detailed messages e.g. -with the help of dev_err. - -Signed-off-by: Rafał Miłecki -Acked-by: Arend van Spriel -Signed-off-by: Kalle Valo ---- - .../net/wireless/broadcom/brcm80211/brcmfmac/common.c | 16 ++++++++++++++++ - drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h | 6 +++--- - 2 files changed, 19 insertions(+), 3 deletions(-) - ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c -@@ -218,6 +218,22 @@ done: - return err; - } - -+#ifndef CPTCFG_BRCM_TRACING -+void __brcmf_err(const char *func, const char *fmt, ...) -+{ -+ struct va_format vaf; -+ va_list args; -+ -+ va_start(args, fmt); -+ -+ vaf.fmt = fmt; -+ vaf.va = &args; -+ pr_err("%s: %pV", func, &vaf); -+ -+ va_end(args); -+} -+#endif -+ - #if defined(CPTCFG_BRCM_TRACING) || defined(CPTCFG_BRCMDBG) - void __brcmf_dbg(u32 level, const char *func, const char *fmt, ...) - { ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h -@@ -45,6 +45,8 @@ - #undef pr_fmt - #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt - -+__printf(2, 3) -+void __brcmf_err(const char *func, const char *fmt, ...); - #ifndef CPTCFG_BRCM_TRACING - /* Macro for error messages. net_ratelimit() is used when driver - * debugging is not selected. When debugging the driver error -@@ -53,11 +55,9 @@ - #define brcmf_err(fmt, ...) \ - do { \ - if (IS_ENABLED(CPTCFG_BRCMDBG) || net_ratelimit()) \ -- pr_err("%s: " fmt, __func__, ##__VA_ARGS__); \ -+ __brcmf_err(__func__, fmt, ##__VA_ARGS__); \ - } while (0) - #else --__printf(2, 3) --void __brcmf_err(const char *func, const char *fmt, ...); - #define brcmf_err(fmt, ...) \ - __brcmf_err(__func__, fmt, ##__VA_ARGS__) - #endif diff --git a/package/kernel/mac80211/patches/319-0006-brcmfmac-merge-two-remaining-brcmf_err-macros.patch b/package/kernel/mac80211/patches/319-0006-brcmfmac-merge-two-remaining-brcmf_err-macros.patch deleted file mode 100644 index 3aaddb800d..0000000000 --- a/package/kernel/mac80211/patches/319-0006-brcmfmac-merge-two-remaining-brcmf_err-macros.patch +++ /dev/null @@ -1,46 +0,0 @@ -From d0630555650a394cf5743268820511f527a561a5 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Date: Thu, 2 Feb 2017 22:33:15 +0100 -Subject: [PATCH] brcmfmac: merge two remaining brcmf_err macros -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Now we always have __brcmf_err function we can do perfectly fine with -just one macro. - -Signed-off-by: Rafał Miłecki -Acked-by: Arend van Spriel -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h | 14 +++++--------- - 1 file changed, 5 insertions(+), 9 deletions(-) - ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h -@@ -47,20 +47,16 @@ - - __printf(2, 3) - void __brcmf_err(const char *func, const char *fmt, ...); --#ifndef CPTCFG_BRCM_TRACING --/* Macro for error messages. net_ratelimit() is used when driver -- * debugging is not selected. When debugging the driver error -- * messages are as important as other tracing or even more so. -+/* Macro for error messages. When debugging / tracing the driver all error -+ * messages are important to us. - */ - #define brcmf_err(fmt, ...) \ - do { \ -- if (IS_ENABLED(CPTCFG_BRCMDBG) || net_ratelimit()) \ -+ if (IS_ENABLED(CPTCFG_BRCMDBG) || \ -+ IS_ENABLED(CPTCFG_BRCM_TRACING) || \ -+ net_ratelimit()) \ - __brcmf_err(__func__, fmt, ##__VA_ARGS__); \ - } while (0) --#else --#define brcmf_err(fmt, ...) \ -- __brcmf_err(__func__, fmt, ##__VA_ARGS__) --#endif - - #if defined(DEBUG) || defined(CPTCFG_BRCM_TRACING) - __printf(3, 4) diff --git a/package/kernel/mac80211/patches/320-ath9k-clean-up-and-fix-ath_tx_count_airtime.patch b/package/kernel/mac80211/patches/320-ath9k-clean-up-and-fix-ath_tx_count_airtime.patch deleted file mode 100644 index a6a3bfca6d..0000000000 --- a/package/kernel/mac80211/patches/320-ath9k-clean-up-and-fix-ath_tx_count_airtime.patch +++ /dev/null @@ -1,107 +0,0 @@ -From: Felix Fietkau -Date: Sun, 12 Feb 2017 13:13:05 +0100 -Subject: [PATCH] ath9k: clean up and fix ath_tx_count_airtime - -ath_tx_count_airtime is doing a lot of unnecessary work: - -- Redundant station lookup -- Redundant rcu_read_lock/unlock -- Useless memcpy of bf->rates -- Useless NULL check of bf->bf_mpdu -- Redundant lookup of the skb tid - -Additionally, it tries to look up the mac80211 queue index from the txq, -which fails if the frame was delivered via the power save queue. - -This patch fixes all of these issues by passing down the right set of -pointers instead of doing extra work - -Cc: stable@vger.kernel.org -Fixes: 63fefa050477 ("ath9k: Introduce airtime fairness scheduling between stations") -Signed-off-by: Felix Fietkau ---- - ---- a/drivers/net/wireless/ath/ath9k/xmit.c -+++ b/drivers/net/wireless/ath/ath9k/xmit.c -@@ -723,51 +723,31 @@ static bool bf_is_ampdu_not_probing(stru - return bf_isampdu(bf) && !(info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE); - } - --static void ath_tx_count_airtime(struct ath_softc *sc, struct ath_txq *txq, -- struct ath_buf *bf, struct ath_tx_status *ts) -+static void ath_tx_count_airtime(struct ath_softc *sc, struct ath_node *an, -+ struct ath_atx_tid *tid, struct ath_buf *bf, -+ struct ath_tx_status *ts) - { -- struct ath_node *an; -- struct ath_acq *acq = &sc->cur_chan->acq[txq->mac80211_qnum]; -- struct sk_buff *skb; -- struct ieee80211_hdr *hdr; -- struct ieee80211_hw *hw = sc->hw; -- struct ieee80211_tx_rate rates[4]; -- struct ieee80211_sta *sta; -- int i; -+ struct ath_txq *txq = tid->txq; - u32 airtime = 0; -- -- skb = bf->bf_mpdu; -- if(!skb) -- return; -- -- hdr = (struct ieee80211_hdr *)skb->data; -- memcpy(rates, bf->rates, sizeof(rates)); -- -- rcu_read_lock(); -- -- sta = ieee80211_find_sta_by_ifaddr(hw, hdr->addr1, hdr->addr2); -- if(!sta) -- goto exit; -- -- -- an = (struct ath_node *) sta->drv_priv; -+ int i; - - airtime += ts->duration * (ts->ts_longretry + 1); -+ for(i = 0; i < ts->ts_rateindex; i++) { -+ int rate_dur = ath9k_hw_get_duration(sc->sc_ah, bf->bf_desc, i); -+ airtime += rate_dur * bf->rates[i].count; -+ } - -- for(i=0; i < ts->ts_rateindex; i++) -- airtime += ath9k_hw_get_duration(sc->sc_ah, bf->bf_desc, i) * rates[i].count; -+ if (sc->airtime_flags & AIRTIME_USE_TX) { -+ int q = txq->mac80211_qnum; -+ struct ath_acq *acq = &sc->cur_chan->acq[q]; - -- if (!!(sc->airtime_flags & AIRTIME_USE_TX)) { - spin_lock_bh(&acq->lock); -- an->airtime_deficit[txq->mac80211_qnum] -= airtime; -- if (an->airtime_deficit[txq->mac80211_qnum] <= 0) -- __ath_tx_queue_tid(sc, ath_get_skb_tid(sc, an, skb)); -+ an->airtime_deficit[q] -= airtime; -+ if (an->airtime_deficit[q] <= 0) -+ __ath_tx_queue_tid(sc, tid); - spin_unlock_bh(&acq->lock); - } - ath_debug_airtime(sc, an, 0, airtime); -- --exit: -- rcu_read_unlock(); - } - - static void ath_tx_process_buffer(struct ath_softc *sc, struct ath_txq *txq, -@@ -791,13 +771,13 @@ static void ath_tx_process_buffer(struct - - ts->duration = ath9k_hw_get_duration(sc->sc_ah, bf->bf_desc, - ts->ts_rateindex); -- ath_tx_count_airtime(sc, txq, bf, ts); - - hdr = (struct ieee80211_hdr *) bf->bf_mpdu->data; - sta = ieee80211_find_sta_by_ifaddr(hw, hdr->addr1, hdr->addr2); - if (sta) { - struct ath_node *an = (struct ath_node *)sta->drv_priv; - tid = ath_get_skb_tid(sc, an, bf->bf_mpdu); -+ ath_tx_count_airtime(sc, an, tid, bf, ts); - if (ts->ts_status & (ATH9K_TXERR_FILT | ATH9K_TXERR_XRETRY)) - tid->clear_ps_filter = true; - } diff --git a/package/kernel/mac80211/patches/321-mac80211-fix-CSA-in-IBSS-mode.patch b/package/kernel/mac80211/patches/321-mac80211-fix-CSA-in-IBSS-mode.patch deleted file mode 100644 index 13765b2900..0000000000 --- a/package/kernel/mac80211/patches/321-mac80211-fix-CSA-in-IBSS-mode.patch +++ /dev/null @@ -1,34 +0,0 @@ -From: Koen Vandeputte -Date: Wed, 8 Feb 2017 15:29:45 +0100 -Subject: [PATCH] mac80211: fix CSA in IBSS mode -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Add the missing IBSS capability flag during capability init as it needs -to be inserted into the generated beacon in order for CSA to work. - -Signed-off-by: Piotr Gawlowicz -Signed-off-by: Mikołaj Chwalisz -Tested-by: Koen Vandeputte ---- - ---- a/net/mac80211/ibss.c -+++ b/net/mac80211/ibss.c -@@ -487,14 +487,14 @@ int ieee80211_ibss_csa_beacon(struct iee - struct beacon_data *presp, *old_presp; - struct cfg80211_bss *cbss; - const struct cfg80211_bss_ies *ies; -- u16 capability = 0; -+ u16 capability = WLAN_CAPABILITY_IBSS; - u64 tsf; - int ret = 0; - - sdata_assert_lock(sdata); - - if (ifibss->privacy) -- capability = WLAN_CAPABILITY_PRIVACY; -+ capability |= WLAN_CAPABILITY_PRIVACY; - - cbss = cfg80211_get_bss(sdata->local->hw.wiphy, ifibss->chandef.chan, - ifibss->bssid, ifibss->ssid, diff --git a/package/kernel/mac80211/patches/322-mac80211-don-t-handle-filtered-frames-within-a-BA-se.patch b/package/kernel/mac80211/patches/322-mac80211-don-t-handle-filtered-frames-within-a-BA-se.patch deleted file mode 100644 index 66e1bfb4c1..0000000000 --- a/package/kernel/mac80211/patches/322-mac80211-don-t-handle-filtered-frames-within-a-BA-se.patch +++ /dev/null @@ -1,28 +0,0 @@ -From: Felix Fietkau -Date: Wed, 22 Feb 2017 16:13:17 +0100 -Subject: [PATCH] mac80211: don't handle filtered frames within a BA session - -When running a BA session, the driver (or the hardware) already takes -care of retransmitting failed frames, since it has to keep the receiver -reorder window in sync. - -Adding another layer of retransmit around that does not improve -anything. In fact, it can only lead to some strong reordering with huge -latency. - -Cc: stable@vger.kernel.org -Signed-off-by: Felix Fietkau ---- - ---- a/net/mac80211/status.c -+++ b/net/mac80211/status.c -@@ -51,7 +51,8 @@ static void ieee80211_handle_filtered_fr - struct ieee80211_hdr *hdr = (void *)skb->data; - int ac; - -- if (info->flags & IEEE80211_TX_CTL_NO_PS_BUFFER) { -+ if (info->flags & (IEEE80211_TX_CTL_NO_PS_BUFFER | -+ IEEE80211_TX_CTL_AMPDU)) { - ieee80211_free_txskb(&local->hw, skb); - return; - } diff --git a/package/kernel/mac80211/patches/325-mac80211-unconditionally-start-new-netdev-queues-wit.patch b/package/kernel/mac80211/patches/325-mac80211-unconditionally-start-new-netdev-queues-wit.patch deleted file mode 100644 index ff7bbcb645..0000000000 --- a/package/kernel/mac80211/patches/325-mac80211-unconditionally-start-new-netdev-queues-wit.patch +++ /dev/null @@ -1,29 +0,0 @@ -From: Johannes Berg -Date: Wed, 29 Mar 2017 14:15:24 +0200 -Subject: [PATCH] mac80211: unconditionally start new netdev queues with iTXQ - support - -When internal mac80211 TXQs aren't supported, netdev queues must -always started out started even when driver queues are stopped -while the interface is added. This is necessary because with the -internal TXQ support netdev queues are never stopped and packet -scheduling/dropping is done in mac80211. - -Cc: stable@vger.kernel.org # 4.9+ -Fixes: 80a83cfc434b1 ("mac80211: skip netdev queue control with software queuing") -Reported-and-tested-by: Sven Eckelmann -Signed-off-by: Johannes Berg ---- - ---- a/net/mac80211/iface.c -+++ b/net/mac80211/iface.c -@@ -727,7 +727,8 @@ int ieee80211_do_open(struct wireless_de - ieee80211_recalc_ps(local); - - if (sdata->vif.type == NL80211_IFTYPE_MONITOR || -- sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { -+ sdata->vif.type == NL80211_IFTYPE_AP_VLAN || -+ local->ops->wake_tx_queue) { - /* XXX: for AP_VLAN, actually track AP queues */ - netif_tx_start_all_queues(dev); - } else if (dev) { diff --git a/package/kernel/mac80211/patches/326-brcmfmac-add-length-check-in-brcmf_cfg80211_escan_ha.patch b/package/kernel/mac80211/patches/326-brcmfmac-add-length-check-in-brcmf_cfg80211_escan_ha.patch deleted file mode 100644 index 63c867a80c..0000000000 --- a/package/kernel/mac80211/patches/326-brcmfmac-add-length-check-in-brcmf_cfg80211_escan_ha.patch +++ /dev/null @@ -1,63 +0,0 @@ -From: Arend Van Spriel -Date: Tue, 12 Sep 2017 10:47:53 +0200 -Subject: [PATCH] brcmfmac: add length check in brcmf_cfg80211_escan_handler() - -Upon handling the firmware notification for scans the length was -checked properly and may result in corrupting kernel heap memory -due to buffer overruns. This fix addresses CVE-2017-0786. - -Cc: stable@vger.kernel.org # v4.0.x -Cc: Kevin Cernekee -Reviewed-by: Hante Meuleman -Reviewed-by: Pieter-Paul Giesberts -Reviewed-by: Franky Lin -Signed-off-by: Arend van Spriel -Signed-off-by: Kalle Valo ---- - ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -@@ -3088,6 +3088,7 @@ brcmf_cfg80211_escan_handler(struct brcm - struct brcmf_cfg80211_info *cfg = ifp->drvr->config; - s32 status; - struct brcmf_escan_result_le *escan_result_le; -+ u32 escan_buflen; - struct brcmf_bss_info_le *bss_info_le; - struct brcmf_bss_info_le *bss = NULL; - u32 bi_length; -@@ -3104,11 +3105,23 @@ brcmf_cfg80211_escan_handler(struct brcm - - if (status == BRCMF_E_STATUS_PARTIAL) { - brcmf_dbg(SCAN, "ESCAN Partial result\n"); -+ if (e->datalen < sizeof(*escan_result_le)) { -+ brcmf_err("invalid event data length\n"); -+ goto exit; -+ } - escan_result_le = (struct brcmf_escan_result_le *) data; - if (!escan_result_le) { - brcmf_err("Invalid escan result (NULL pointer)\n"); - goto exit; - } -+ escan_buflen = le32_to_cpu(escan_result_le->buflen); -+ if (escan_buflen > BRCMF_ESCAN_BUF_SIZE || -+ escan_buflen > e->datalen || -+ escan_buflen < sizeof(*escan_result_le)) { -+ brcmf_err("Invalid escan buffer length: %d\n", -+ escan_buflen); -+ goto exit; -+ } - if (le16_to_cpu(escan_result_le->bss_count) != 1) { - brcmf_err("Invalid bss_count %d: ignoring\n", - escan_result_le->bss_count); -@@ -3125,9 +3138,8 @@ brcmf_cfg80211_escan_handler(struct brcm - } - - bi_length = le32_to_cpu(bss_info_le->length); -- if (bi_length != (le32_to_cpu(escan_result_le->buflen) - -- WL_ESCAN_RESULTS_FIXED_SIZE)) { -- brcmf_err("Invalid bss_info length %d: ignoring\n", -+ if (bi_length != escan_buflen - WL_ESCAN_RESULTS_FIXED_SIZE) { -+ brcmf_err("Ignoring invalid bss_info length: %d\n", - bi_length); - goto exit; - } diff --git a/package/kernel/mac80211/patches/328-mac80211-use-constant-time-comparison-with-keys.patch b/package/kernel/mac80211/patches/328-mac80211-use-constant-time-comparison-with-keys.patch new file mode 100644 index 0000000000..03e8201902 --- /dev/null +++ b/package/kernel/mac80211/patches/328-mac80211-use-constant-time-comparison-with-keys.patch @@ -0,0 +1,33 @@ +From 2bdd713b92a9cade239d3c7d15205a09f556624d Mon Sep 17 00:00:00 2001 +From: "Jason A. Donenfeld" +Date: Tue, 17 Oct 2017 20:32:07 +0200 +Subject: [PATCH] mac80211: use constant time comparison with keys + +Otherwise we risk leaking information via timing side channel. + +Fixes: fdf7cb4185b6 ("mac80211: accept key reinstall without changing anything") +Signed-off-by: Jason A. Donenfeld +Signed-off-by: Johannes Berg +--- + net/mac80211/key.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/net/mac80211/key.c ++++ b/net/mac80211/key.c +@@ -19,6 +19,7 @@ + #include + #include + #include ++#include + #include + #include "ieee80211_i.h" + #include "driver-ops.h" +@@ -635,7 +636,7 @@ int ieee80211_key_link(struct ieee80211_ + * new version of the key to avoid nonce reuse or replay issues. + */ + if (old_key && key->conf.keylen == old_key->conf.keylen && +- !memcmp(key->conf.key, old_key->conf.key, key->conf.keylen)) { ++ !crypto_memneq(key->conf.key, old_key->conf.key, key->conf.keylen)) { + ieee80211_key_free_unused(key); + ret = 0; + goto out; diff --git a/package/kernel/mac80211/patches/329-mac80211-don-t-compare-TKIP-TX-MIC-key-in-reinstall.patch b/package/kernel/mac80211/patches/329-mac80211-don-t-compare-TKIP-TX-MIC-key-in-reinstall.patch new file mode 100644 index 0000000000..1eaf51de72 --- /dev/null +++ b/package/kernel/mac80211/patches/329-mac80211-don-t-compare-TKIP-TX-MIC-key-in-reinstall.patch @@ -0,0 +1,73 @@ +From cfbb0d90a7abb289edc91833d0905931f8805f12 Mon Sep 17 00:00:00 2001 +From: Johannes Berg +Date: Tue, 24 Oct 2017 21:12:13 +0200 +Subject: [PATCH] mac80211: don't compare TKIP TX MIC key in reinstall prevention + +For the reinstall prevention, the code I had added compares the +whole key. It turns out though that iwlwifi firmware doesn't +provide the TKIP TX MIC key as it's not needed in client mode, +and thus the comparison will always return false. + +For client mode, thus always zero out the TX MIC key part before +doing the comparison in order to avoid accepting the reinstall +of the key with identical encryption and RX MIC key, but not the +same TX MIC key (since the supplicant provides the real one.) + +Fixes: fdf7cb4185b6 ("mac80211: accept key reinstall without changing anything") +Signed-off-by: Johannes Berg +--- + net/mac80211/key.c | 36 ++++++++++++++++++++++++++++++++++-- + 1 file changed, 34 insertions(+), 2 deletions(-) + +--- a/net/mac80211/key.c ++++ b/net/mac80211/key.c +@@ -610,6 +610,39 @@ void ieee80211_key_free_unused(struct ie + ieee80211_key_free_common(key); + } + ++static bool ieee80211_key_identical(struct ieee80211_sub_if_data *sdata, ++ struct ieee80211_key *old, ++ struct ieee80211_key *new) ++{ ++ u8 tkip_old[WLAN_KEY_LEN_TKIP], tkip_new[WLAN_KEY_LEN_TKIP]; ++ u8 *tk_old, *tk_new; ++ ++ if (!old || new->conf.keylen != old->conf.keylen) ++ return false; ++ ++ tk_old = old->conf.key; ++ tk_new = new->conf.key; ++ ++ /* ++ * In station mode, don't compare the TX MIC key, as it's never used ++ * and offloaded rekeying may not care to send it to the host. This ++ * is the case in iwlwifi, for example. ++ */ ++ if (sdata->vif.type == NL80211_IFTYPE_STATION && ++ new->conf.cipher == WLAN_CIPHER_SUITE_TKIP && ++ new->conf.keylen == WLAN_KEY_LEN_TKIP && ++ !(new->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE)) { ++ memcpy(tkip_old, tk_old, WLAN_KEY_LEN_TKIP); ++ memcpy(tkip_new, tk_new, WLAN_KEY_LEN_TKIP); ++ memset(tkip_old + NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY, 0, 8); ++ memset(tkip_new + NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY, 0, 8); ++ tk_old = tkip_old; ++ tk_new = tkip_new; ++ } ++ ++ return !crypto_memneq(tk_old, tk_new, new->conf.keylen); ++} ++ + int ieee80211_key_link(struct ieee80211_key *key, + struct ieee80211_sub_if_data *sdata, + struct sta_info *sta) +@@ -635,8 +668,7 @@ int ieee80211_key_link(struct ieee80211_ + * Silently accept key re-installation without really installing the + * new version of the key to avoid nonce reuse or replay issues. + */ +- if (old_key && key->conf.keylen == old_key->conf.keylen && +- !crypto_memneq(key->conf.key, old_key->conf.key, key->conf.keylen)) { ++ if (ieee80211_key_identical(sdata, old_key, key)) { + ieee80211_key_free_unused(key); + ret = 0; + goto out; diff --git a/package/kernel/mac80211/patches/402-ath_regd_optional.patch b/package/kernel/mac80211/patches/402-ath_regd_optional.patch index c8ede7f583..fae9b55529 100644 --- a/package/kernel/mac80211/patches/402-ath_regd_optional.patch +++ b/package/kernel/mac80211/patches/402-ath_regd_optional.patch @@ -27,7 +27,7 @@ if (!IS_ENABLED(CPTCFG_ATH_REG_DYNAMIC_USER_REG_HINTS)) return false; if (!dynamic_country_user_possible(reg)) -@@ -341,6 +347,9 @@ ath_reg_apply_beaconing_flags(struct wip +@@ -345,6 +351,9 @@ ath_reg_apply_beaconing_flags(struct wip struct ieee80211_channel *ch; unsigned int i; @@ -37,7 +37,7 @@ for (band = 0; band < NUM_NL80211_BANDS; band++) { if (!wiphy->bands[band]) continue; -@@ -374,6 +383,9 @@ ath_reg_apply_ir_flags(struct wiphy *wip +@@ -378,6 +387,9 @@ ath_reg_apply_ir_flags(struct wiphy *wip { struct ieee80211_supported_band *sband; @@ -47,7 +47,7 @@ sband = wiphy->bands[NL80211_BAND_2GHZ]; if (!sband) return; -@@ -402,6 +414,9 @@ static void ath_reg_apply_radar_flags(st +@@ -407,6 +419,9 @@ static void ath_reg_apply_radar_flags(st struct ieee80211_channel *ch; unsigned int i; @@ -57,7 +57,7 @@ if (!wiphy->bands[NL80211_BAND_5GHZ]) return; -@@ -539,6 +554,11 @@ void ath_reg_notifier_apply(struct wiphy +@@ -544,6 +559,11 @@ void ath_reg_notifier_apply(struct wiphy ath_reg_dyn_country(wiphy, reg, request); break; } @@ -69,7 +69,7 @@ } EXPORT_SYMBOL(ath_reg_notifier_apply); -@@ -634,6 +654,10 @@ ath_regd_init_wiphy(struct ath_regulator +@@ -639,6 +659,10 @@ ath_regd_init_wiphy(struct ath_regulator const struct ieee80211_regdomain *regd; wiphy->reg_notifier = reg_notifier; @@ -80,7 +80,7 @@ wiphy->regulatory_flags |= REGULATORY_STRICT_REG | REGULATORY_CUSTOM_REG; -@@ -762,10 +786,7 @@ ath_regd_init(struct ath_regulatory *reg +@@ -767,10 +791,7 @@ ath_regd_init(struct ath_regulatory *reg if (r) return r; @@ -104,9 +104,9 @@ config ATH_DEBUG bool "Atheros wireless debugging" ---help--- ---- a/.local-symbols -+++ b/.local-symbols -@@ -130,6 +130,7 @@ ADM8211= +--- a/local-symbols ++++ b/local-symbols +@@ -82,6 +82,7 @@ ADM8211= ATH_COMMON= WLAN_VENDOR_ATH= ATH_DEBUG= diff --git a/package/kernel/mac80211/patches/404-regd_no_assoc_hints.patch b/package/kernel/mac80211/patches/404-regd_no_assoc_hints.patch index 469da90160..457c0cb28c 100644 --- a/package/kernel/mac80211/patches/404-regd_no_assoc_hints.patch +++ b/package/kernel/mac80211/patches/404-regd_no_assoc_hints.patch @@ -1,6 +1,6 @@ --- a/net/wireless/reg.c +++ b/net/wireless/reg.c -@@ -2398,6 +2398,8 @@ void regulatory_hint_country_ie(struct w +@@ -2497,6 +2497,8 @@ void regulatory_hint_country_ie(struct w enum environment_cap env = ENVIRON_ANY; struct regulatory_request *request = NULL, *lr; @@ -9,7 +9,7 @@ /* IE len must be evenly divisible by 2 */ if (country_ie_len & 0x01) return; -@@ -2604,6 +2606,7 @@ static void restore_regulatory_settings( +@@ -2703,6 +2705,7 @@ static void restore_regulatory_settings( void regulatory_hint_disconnect(void) { diff --git a/package/kernel/mac80211/patches/406-ath_relax_default_regd.patch b/package/kernel/mac80211/patches/406-ath_relax_default_regd.patch index 35b0f2b76e..44e8f3281c 100644 --- a/package/kernel/mac80211/patches/406-ath_relax_default_regd.patch +++ b/package/kernel/mac80211/patches/406-ath_relax_default_regd.patch @@ -39,7 +39,7 @@ bool ath_is_world_regd(struct ath_regulatory *reg) { return is_wwr_sku(ath_regd_get_eepromRD(reg)); -@@ -658,6 +666,9 @@ ath_regd_init_wiphy(struct ath_regulator +@@ -663,6 +671,9 @@ ath_regd_init_wiphy(struct ath_regulator if (IS_ENABLED(CPTCFG_ATH_USER_REGD)) return 0; diff --git a/package/kernel/mac80211/patches/440-ath5k_channel_bw_debugfs.patch b/package/kernel/mac80211/patches/440-ath5k_channel_bw_debugfs.patch index 1d249a9723..3ae01a5c35 100644 --- a/package/kernel/mac80211/patches/440-ath5k_channel_bw_debugfs.patch +++ b/package/kernel/mac80211/patches/440-ath5k_channel_bw_debugfs.patch @@ -109,7 +109,7 @@ drivers/net/wireless/ath/ath5k/debug.c | 86 ++++++++++++++++++++++++++++++++ /* debugfs: queues etc */ -@@ -1009,6 +1100,9 @@ ath5k_debug_init_device(struct ath5k_hw +@@ -1012,6 +1103,9 @@ ath5k_debug_init_device(struct ath5k_hw debugfs_create_file("beacon", S_IWUSR | S_IRUSR, phydir, ah, &fops_beacon); diff --git a/package/kernel/mac80211/patches/500-ath9k_eeprom_debugfs.patch b/package/kernel/mac80211/patches/500-ath9k_eeprom_debugfs.patch index f21eed18c3..b6dc45cd96 100644 --- a/package/kernel/mac80211/patches/500-ath9k_eeprom_debugfs.patch +++ b/package/kernel/mac80211/patches/500-ath9k_eeprom_debugfs.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -1315,6 +1315,53 @@ void ath9k_deinit_debug(struct ath_softc +@@ -1374,6 +1374,53 @@ void ath9k_deinit_debug(struct ath_softc ath9k_cmn_spectral_deinit_debug(&sc->spec_priv); } @@ -54,7 +54,7 @@ int ath9k_init_debug(struct ath_hw *ah) { struct ath_common *common = ath9k_hw_common(ah); -@@ -1334,6 +1381,8 @@ int ath9k_init_debug(struct ath_hw *ah) +@@ -1393,6 +1440,8 @@ int ath9k_init_debug(struct ath_hw *ah) ath9k_tx99_init_debug(sc); ath9k_cmn_spectral_init_debug(&sc->spec_priv, sc->debug.debugfs_phy); diff --git a/package/kernel/mac80211/patches/501-ath9k_ahb_init.patch b/package/kernel/mac80211/patches/501-ath9k_ahb_init.patch index d076e3c2eb..53225dbc36 100644 --- a/package/kernel/mac80211/patches/501-ath9k_ahb_init.patch +++ b/package/kernel/mac80211/patches/501-ath9k_ahb_init.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c -@@ -1086,23 +1086,23 @@ static int __init ath9k_init(void) +@@ -1088,23 +1088,23 @@ static int __init ath9k_init(void) { int error; diff --git a/package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch b/package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch index c98072bac9..2ebb73d689 100644 --- a/package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch +++ b/package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -1362,6 +1362,52 @@ static const struct file_operations fops +@@ -1421,6 +1421,52 @@ static const struct file_operations fops .owner = THIS_MODULE }; @@ -53,7 +53,7 @@ int ath9k_init_debug(struct ath_hw *ah) { struct ath_common *common = ath9k_hw_common(ah); -@@ -1383,6 +1429,8 @@ int ath9k_init_debug(struct ath_hw *ah) +@@ -1442,6 +1488,8 @@ int ath9k_init_debug(struct ath_hw *ah) debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc, &fops_eeprom); @@ -74,7 +74,7 @@ --- a/drivers/net/wireless/ath/ath9k/common.c +++ b/drivers/net/wireless/ath/ath9k/common.c -@@ -296,11 +296,13 @@ EXPORT_SYMBOL(ath9k_cmn_get_hw_crypto_ke +@@ -297,11 +297,13 @@ EXPORT_SYMBOL(ath9k_cmn_get_hw_crypto_ke /* * Update internal channel flags. */ @@ -89,7 +89,7 @@ ichan->channel = chan->center_freq; ichan->chan = chan; -@@ -308,7 +310,19 @@ static void ath9k_cmn_update_ichannel(st +@@ -309,7 +311,19 @@ static void ath9k_cmn_update_ichannel(st if (chan->band == NL80211_BAND_5GHZ) flags |= CHANNEL_5GHZ; @@ -110,7 +110,7 @@ case NL80211_CHAN_WIDTH_5: flags |= CHANNEL_QUARTER; break; -@@ -341,10 +355,11 @@ struct ath9k_channel *ath9k_cmn_get_chan +@@ -342,10 +356,11 @@ struct ath9k_channel *ath9k_cmn_get_chan struct cfg80211_chan_def *chandef) { struct ieee80211_channel *curchan = chandef->chan; diff --git a/package/kernel/mac80211/patches/513-ath9k_add_pci_ids.patch b/package/kernel/mac80211/patches/513-ath9k_add_pci_ids.patch index 59daf4fe11..fdeaed05e8 100644 --- a/package/kernel/mac80211/patches/513-ath9k_add_pci_ids.patch +++ b/package/kernel/mac80211/patches/513-ath9k_add_pci_ids.patch @@ -20,7 +20,7 @@ #define AR9160_DEVID_PCI 0x0027 --- a/drivers/net/wireless/ath/ath9k/pci.c +++ b/drivers/net/wireless/ath/ath9k/pci.c -@@ -763,6 +763,7 @@ static const struct pci_device_id ath_pc +@@ -773,6 +773,7 @@ static const struct pci_device_id ath_pc .driver_data = ATH9K_PCI_BT_ANT_DIV }, #endif diff --git a/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch b/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch index 9a0f6f5dbd..72857a0dbf 100644 --- a/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch +++ b/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch @@ -1,6 +1,6 @@ --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h -@@ -2660,6 +2660,7 @@ struct cfg80211_nan_func { +@@ -2750,6 +2750,7 @@ struct cfg80211_pmk_conf { * (as advertised by the nl80211 feature flag.) * @get_tx_power: store the current TX power into the dbm variable; * return 0 if successful @@ -8,7 +8,7 @@ * * @set_wds_peer: set the WDS peer for a WDS interface * -@@ -2940,6 +2941,7 @@ struct cfg80211_ops { +@@ -3041,6 +3042,7 @@ struct cfg80211_ops { enum nl80211_tx_power_setting type, int mbm); int (*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev, int *dbm); @@ -18,7 +18,7 @@ const u8 *addr); --- a/include/net/mac80211.h +++ b/include/net/mac80211.h -@@ -1325,6 +1325,7 @@ enum ieee80211_smps_mode { +@@ -1338,6 +1338,7 @@ enum ieee80211_smps_mode { * * @power_level: requested transmit power (in dBm), backward compatibility * value only that is set to the minimum of all interfaces @@ -26,7 +26,7 @@ * * @chandef: the channel definition to tune to * @radar_enabled: whether radar detection is enabled -@@ -1345,6 +1346,7 @@ enum ieee80211_smps_mode { +@@ -1358,6 +1359,7 @@ enum ieee80211_smps_mode { struct ieee80211_conf { u32 flags; int power_level, dynamic_ps_timeout; @@ -36,9 +36,9 @@ u8 ps_dtim_period; --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h -@@ -2002,6 +2002,9 @@ enum nl80211_commands { - * u32 attribute with an &enum nl80211_timeout_reason value. This is used, - * e.g., with %NL80211_CMD_CONNECT event. +@@ -2149,6 +2149,9 @@ enum nl80211_commands { + * @NL80211_ATTR_PMKR0_NAME: PMK-R0 Name for offloaded FT. + * @NL80211_ATTR_PORT_AUTHORIZED: (reserved) * + * @NL80211_ATTR_WIPHY_ANTENNA_GAIN: Configured antenna gain. Used to reduce + * transmit power to stay within regulatory limits. u32, dBi. @@ -46,9 +46,9 @@ * @NUM_NL80211_ATTR: total number of nl80211_attrs available * @NL80211_ATTR_MAX: highest attribute number currently defined * @__NL80211_ATTR_AFTER_LAST: internal use -@@ -2413,6 +2416,8 @@ enum nl80211_attrs { - - NL80211_ATTR_TIMEOUT_REASON, +@@ -2575,6 +2578,8 @@ enum nl80211_attrs { + NL80211_ATTR_PMKR0_NAME, + NL80211_ATTR_PORT_AUTHORIZED, + NL80211_ATTR_WIPHY_ANTENNA_GAIN, + @@ -57,7 +57,7 @@ __NL80211_ATTR_AFTER_LAST, --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c -@@ -2396,6 +2396,19 @@ static int ieee80211_get_tx_power(struct +@@ -2444,6 +2444,19 @@ static int ieee80211_get_tx_power(struct return 0; } @@ -77,7 +77,7 @@ static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev, const u8 *addr) { -@@ -3627,6 +3640,7 @@ const struct cfg80211_ops mac80211_confi +@@ -3717,6 +3730,7 @@ const struct cfg80211_ops mac80211_confi .set_wiphy_params = ieee80211_set_wiphy_params, .set_tx_power = ieee80211_set_tx_power, .get_tx_power = ieee80211_get_tx_power, @@ -87,7 +87,7 @@ CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd) --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h -@@ -1370,6 +1370,7 @@ struct ieee80211_local { +@@ -1347,6 +1347,7 @@ struct ieee80211_local { int dynamic_ps_forced_timeout; int user_power_level; /* in dBm, for all interfaces */ @@ -119,7 +119,7 @@ if (local->hw.conf.power_level != power) { changed |= IEEE80211_CONF_CHANGE_POWER; local->hw.conf.power_level = power; -@@ -589,6 +595,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_ +@@ -592,6 +598,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_ IEEE80211_RADIOTAP_MCS_HAVE_BW; local->hw.radiotap_vht_details = IEEE80211_RADIOTAP_VHT_KNOWN_GI | IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH; @@ -129,15 +129,15 @@ local->user_power_level = IEEE80211_UNSET_POWER_LEVEL; --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c -@@ -424,6 +424,7 @@ static const struct nla_policy nl80211_p - .len = sizeof(struct nl80211_bss_select_rssi_adjust) - }, - [NL80211_ATTR_TIMEOUT_REASON] = { .type = NLA_U32 }, +@@ -420,6 +420,7 @@ static const struct nla_policy nl80211_p + [NL80211_ATTR_FILS_CACHE_ID] = { .len = 2 }, + [NL80211_ATTR_PMK] = { .type = NLA_BINARY, .len = PMK_MAX_LEN }, + [NL80211_ATTR_SCHED_SCAN_MULTI] = { .type = NLA_FLAG }, + [NL80211_ATTR_WIPHY_ANTENNA_GAIN] = { .type = NLA_U32 }, }; /* policy for the key attributes */ -@@ -2385,6 +2386,20 @@ static int nl80211_set_wiphy(struct sk_b +@@ -2395,6 +2396,20 @@ static int nl80211_set_wiphy(struct sk_b if (result) return result; } diff --git a/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch b/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch index b3b51b4433..9084ea7db3 100644 --- a/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch +++ b/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch @@ -103,7 +103,8 @@ + GFP_KERNEL); + if (!led) + return -ENOMEM; -+ + +- ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, val); + led->gpio = gpio = (struct gpio_led *) (led + 1); + _name = (char *) (led->gpio + 1); + @@ -116,8 +117,7 @@ + ret = ath_add_led(sc, led); + if (unlikely(ret < 0)) + kfree(led); - -- ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, val); ++ + return ret; } @@ -125,11 +125,11 @@ { - if (!sc->led_registered) - return; -+ struct ath_led *led; - +- - ath_led_brightness(&sc->led_cdev, LED_OFF); - led_classdev_unregister(&sc->led_cdev); -- ++ struct ath_led *led; + - ath9k_hw_gpio_free(sc->sc_ah, sc->sc_ah->led_pin); + while (!list_empty(&sc->leds)) { + led = list_first_entry(&sc->leds, struct ath_led, list); @@ -181,7 +181,7 @@ --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c -@@ -998,7 +998,7 @@ int ath9k_init_device(u16 devid, struct +@@ -1000,7 +1000,7 @@ int ath9k_init_device(u16 devid, struct #ifdef CPTCFG_MAC80211_LEDS /* must be initialized before ieee80211_register_hw */ @@ -192,7 +192,7 @@ #endif --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -1407,6 +1407,61 @@ static const struct file_operations fops +@@ -1466,6 +1466,61 @@ static const struct file_operations fops .llseek = default_llseek, }; @@ -254,7 +254,7 @@ int ath9k_init_debug(struct ath_hw *ah) { -@@ -1431,6 +1486,10 @@ int ath9k_init_debug(struct ath_hw *ah) +@@ -1490,6 +1545,10 @@ int ath9k_init_debug(struct ath_hw *ah) &fops_eeprom); debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, sc, &fops_chanbw); diff --git a/package/kernel/mac80211/patches/531-ath9k_extra_platform_leds.patch b/package/kernel/mac80211/patches/531-ath9k_extra_platform_leds.patch index 35d8e8bd42..8ed7ad8a09 100644 --- a/package/kernel/mac80211/patches/531-ath9k_extra_platform_leds.patch +++ b/package/kernel/mac80211/patches/531-ath9k_extra_platform_leds.patch @@ -56,16 +56,21 @@ INIT_LIST_HEAD(&sc->leds); -@@ -144,6 +165,12 @@ void ath_init_leds(struct ath_softc *sc) +@@ -134,6 +155,17 @@ void ath_init_leds(struct ath_softc *sc) - ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger, - !sc->sc_ah->config.led_active_high); + ath_fill_led_pin(sc); + ++ if (pdata && pdata->leds && pdata->num_leds) ++ for (i = 0; i < pdata->num_leds; i++) { ++ if (pdata->leds[i].gpio == sc->sc_ah->led_pin) ++ sc->sc_ah->led_pin = -1; + -+ if (!pdata) ++ ath_create_platform_led(sc, &pdata->leds[i]); ++ } ++ ++ if (sc->sc_ah->led_pin < 0) + return; + -+ for (i = 0; i < pdata->num_leds; i++) -+ ath_create_platform_led(sc, &pdata->leds[i]); - } - #endif + snprintf(led_name, sizeof(led_name), "ath9k-%s", + wiphy_name(sc->hw->wiphy)); diff --git a/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch b/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch index 3e687792da..7cf589485e 100644 --- a/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch +++ b/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -1463,6 +1463,50 @@ static const struct file_operations fops +@@ -1522,6 +1522,50 @@ static const struct file_operations fops #endif @@ -51,7 +51,7 @@ int ath9k_init_debug(struct ath_hw *ah) { struct ath_common *common = ath9k_hw_common(ah); -@@ -1490,6 +1534,8 @@ int ath9k_init_debug(struct ath_hw *ah) +@@ -1549,6 +1593,8 @@ int ath9k_init_debug(struct ath_hw *ah) debugfs_create_file("gpio_led", S_IWUSR, sc->debug.debugfs_phy, sc, &fops_gpio_led); #endif @@ -75,16 +75,16 @@ struct ath9k_hw_version { u32 magic; u16 devid; -@@ -805,6 +811,8 @@ struct ath_hw { - u32 rfkill_polarity; +@@ -806,6 +812,8 @@ struct ath_hw { u32 ah_flags; + s16 nf_override; + unsigned long diag; + bool reset_power_on; bool htc_reset_init; -@@ -1067,6 +1075,7 @@ void ath9k_hw_check_nav(struct ath_hw *a +@@ -1068,6 +1076,7 @@ void ath9k_hw_check_nav(struct ath_hw *a bool ath9k_hw_check_alive(struct ath_hw *ah); bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode); diff --git a/package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch b/package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch index 6f7370203b..f9d3251c22 100644 --- a/package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch +++ b/package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch @@ -18,7 +18,7 @@ void (*spectral_scan_trigger)(struct ath_hw *ah); --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c -@@ -1947,6 +1947,26 @@ void ar9003_hw_init_rate_txpower(struct +@@ -1945,6 +1945,26 @@ void ar9003_hw_init_rate_txpower(struct } } @@ -45,7 +45,7 @@ void ar9003_hw_attach_phy_ops(struct ath_hw *ah) { struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah); -@@ -1983,6 +2003,7 @@ void ar9003_hw_attach_phy_ops(struct ath +@@ -1981,6 +2001,7 @@ void ar9003_hw_attach_phy_ops(struct ath priv_ops->set_radar_params = ar9003_hw_set_radar_params; priv_ops->fast_chan_change = ar9003_hw_fast_chan_change; @@ -65,8 +65,8 @@ } static const struct ieee80211_iface_limit if_limits[] = { -@@ -958,6 +959,18 @@ static void ath9k_set_hw_capab(struct at - SET_IEEE80211_PERM_ADDR(hw, common->macaddr); +@@ -960,6 +961,18 @@ static void ath9k_set_hw_capab(struct at + wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); } +static void ath_get_initial_entropy(struct ath_softc *sc) @@ -84,7 +84,7 @@ int ath9k_init_device(u16 devid, struct ath_softc *sc, const struct ath_bus_ops *bus_ops) { -@@ -1003,6 +1016,8 @@ int ath9k_init_device(u16 devid, struct +@@ -1005,6 +1018,8 @@ int ath9k_init_device(u16 devid, struct ARRAY_SIZE(ath9k_tpt_blink)); #endif diff --git a/package/kernel/mac80211/patches/546-ath9k_platform_led_name.patch b/package/kernel/mac80211/patches/546-ath9k_platform_led_name.patch deleted file mode 100644 index ced72c6c69..0000000000 --- a/package/kernel/mac80211/patches/546-ath9k_platform_led_name.patch +++ /dev/null @@ -1,39 +0,0 @@ -From: Michal Cieslakiewicz -Date: Sun, 31 Jan 2016 20:45:57 +0100 -Subject: [PATCH v4 1/8] mac80211: ath9k: enable platform WLAN LED name - -Enable platform-supplied WLAN LED name for ath9k device. It replaces generic -'ath9k-phy*' label with string set during platform initialization. - -Signed-off-by: Michal Cieslakiewicz ---- - drivers/net/wireless/ath/ath9k/gpio.c | 10 +++++++--- - include/linux/ath9k_platform.h | 1 + - 2 files changed, 8 insertions(+), 3 deletions(-) - ---- a/drivers/net/wireless/ath/ath9k/gpio.c -+++ b/drivers/net/wireless/ath/ath9k/gpio.c -@@ -155,8 +155,11 @@ void ath_init_leds(struct ath_softc *sc) - - ath_fill_led_pin(sc); - -- snprintf(led_name, sizeof(led_name), "ath9k-%s", -- wiphy_name(sc->hw->wiphy)); -+ if (pdata && pdata->led_name) -+ strncpy(led_name, pdata->led_name, sizeof(led_name)); -+ else -+ snprintf(led_name, sizeof(led_name), "ath9k-%s", -+ wiphy_name(sc->hw->wiphy)); - - if (ath9k_led_blink) - trigger = sc->led_default_trigger; ---- a/include/linux/ath9k_platform.h -+++ b/include/linux/ath9k_platform.h -@@ -49,6 +49,7 @@ struct ath9k_platform_data { - - int num_leds; - const struct gpio_led *leds; -+ const char *led_name; - }; - - #endif /* _LINUX_ATH9K_PLATFORM_H */ diff --git a/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch b/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch index d4269282d9..31dac29ad7 100644 --- a/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch +++ b/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch @@ -196,7 +196,7 @@ Signed-off-by: Felix Fietkau return 0; } -@@ -136,12 +264,18 @@ void ath_deinit_leds(struct ath_softc *s +@@ -136,17 +264,24 @@ void ath_deinit_leds(struct ath_softc *s while (!list_empty(&sc->leds)) { led = list_first_entry(&sc->leds, struct ath_led, list); @@ -215,18 +215,31 @@ Signed-off-by: Felix Fietkau } void ath_init_leds(struct ath_softc *sc) -@@ -158,6 +292,8 @@ void ath_init_leds(struct ath_softc *sc) + { + struct ath9k_platform_data *pdata = sc->dev->platform_data; ++ struct device_node *np = sc->dev->of_node; + char led_name[32]; + const char *trigger; + int i; +@@ -156,6 +291,15 @@ void ath_init_leds(struct ath_softc *sc) + if (AR_SREV_9100(sc->sc_ah)) + return; ++ if (!np) ++ ath9k_register_gpio_chip(sc); ++ ++ /* setup gpio controller only if requested and skip the led_pin setup */ ++ if (of_property_read_bool(np, "gpio-controller")) { ++ ath9k_register_gpio_chip(sc); ++ return; ++ } ++ ath_fill_led_pin(sc); -+ ath9k_register_gpio_chip(sc); -+ - if (pdata && pdata->led_name) - strncpy(led_name, pdata->led_name, sizeof(led_name)); - else -@@ -178,6 +314,7 @@ void ath_init_leds(struct ath_softc *sc) - for (i = 0; i < pdata->num_leds; i++) - ath_create_platform_led(sc, &pdata->leds[i]); + if (pdata && pdata->leds && pdata->num_leds) +@@ -180,6 +324,7 @@ void ath_init_leds(struct ath_softc *sc) + ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger, + !sc->sc_ah->config.led_active_high); } + #endif diff --git a/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch b/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch index f40bac93c3..f3fead0a1a 100644 --- a/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch +++ b/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch @@ -117,29 +117,20 @@ Signed-off-by: Felix Fietkau while (!list_empty(&sc->leds)) { led = list_first_entry(&sc->leds, struct ath_led, list); #ifdef CONFIG_GPIOLIB -@@ -293,6 +362,7 @@ void ath_init_leds(struct ath_softc *sc) - ath_fill_led_pin(sc); +@@ -301,6 +370,7 @@ void ath_init_leds(struct ath_softc *sc) + } - ath9k_register_gpio_chip(sc); + ath_fill_led_pin(sc); + ath9k_init_buttons(sc); - if (pdata && pdata->led_name) - strncpy(led_name, pdata->led_name, sizeof(led_name)); -@@ -308,7 +378,7 @@ void ath_init_leds(struct ath_softc *sc) - ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger, - !sc->sc_ah->config.led_active_high); - -- if (!pdata) -+ if (!pdata || !pdata->leds || !pdata->num_leds) - return; - - for (i = 0; i < pdata->num_leds; i++) + if (pdata && pdata->leds && pdata->num_leds) + for (i = 0; i < pdata->num_leds; i++) { --- a/include/linux/ath9k_platform.h +++ b/include/linux/ath9k_platform.h -@@ -50,6 +50,10 @@ struct ath9k_platform_data { +@@ -49,6 +49,10 @@ struct ath9k_platform_data { + int num_leds; const struct gpio_led *leds; - const char *led_name; + + unsigned num_btns; + const struct gpio_keys_button *btns; diff --git a/package/kernel/mac80211/patches/551-ath9k_ubnt_uap_plus_hsr.patch b/package/kernel/mac80211/patches/551-ath9k_ubnt_uap_plus_hsr.patch index 45284c71ee..6d541d6a57 100644 --- a/package/kernel/mac80211/patches/551-ath9k_ubnt_uap_plus_hsr.patch +++ b/package/kernel/mac80211/patches/551-ath9k_ubnt_uap_plus_hsr.patch @@ -375,7 +375,7 @@ --- a/include/linux/ath9k_platform.h +++ b/include/linux/ath9k_platform.h -@@ -54,6 +54,8 @@ struct ath9k_platform_data { +@@ -53,6 +53,8 @@ struct ath9k_platform_data { unsigned num_btns; const struct gpio_keys_button *btns; unsigned btn_poll_interval; @@ -384,9 +384,9 @@ }; #endif /* _LINUX_ATH9K_PLATFORM_H */ ---- a/.local-symbols -+++ b/.local-symbols -@@ -157,6 +157,7 @@ ATH9K_WOW= +--- a/local-symbols ++++ b/local-symbols +@@ -109,6 +109,7 @@ ATH9K_WOW= ATH9K_RFKILL= ATH9K_CHANNEL_CONTEXT= ATH9K_PCOEM= diff --git a/package/kernel/mac80211/patches/600-02-rt2x00-rt2800lib-enable-support-for-RT3883.patch b/package/kernel/mac80211/patches/600-02-rt2x00-rt2800lib-enable-support-for-RT3883.patch index 2325f37670..5127c5cfe4 100644 --- a/package/kernel/mac80211/patches/600-02-rt2x00-rt2800lib-enable-support-for-RT3883.patch +++ b/package/kernel/mac80211/patches/600-02-rt2x00-rt2800lib-enable-support-for-RT3883.patch @@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -9379,6 +9379,7 @@ static int rt2800_probe_rt(struct rt2x00 +@@ -9403,6 +9403,7 @@ static int rt2800_probe_rt(struct rt2x00 case RT3390: case RT3572: case RT3593: diff --git a/package/kernel/mac80211/patches/600-03-rt2x00-rt2800lib-add-rf_vals-for-RF3853.patch b/package/kernel/mac80211/patches/600-03-rt2x00-rt2800lib-add-rf_vals-for-RF3853.patch index 9775664deb..60e57c1bae 100644 --- a/package/kernel/mac80211/patches/600-03-rt2x00-rt2800lib-add-rf_vals-for-RF3853.patch +++ b/package/kernel/mac80211/patches/600-03-rt2x00-rt2800lib-add-rf_vals-for-RF3853.patch @@ -31,7 +31,7 @@ Signed-off-by: Gabor Juhos #define RF5362 0x5362 --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -8957,6 +8957,66 @@ static const struct rf_channel rf_vals_3 +@@ -8981,6 +8981,66 @@ static const struct rf_channel rf_vals_3 {14, 0xF0, 2, 0x18}, }; @@ -98,7 +98,7 @@ Signed-off-by: Gabor Juhos static const struct rf_channel rf_vals_5592_xtal20[] = { /* Channel, N, K, mod, R */ {1, 482, 4, 10, 3}, -@@ -9220,6 +9280,11 @@ static int rt2800_probe_hw_mode(struct r +@@ -9244,6 +9304,11 @@ static int rt2800_probe_hw_mode(struct r spec->channels = rf_vals_3x; break; @@ -108,5 +108,5 @@ Signed-off-by: Gabor Juhos + break; + case RF5592: - rt2800_register_read(rt2x00dev, MAC_DEBUG_INDEX, ®); + reg = rt2800_register_read(rt2x00dev, MAC_DEBUG_INDEX); if (rt2x00_get_field32(reg, MAC_DEBUG_INDEX_XTAL)) { diff --git a/package/kernel/mac80211/patches/600-04-rt2x00-rt2800lib-enable-VCO-calibration-for-RF3853.patch b/package/kernel/mac80211/patches/600-04-rt2x00-rt2800lib-enable-VCO-calibration-for-RF3853.patch index 5737e015c1..def2c397fd 100644 --- a/package/kernel/mac80211/patches/600-04-rt2x00-rt2800lib-enable-VCO-calibration-for-RF3853.patch +++ b/package/kernel/mac80211/patches/600-04-rt2x00-rt2800lib-enable-VCO-calibration-for-RF3853.patch @@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -4855,6 +4855,7 @@ void rt2800_vco_calibration(struct rt2x0 +@@ -4881,6 +4881,7 @@ void rt2800_vco_calibration(struct rt2x0 case RF3053: case RF3070: case RF3290: @@ -18,7 +18,7 @@ Signed-off-by: Gabor Juhos case RF5350: case RF5360: case RF5362: -@@ -9402,6 +9403,7 @@ static int rt2800_probe_hw_mode(struct r +@@ -9426,6 +9427,7 @@ static int rt2800_probe_hw_mode(struct r case RF3053: case RF3070: case RF3290: diff --git a/package/kernel/mac80211/patches/600-05-rt2x00-rt2800lib-add-channel-configuration-function-.patch b/package/kernel/mac80211/patches/600-05-rt2x00-rt2800lib-add-channel-configuration-function-.patch index afcb6bdf4a..1d6e312037 100644 --- a/package/kernel/mac80211/patches/600-05-rt2x00-rt2800lib-add-channel-configuration-function-.patch +++ b/package/kernel/mac80211/patches/600-05-rt2x00-rt2800lib-add-channel-configuration-function-.patch @@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -2709,6 +2709,211 @@ static void rt2800_config_channel_rf3053 +@@ -2713,6 +2713,211 @@ static void rt2800_config_channel_rf3053 } } @@ -50,7 +50,7 @@ Signed-off-by: Gabor Juhos + + rt2800_rfcsr_write(rt2x00dev, 13, 0x12); + -+ rt2800_rfcsr_read(rt2x00dev, 1, &rfcsr); ++ rfcsr = rt2800_rfcsr_read(rt2x00dev, 1); + rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 0); + rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 0); + rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 0); @@ -87,7 +87,7 @@ Signed-off-by: Gabor Juhos + + rt2800_freq_cal_mode1(rt2x00dev); + -+ rt2800_rfcsr_read(rt2x00dev, 30, &rfcsr); ++ rfcsr = rt2800_rfcsr_read(rt2x00dev, 30); + if (!conf_is_ht40(conf)) + rfcsr &= ~(0x06); + else @@ -110,7 +110,7 @@ Signed-off-by: Gabor Juhos + rt2800_rfcsr_write(rt2x00dev, 34, 0x20); + + /* loopback RF_BS */ -+ rt2800_rfcsr_read(rt2x00dev, 36, &rfcsr); ++ rfcsr = rt2800_rfcsr_read(rt2x00dev, 36); + if (rf->channel <= 14) + rt2x00_set_field8(&rfcsr, RFCSR36_RF_BS, 1); + else @@ -158,13 +158,13 @@ Signed-off-by: Gabor Juhos + + rt2800_rfcsr_write(rt2x00dev, 50, 0x86); + -+ rt2800_rfcsr_read(rt2x00dev, 51, &rfcsr); ++ rfcsr = rt2800_rfcsr_read(rt2x00dev, 51); + if (rf->channel <= 14) + rt2800_rfcsr_write(rt2x00dev, 51, 0x75); + else + rt2800_rfcsr_write(rt2x00dev, 51, 0x51); + -+ rt2800_rfcsr_read(rt2x00dev, 52, &rfcsr); ++ rfcsr = rt2800_rfcsr_read(rt2x00dev, 52); + if (rf->channel <= 14) + rt2800_rfcsr_write(rt2x00dev, 52, 0x45); + else @@ -194,25 +194,25 @@ Signed-off-by: Gabor Juhos + ((info->default_power2 & 0xe0) >> 1); + rt2800_bbp_write(rt2x00dev, 109, bbp); + -+ rt2800_bbp_read(rt2x00dev, 110, &bbp); ++ bbp = rt2800_bbp_read(rt2x00dev, 110); + bbp &= 0x0f; + bbp |= (info->default_power3 & 0xe0) >> 1; + rt2800_bbp_write(rt2x00dev, 110, bbp); + -+ rt2800_rfcsr_read(rt2x00dev, 57, &rfcsr); ++ rfcsr = rt2800_rfcsr_read(rt2x00dev, 57); + if (rf->channel <= 14) + rt2800_rfcsr_write(rt2x00dev, 57, 0x6e); + else + rt2800_rfcsr_write(rt2x00dev, 57, 0x3e); + + /* Enable RF tuning */ -+ rt2800_rfcsr_read(rt2x00dev, 3, &rfcsr); ++ rfcsr = rt2800_rfcsr_read(rt2x00dev, 3); + rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1); + rt2800_rfcsr_write(rt2x00dev, 3, rfcsr); + + udelay(2000); + -+ rt2800_bbp_read(rt2x00dev, 49, &bbp); ++ bbp = rt2800_bbp_read(rt2x00dev, 49); + /* clear update flag */ + rt2800_bbp_write(rt2x00dev, 49, bbp & 0xfe); + rt2800_bbp_write(rt2x00dev, 49, bbp); @@ -223,7 +223,7 @@ Signed-off-by: Gabor Juhos #define POWER_BOUND 0x27 #define POWER_BOUND_5G 0x2b -@@ -3565,6 +3770,9 @@ static void rt2800_config_channel(struct +@@ -3570,6 +3775,9 @@ static void rt2800_config_channel(struct case RF3322: rt2800_config_channel_rf3322(rt2x00dev, conf, rf, info); break; diff --git a/package/kernel/mac80211/patches/600-06-rt2x00-rt2800lib-enable-RF3853-support.patch b/package/kernel/mac80211/patches/600-06-rt2x00-rt2800lib-enable-RF3853-support.patch index 9579016595..6476dc107b 100644 --- a/package/kernel/mac80211/patches/600-06-rt2x00-rt2800lib-enable-RF3853-support.patch +++ b/package/kernel/mac80211/patches/600-06-rt2x00-rt2800lib-enable-RF3853-support.patch @@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -8882,6 +8882,7 @@ static int rt2800_init_eeprom(struct rt2 +@@ -8906,6 +8906,7 @@ static int rt2800_init_eeprom(struct rt2 case RF3290: case RF3320: case RF3322: diff --git a/package/kernel/mac80211/patches/600-07-rt2x00-rt2800lib-add-MAC-register-initialization-for.patch b/package/kernel/mac80211/patches/600-07-rt2x00-rt2800lib-add-MAC-register-initialization-for.patch index 08b54f6726..0a931e2026 100644 --- a/package/kernel/mac80211/patches/600-07-rt2x00-rt2800lib-add-MAC-register-initialization-for.patch +++ b/package/kernel/mac80211/patches/600-07-rt2x00-rt2800lib-add-MAC-register-initialization-for.patch @@ -35,7 +35,7 @@ Signed-off-by: Gabor Juhos #define RX_FILTER_CFG 0x1400 --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -5485,6 +5485,12 @@ static int rt2800_init_registers(struct +@@ -5509,6 +5509,12 @@ static int rt2800_init_registers(struct rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000); } @@ -48,7 +48,7 @@ Signed-off-by: Gabor Juhos } else if (rt2x00_rt(rt2x00dev, RT5390) || rt2x00_rt(rt2x00dev, RT5392) || rt2x00_rt(rt2x00dev, RT6352)) { -@@ -5698,6 +5704,11 @@ static int rt2800_init_registers(struct +@@ -5722,6 +5728,11 @@ static int rt2800_init_registers(struct reg = rt2x00_rt(rt2x00dev, RT5592) ? 0x00000082 : 0x00000002; rt2800_register_write(rt2x00dev, TXOP_HLDR_ET, reg); @@ -57,6 +57,6 @@ Signed-off-by: Gabor Juhos + rt2800_register_write(rt2x00dev, TX_FBK_CFG_3S_1, 0x16151413); + } + - rt2800_register_read(rt2x00dev, TX_RTS_CFG, ®); + reg = rt2800_register_read(rt2x00dev, TX_RTS_CFG); rt2x00_set_field32(®, TX_RTS_CFG_AUTO_RTS_RETRY_LIMIT, 7); rt2x00_set_field32(®, TX_RTS_CFG_RTS_THRES, diff --git a/package/kernel/mac80211/patches/600-09-rt2x00-rt2800lib-add-BBP-register-initialization-for.patch b/package/kernel/mac80211/patches/600-09-rt2x00-rt2800lib-add-BBP-register-initialization-for.patch index ced3645aef..99f57bcd33 100644 --- a/package/kernel/mac80211/patches/600-09-rt2x00-rt2800lib-add-BBP-register-initialization-for.patch +++ b/package/kernel/mac80211/patches/600-09-rt2x00-rt2800lib-add-BBP-register-initialization-for.patch @@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -6325,6 +6325,47 @@ static void rt2800_init_bbp_3593(struct +@@ -6349,6 +6349,47 @@ static void rt2800_init_bbp_3593(struct rt2800_bbp_write(rt2x00dev, 103, 0xc0); } @@ -59,7 +59,7 @@ Signed-off-by: Gabor Juhos static void rt2800_init_bbp_53xx(struct rt2x00_dev *rt2x00dev) { int ant, div_mode; -@@ -6769,6 +6810,9 @@ static void rt2800_init_bbp(struct rt2x0 +@@ -6792,6 +6833,9 @@ static void rt2800_init_bbp(struct rt2x0 case RT3593: rt2800_init_bbp_3593(rt2x00dev); return; diff --git a/package/kernel/mac80211/patches/600-10-rt2x00-rt2800lib-add-RFCSR-initialization-for-RT3883.patch b/package/kernel/mac80211/patches/600-10-rt2x00-rt2800lib-add-RFCSR-initialization-for-RT3883.patch index 08e4ffe9ba..c0f1f5863b 100644 --- a/package/kernel/mac80211/patches/600-10-rt2x00-rt2800lib-add-RFCSR-initialization-for-RT3883.patch +++ b/package/kernel/mac80211/patches/600-10-rt2x00-rt2800lib-add-RFCSR-initialization-for-RT3883.patch @@ -21,7 +21,7 @@ Signed-off-by: Gabor Juhos #define RFCSR2_TX2_EN_MT7620 FIELD8(0x20) --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -7685,6 +7685,144 @@ static void rt2800_init_rfcsr_5350(struc +@@ -7707,6 +7707,144 @@ static void rt2800_init_rfcsr_5350(struc rt2800_rfcsr_write(rt2x00dev, 63, 0x00); } @@ -134,7 +134,7 @@ Signed-off-by: Gabor Juhos + rt2800_rfcsr_write(rt2x00dev, 33, 0x32); + } + -+ rt2800_rfcsr_read(rt2x00dev, 2, &rfcsr); ++ rfcsr = rt2800_rfcsr_read(rt2x00dev, 2); + rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_BP, 0); + rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_EN, 1); + rt2800_rfcsr_write(rt2x00dev, 2, rfcsr); @@ -142,23 +142,23 @@ Signed-off-by: Gabor Juhos + rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_EN, 0); + rt2800_rfcsr_write(rt2x00dev, 2, rfcsr); + -+ rt2800_rfcsr_read(rt2x00dev, 1, &rfcsr); ++ rfcsr = rt2800_rfcsr_read(rt2x00dev, 1); + rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1); + rt2800_rfcsr_write(rt2x00dev, 1, rfcsr); + -+ rt2800_rfcsr_read(rt2x00dev, 6, &rfcsr); ++ rfcsr = rt2800_rfcsr_read(rt2x00dev, 6); + rfcsr |= 0xc0; + rt2800_rfcsr_write(rt2x00dev, 6, rfcsr); + -+ rt2800_rfcsr_read(rt2x00dev, 22, &rfcsr); ++ rfcsr = rt2800_rfcsr_read(rt2x00dev, 22); + rfcsr |= 0x20; + rt2800_rfcsr_write(rt2x00dev, 22, rfcsr); + -+ rt2800_rfcsr_read(rt2x00dev, 46, &rfcsr); ++ rfcsr = rt2800_rfcsr_read(rt2x00dev, 46); + rfcsr |= 0x20; + rt2800_rfcsr_write(rt2x00dev, 46, rfcsr); + -+ rt2800_rfcsr_read(rt2x00dev, 20, &rfcsr); ++ rfcsr = rt2800_rfcsr_read(rt2x00dev, 20); + rfcsr &= ~0xee; + rt2800_rfcsr_write(rt2x00dev, 20, rfcsr); +} @@ -166,7 +166,7 @@ Signed-off-by: Gabor Juhos static void rt2800_init_rfcsr_5390(struct rt2x00_dev *rt2x00dev) { rt2800_rf_init_calibration(rt2x00dev, 2); -@@ -8525,6 +8663,9 @@ static void rt2800_init_rfcsr(struct rt2 +@@ -8549,6 +8687,9 @@ static void rt2800_init_rfcsr(struct rt2 case RT3390: rt2800_init_rfcsr_3390(rt2x00dev); break; diff --git a/package/kernel/mac80211/patches/600-11-rt2x00-rt2800lib-use-the-extended-EEPROM-map-for-RT3.patch b/package/kernel/mac80211/patches/600-11-rt2x00-rt2800lib-use-the-extended-EEPROM-map-for-RT3.patch index 0e9496c056..e74f399e65 100644 --- a/package/kernel/mac80211/patches/600-11-rt2x00-rt2800lib-use-the-extended-EEPROM-map-for-RT3.patch +++ b/package/kernel/mac80211/patches/600-11-rt2x00-rt2800lib-use-the-extended-EEPROM-map-for-RT3.patch @@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -376,7 +376,8 @@ static unsigned int rt2800_eeprom_word_i +@@ -381,7 +381,8 @@ static unsigned int rt2800_eeprom_word_i wiphy_name(rt2x00dev->hw->wiphy), word)) return 0; diff --git a/package/kernel/mac80211/patches/600-12-rt2x00-rt2800lib-force-rf-type-to-RF3853-on-RT3883.patch b/package/kernel/mac80211/patches/600-12-rt2x00-rt2800lib-force-rf-type-to-RF3853-on-RT3883.patch index c03527b4f7..2e917c8ebf 100644 --- a/package/kernel/mac80211/patches/600-12-rt2x00-rt2800lib-force-rf-type-to-RF3853-on-RT3883.patch +++ b/package/kernel/mac80211/patches/600-12-rt2x00-rt2800lib-force-rf-type-to-RF3853-on-RT3883.patch @@ -10,8 +10,8 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -9059,6 +9059,8 @@ static int rt2800_init_eeprom(struct rt2 - rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf); +@@ -9083,6 +9083,8 @@ static int rt2800_init_eeprom(struct rt2 + rf = rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID); else if (rt2x00_rt(rt2x00dev, RT3352)) rf = RF3322; + else if (rt2x00_rt(rt2x00dev, RT3883)) diff --git a/package/kernel/mac80211/patches/600-13-rt2x00-rt2800lib-add-channel-configuration-code-for-.patch b/package/kernel/mac80211/patches/600-13-rt2x00-rt2800lib-add-channel-configuration-code-for-.patch index 04574db7c1..0bb2d33577 100644 --- a/package/kernel/mac80211/patches/600-13-rt2x00-rt2800lib-add-channel-configuration-code-for-.patch +++ b/package/kernel/mac80211/patches/600-13-rt2x00-rt2800lib-add-channel-configuration-code-for-.patch @@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -3733,6 +3733,36 @@ static char rt2800_txpower_to_dev(struct +@@ -3738,6 +3738,36 @@ static char rt2800_txpower_to_dev(struct return clamp_t(char, txpower, MIN_A_TXPOWER, MAX_A_TXPOWER); } @@ -47,7 +47,7 @@ Signed-off-by: Gabor Juhos static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, struct ieee80211_conf *conf, struct rf_channel *rf, -@@ -3751,6 +3781,12 @@ static void rt2800_config_channel(struct +@@ -3756,6 +3786,12 @@ static void rt2800_config_channel(struct rt2800_txpower_to_dev(rt2x00dev, rf->channel, info->default_power3); @@ -60,7 +60,7 @@ Signed-off-by: Gabor Juhos switch (rt2x00dev->chip.rf) { case RF2020: case RF3020: -@@ -3855,6 +3891,15 @@ static void rt2800_config_channel(struct +@@ -3860,6 +3896,15 @@ static void rt2800_config_channel(struct rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain); rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain); rt2800_bbp_write(rt2x00dev, 77, 0x98); @@ -76,7 +76,7 @@ Signed-off-by: Gabor Juhos } else { rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain); rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain); -@@ -3868,6 +3913,7 @@ static void rt2800_config_channel(struct +@@ -3873,6 +3918,7 @@ static void rt2800_config_channel(struct !rt2x00_rt(rt2x00dev, RT6352)) { if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) { rt2800_bbp_write(rt2x00dev, 82, 0x62); @@ -84,7 +84,7 @@ Signed-off-by: Gabor Juhos rt2800_bbp_write(rt2x00dev, 75, 0x46); } else { if (rt2x00_rt(rt2x00dev, RT3593)) -@@ -3876,19 +3922,22 @@ static void rt2800_config_channel(struct +@@ -3881,19 +3927,22 @@ static void rt2800_config_channel(struct rt2800_bbp_write(rt2x00dev, 82, 0x84); rt2800_bbp_write(rt2x00dev, 75, 0x50); } @@ -110,7 +110,7 @@ Signed-off-by: Gabor Juhos rt2800_bbp_write(rt2x00dev, 83, 0x9a); if (rt2x00_has_cap_external_lna_a(rt2x00dev)) -@@ -4011,6 +4060,23 @@ static void rt2800_config_channel(struct +@@ -4019,6 +4068,23 @@ static void rt2800_config_channel(struct rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg); diff --git a/package/kernel/mac80211/patches/600-14-rt2x00-rt2800lib-fix-txpower_to_dev-function-for-RT3.patch b/package/kernel/mac80211/patches/600-14-rt2x00-rt2800lib-fix-txpower_to_dev-function-for-RT3.patch index 3412a3e133..56157510eb 100644 --- a/package/kernel/mac80211/patches/600-14-rt2x00-rt2800lib-fix-txpower_to_dev-function-for-RT3.patch +++ b/package/kernel/mac80211/patches/600-14-rt2x00-rt2800lib-fix-txpower_to_dev-function-for-RT3.patch @@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -3720,13 +3720,15 @@ static char rt2800_txpower_to_dev(struct +@@ -3725,13 +3725,15 @@ static char rt2800_txpower_to_dev(struct unsigned int channel, char txpower) { diff --git a/package/kernel/mac80211/patches/600-15-rt2x00-rt2800lib-use-correct-txpower-calculation-fun.patch b/package/kernel/mac80211/patches/600-15-rt2x00-rt2800lib-use-correct-txpower-calculation-fun.patch index 8d1df8cf77..c1409bcfa3 100644 --- a/package/kernel/mac80211/patches/600-15-rt2x00-rt2800lib-use-correct-txpower-calculation-fun.patch +++ b/package/kernel/mac80211/patches/600-15-rt2x00-rt2800lib-use-correct-txpower-calculation-fun.patch @@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -5085,7 +5085,8 @@ static void rt2800_config_txpower(struct +@@ -5111,7 +5111,8 @@ static void rt2800_config_txpower(struct struct ieee80211_channel *chan, int power_level) { diff --git a/package/kernel/mac80211/patches/600-16-rt2x00-rt2800lib-hardcode-txmixer-gain-values-to-zer.patch b/package/kernel/mac80211/patches/600-16-rt2x00-rt2800lib-hardcode-txmixer-gain-values-to-zer.patch index 9aeb41fe6b..a4ccb28518 100644 --- a/package/kernel/mac80211/patches/600-16-rt2x00-rt2800lib-hardcode-txmixer-gain-values-to-zer.patch +++ b/package/kernel/mac80211/patches/600-16-rt2x00-rt2800lib-hardcode-txmixer-gain-values-to-zer.patch @@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -8941,7 +8941,8 @@ static u8 rt2800_get_txmixer_gain_24g(st +@@ -8965,7 +8965,8 @@ static u8 rt2800_get_txmixer_gain_24g(st { u16 word; @@ -20,8 +20,8 @@ Signed-off-by: Gabor Juhos + rt2x00_rt(rt2x00dev, RT3883)) return 0; - rt2800_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_BG, &word); -@@ -8955,7 +8956,8 @@ static u8 rt2800_get_txmixer_gain_5g(str + word = rt2800_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_BG); +@@ -8979,7 +8980,8 @@ static u8 rt2800_get_txmixer_gain_5g(str { u16 word; @@ -30,4 +30,4 @@ Signed-off-by: Gabor Juhos + rt2x00_rt(rt2x00dev, RT3883)) return 0; - rt2800_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_A, &word); + word = rt2800_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_A); diff --git a/package/kernel/mac80211/patches/600-17-rt2x00-rt2800lib-use-correct-RT-XWI-size-for-RT3883.patch b/package/kernel/mac80211/patches/600-17-rt2x00-rt2800lib-use-correct-RT-XWI-size-for-RT3883.patch index 9d12c76255..197aabd7bc 100644 --- a/package/kernel/mac80211/patches/600-17-rt2x00-rt2800lib-use-correct-RT-XWI-size-for-RT3883.patch +++ b/package/kernel/mac80211/patches/600-17-rt2x00-rt2800lib-use-correct-RT-XWI-size-for-RT3883.patch @@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -587,6 +587,7 @@ void rt2800_get_txwi_rxwi_size(struct rt +@@ -591,6 +591,7 @@ void rt2800_get_txwi_rxwi_size(struct rt { switch (rt2x00dev->chip.rt) { case RT3593: diff --git a/package/kernel/mac80211/patches/600-18-rt2x00-rt2800lib-fix-antenna-configuration-for-RT388.patch b/package/kernel/mac80211/patches/600-18-rt2x00-rt2800lib-fix-antenna-configuration-for-RT388.patch index cd212f9d8d..24c0ef91b0 100644 --- a/package/kernel/mac80211/patches/600-18-rt2x00-rt2800lib-fix-antenna-configuration-for-RT388.patch +++ b/package/kernel/mac80211/patches/600-18-rt2x00-rt2800lib-fix-antenna-configuration-for-RT388.patch @@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -2013,7 +2013,8 @@ void rt2800_config_ant(struct rt2x00_dev +@@ -2017,7 +2017,8 @@ void rt2800_config_ant(struct rt2x00_dev rt2800_bbp_write(rt2x00dev, 3, r3); rt2800_bbp_write(rt2x00dev, 1, r1); diff --git a/package/kernel/mac80211/patches/600-19-rt2x00-rt2800lib-fix-LNA-gain-configuration-for-RT38.patch b/package/kernel/mac80211/patches/600-19-rt2x00-rt2800lib-fix-LNA-gain-configuration-for-RT38.patch index 30ea12a5cd..52733ffeb9 100644 --- a/package/kernel/mac80211/patches/600-19-rt2x00-rt2800lib-fix-LNA-gain-configuration-for-RT38.patch +++ b/package/kernel/mac80211/patches/600-19-rt2x00-rt2800lib-fix-LNA-gain-configuration-for-RT38.patch @@ -10,23 +10,23 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -2036,7 +2036,8 @@ static void rt2800_config_lna_gain(struc - rt2800_eeprom_read(rt2x00dev, EEPROM_LNA, &eeprom); +@@ -2040,7 +2040,8 @@ static void rt2800_config_lna_gain(struc + eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_LNA); lna_gain = rt2x00_get_field16(eeprom, EEPROM_LNA_A0); } else if (libconf->rf.channel <= 128) { - if (rt2x00_rt(rt2x00dev, RT3593)) { + if (rt2x00_rt(rt2x00dev, RT3593) || + rt2x00_rt(rt2x00dev, RT3883)) { - rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2, &eeprom); + eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2); lna_gain = rt2x00_get_field16(eeprom, EEPROM_EXT_LNA2_A1); -@@ -2046,7 +2047,8 @@ static void rt2800_config_lna_gain(struc +@@ -2050,7 +2051,8 @@ static void rt2800_config_lna_gain(struc EEPROM_RSSI_BG2_LNA_A1); } } else { - if (rt2x00_rt(rt2x00dev, RT3593)) { + if (rt2x00_rt(rt2x00dev, RT3593) || + rt2x00_rt(rt2x00dev, RT3883)) { - rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2, &eeprom); + eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2); lna_gain = rt2x00_get_field16(eeprom, EEPROM_EXT_LNA2_A2); diff --git a/package/kernel/mac80211/patches/600-20-rt2x00-rt2800lib-fix-VGC-setup-for-RT3883.patch b/package/kernel/mac80211/patches/600-20-rt2x00-rt2800lib-fix-VGC-setup-for-RT3883.patch index 70c33a1d20..301928d283 100644 --- a/package/kernel/mac80211/patches/600-20-rt2x00-rt2800lib-fix-VGC-setup-for-RT3883.patch +++ b/package/kernel/mac80211/patches/600-20-rt2x00-rt2800lib-fix-VGC-setup-for-RT3883.patch @@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -5338,7 +5338,8 @@ static u8 rt2800_get_default_vgc(struct +@@ -5364,7 +5364,8 @@ static u8 rt2800_get_default_vgc(struct else vgc = 0x2e + rt2x00dev->lna_gain; } else { /* 5GHZ band */ @@ -20,7 +20,7 @@ Signed-off-by: Gabor Juhos vgc = 0x20 + (rt2x00dev->lna_gain * 5) / 3; else if (rt2x00_rt(rt2x00dev, RT5592)) vgc = 0x24 + (2 * rt2x00dev->lna_gain); -@@ -5358,7 +5359,8 @@ static inline void rt2800_set_vgc(struct +@@ -5384,7 +5385,8 @@ static inline void rt2800_set_vgc(struct { if (qual->vgc_level != vgc_level) { if (rt2x00_rt(rt2x00dev, RT3572) || @@ -30,7 +30,7 @@ Signed-off-by: Gabor Juhos rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, vgc_level); } else if (rt2x00_rt(rt2x00dev, RT5592)) { -@@ -5405,6 +5407,11 @@ void rt2800_link_tuner(struct rt2x00_dev +@@ -5431,6 +5433,11 @@ void rt2800_link_tuner(struct rt2x00_dev } break; diff --git a/package/kernel/mac80211/patches/600-21-rt2x00-rt2800lib-fix-EEPROM-LNA-validation-for-RT388.patch b/package/kernel/mac80211/patches/600-21-rt2x00-rt2800lib-fix-EEPROM-LNA-validation-for-RT388.patch index a2cfd896eb..4bbc7ae44e 100644 --- a/package/kernel/mac80211/patches/600-21-rt2x00-rt2800lib-fix-EEPROM-LNA-validation-for-RT388.patch +++ b/package/kernel/mac80211/patches/600-21-rt2x00-rt2800lib-fix-EEPROM-LNA-validation-for-RT388.patch @@ -10,8 +10,8 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -9074,7 +9074,8 @@ static int rt2800_validate_eeprom(struct - rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2, &word); +@@ -9098,7 +9098,8 @@ static int rt2800_validate_eeprom(struct + word = rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2); if (abs(rt2x00_get_field16(word, EEPROM_RSSI_BG2_OFFSET2)) > 10) rt2x00_set_field16(&word, EEPROM_RSSI_BG2_OFFSET2, 0); - if (!rt2x00_rt(rt2x00dev, RT3593)) { @@ -20,8 +20,8 @@ Signed-off-by: Gabor Juhos if (rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0x00 || rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0xff) rt2x00_set_field16(&word, EEPROM_RSSI_BG2_LNA_A1, -@@ -9094,7 +9095,8 @@ static int rt2800_validate_eeprom(struct - rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A2, &word); +@@ -9118,7 +9119,8 @@ static int rt2800_validate_eeprom(struct + word = rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A2); if (abs(rt2x00_get_field16(word, EEPROM_RSSI_A2_OFFSET2)) > 10) rt2x00_set_field16(&word, EEPROM_RSSI_A2_OFFSET2, 0); - if (!rt2x00_rt(rt2x00dev, RT3593)) { @@ -30,13 +30,13 @@ Signed-off-by: Gabor Juhos if (rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0x00 || rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0xff) rt2x00_set_field16(&word, EEPROM_RSSI_A2_LNA_A2, -@@ -9102,7 +9104,8 @@ static int rt2800_validate_eeprom(struct +@@ -9126,7 +9128,8 @@ static int rt2800_validate_eeprom(struct } rt2800_eeprom_write(rt2x00dev, EEPROM_RSSI_A2, word); - if (rt2x00_rt(rt2x00dev, RT3593)) { + if (rt2x00_rt(rt2x00dev, RT3593) || + rt2x00_rt(rt2x00dev, RT3883)) { - rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2, &word); + word = rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2); if (rt2x00_get_field16(word, EEPROM_EXT_LNA2_A1) == 0x00 || rt2x00_get_field16(word, EEPROM_EXT_LNA2_A1) == 0xff) diff --git a/package/kernel/mac80211/patches/600-22-rt2x00-rt2800lib-fix-txpower-compensation-for-RT3883.patch b/package/kernel/mac80211/patches/600-22-rt2x00-rt2800lib-fix-txpower-compensation-for-RT3883.patch index ac8b219efd..e752efd0ea 100644 --- a/package/kernel/mac80211/patches/600-22-rt2x00-rt2800lib-fix-txpower-compensation-for-RT3883.patch +++ b/package/kernel/mac80211/patches/600-22-rt2x00-rt2800lib-fix-txpower-compensation-for-RT3883.patch @@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -4332,6 +4332,9 @@ static u8 rt2800_compensate_txpower(stru +@@ -4354,6 +4354,9 @@ static u8 rt2800_compensate_txpower(stru if (rt2x00_rt(rt2x00dev, RT3593)) return min_t(u8, txpower, 0xc); diff --git a/package/kernel/mac80211/patches/600-23-rt2x00-rt2800mmio-add-a-workaround-for-spurious-TX_F.patch b/package/kernel/mac80211/patches/600-23-rt2x00-rt2800mmio-add-a-workaround-for-spurious-TX_F.patch index 7d8d2f5e13..342174f8d5 100644 --- a/package/kernel/mac80211/patches/600-23-rt2x00-rt2800mmio-add-a-workaround-for-spurious-TX_F.patch +++ b/package/kernel/mac80211/patches/600-23-rt2x00-rt2800mmio-add-a-workaround-for-spurious-TX_F.patch @@ -12,7 +12,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c -@@ -415,9 +415,9 @@ void rt2800mmio_autowake_tasklet(unsigne +@@ -424,9 +424,9 @@ void rt2800mmio_autowake_tasklet(unsigne } EXPORT_SYMBOL_GPL(rt2800mmio_autowake_tasklet); @@ -24,12 +24,12 @@ Signed-off-by: Gabor Juhos int i; /* -@@ -438,29 +438,77 @@ static void rt2800mmio_txstatus_interrup +@@ -447,29 +447,77 @@ static void rt2800mmio_txstatus_interrup * Since we have only one producer and one consumer we don't * need to lock the kfifo. */ - for (i = 0; i < rt2x00dev->tx->limit; i++) { -- rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO, &status); +- status = rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO); - - if (!rt2x00_get_field32(status, TX_STA_FIFO_VALID)) - break; @@ -47,7 +47,7 @@ Signed-off-by: Gabor Juhos + if (++i >= rt2x00dev->tx->limit) + break; + -+ rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO, &status); ++ status = rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO); + } while (rt2x00_get_field32(status, TX_STA_FIFO_VALID)); /* Schedule the tasklet for processing the tx status. */ @@ -87,7 +87,7 @@ Signed-off-by: Gabor Juhos - /* Read status and ACK all interrupts */ + /* Read status */ - rt2x00mmio_register_read(rt2x00dev, INT_SOURCE_CSR, ®); + reg = rt2x00mmio_register_read(rt2x00dev, INT_SOURCE_CSR); + + if (rt2x00_get_field32(reg, INT_SOURCE_CSR_TX_FIFO_STATUS)) { + /* Due to unknown reason the hardware generates a @@ -96,7 +96,7 @@ Signed-off-by: Gabor Juhos + * here to see if we have to process the actual + * request. + */ -+ rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO, &txstatus); ++ txstatus = rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO); + if (rt2800mmio_txstatus_is_spurious(rt2x00dev, txstatus)) { + /* Remove the TX_FIFO_STATUS bit so it won't be + * processed in this turn. The hardware will @@ -111,7 +111,7 @@ Signed-off-by: Gabor Juhos rt2x00mmio_register_write(rt2x00dev, INT_SOURCE_CSR, reg); if (!reg) -@@ -477,7 +525,7 @@ irqreturn_t rt2800mmio_interrupt(int irq +@@ -486,7 +534,7 @@ irqreturn_t rt2800mmio_interrupt(int irq mask = ~reg; if (rt2x00_get_field32(reg, INT_SOURCE_CSR_TX_FIFO_STATUS)) { diff --git a/package/kernel/mac80211/patches/602-rt2x00-introduce-rt2x00eeprom.patch b/package/kernel/mac80211/patches/602-rt2x00-introduce-rt2x00eeprom.patch index 435cc96fc5..5ad99995c2 100644 --- a/package/kernel/mac80211/patches/602-rt2x00-introduce-rt2x00eeprom.patch +++ b/package/kernel/mac80211/patches/602-rt2x00-introduce-rt2x00eeprom.patch @@ -1,6 +1,6 @@ ---- a/.local-symbols -+++ b/.local-symbols -@@ -336,6 +336,7 @@ RT2X00_LIB_FIRMWARE= +--- a/local-symbols ++++ b/local-symbols +@@ -291,6 +291,7 @@ RT2X00_LIB_FIRMWARE= RT2X00_LIB_CRYPTO= RT2X00_LIB_LEDS= RT2X00_LIB_DEBUGFS= @@ -55,9 +55,9 @@ +#include "rt2800.h" + struct rt2800_ops { - void (*register_read)(struct rt2x00_dev *rt2x00dev, - const unsigned int offset, u32 *value); -@@ -147,6 +149,15 @@ static inline int rt2800_read_eeprom(str + u32 (*register_read)(struct rt2x00_dev *rt2x00dev, + const unsigned int offset); +@@ -145,6 +147,15 @@ static inline int rt2800_read_eeprom(str { const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv; @@ -127,7 +127,7 @@ DECLARE_KFIFO_PTR(txstatus_fifo, u32); --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -@@ -1418,6 +1418,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de +@@ -1421,6 +1421,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de INIT_DELAYED_WORK(&rt2x00dev->autowakeup_work, rt2x00lib_autowakeup); INIT_WORK(&rt2x00dev->sleep_work, rt2x00lib_sleep); @@ -138,7 +138,7 @@ /* * Let the driver probe the device to detect the capabilities. */ -@@ -1556,6 +1560,11 @@ void rt2x00lib_remove_dev(struct rt2x00_ +@@ -1562,6 +1566,11 @@ void rt2x00lib_remove_dev(struct rt2x00_ * Free the driver data. */ kfree(rt2x00dev->drv_data); diff --git a/package/kernel/mac80211/patches/606-rt2x00-allow_disabling_bands_through_platform_data.patch b/package/kernel/mac80211/patches/606-rt2x00-allow_disabling_bands_through_platform_data.patch index c3cd2f4341..202dfc0b89 100644 --- a/package/kernel/mac80211/patches/606-rt2x00-allow_disabling_bands_through_platform_data.patch +++ b/package/kernel/mac80211/patches/606-rt2x00-allow_disabling_bands_through_platform_data.patch @@ -12,7 +12,7 @@ #endif /* _RT2X00_PLATFORM_H */ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -@@ -1023,6 +1023,22 @@ static int rt2x00lib_probe_hw_modes(stru +@@ -1026,6 +1026,22 @@ static int rt2x00lib_probe_hw_modes(stru unsigned int num_rates; unsigned int i; diff --git a/package/kernel/mac80211/patches/607-rt2x00-add_platform_data_mac_addr.patch b/package/kernel/mac80211/patches/607-rt2x00-add_platform_data_mac_addr.patch index bca7be8533..b8b0188040 100644 --- a/package/kernel/mac80211/patches/607-rt2x00-add_platform_data_mac_addr.patch +++ b/package/kernel/mac80211/patches/607-rt2x00-add_platform_data_mac_addr.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -@@ -1001,8 +1001,13 @@ static void rt2x00lib_rate(struct ieee80 +@@ -1004,8 +1004,13 @@ static void rt2x00lib_rate(struct ieee80 void rt2x00lib_set_mac_address(struct rt2x00_dev *rt2x00dev, u8 *eeprom_mac_addr) { diff --git a/package/kernel/mac80211/patches/608-rt2x00-allow_disabling_bands_through_dts.patch b/package/kernel/mac80211/patches/608-rt2x00-allow_disabling_bands_through_dts.patch index 724e626ca9..ca66aa8e3b 100644 --- a/package/kernel/mac80211/patches/608-rt2x00-allow_disabling_bands_through_dts.patch +++ b/package/kernel/mac80211/patches/608-rt2x00-allow_disabling_bands_through_dts.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -@@ -1027,6 +1027,16 @@ static int rt2x00lib_probe_hw_modes(stru +@@ -1030,6 +1030,16 @@ static int rt2x00lib_probe_hw_modes(stru struct ieee80211_rate *rates; unsigned int num_rates; unsigned int i; diff --git a/package/kernel/mac80211/patches/610-rt2x00-change-led-polarity-from-OF.patch b/package/kernel/mac80211/patches/610-rt2x00-change-led-polarity-from-OF.patch index 0236683d5f..ad70aa7826 100644 --- a/package/kernel/mac80211/patches/610-rt2x00-change-led-polarity-from-OF.patch +++ b/package/kernel/mac80211/patches/610-rt2x00-change-led-polarity-from-OF.patch @@ -8,7 +8,7 @@ #include "rt2x00.h" #include "rt2800lib.h" -@@ -9261,6 +9262,17 @@ static int rt2800_init_eeprom(struct rt2 +@@ -9285,6 +9286,17 @@ static int rt2800_init_eeprom(struct rt2 rt2800_init_led(rt2x00dev, &rt2x00dev->led_assoc, LED_TYPE_ASSOC); rt2800_init_led(rt2x00dev, &rt2x00dev->led_qual, LED_TYPE_QUALITY); diff --git a/package/kernel/mac80211/patches/611-rt2x00-add-AP+STA-support.patch b/package/kernel/mac80211/patches/611-rt2x00-add-AP+STA-support.patch index 5ef5fc8def..062b18a63b 100644 --- a/package/kernel/mac80211/patches/611-rt2x00-add-AP+STA-support.patch +++ b/package/kernel/mac80211/patches/611-rt2x00-add-AP+STA-support.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -@@ -1358,7 +1358,7 @@ static inline void rt2x00lib_set_if_comb +@@ -1361,7 +1361,7 @@ static inline void rt2x00lib_set_if_comb */ if_limit = &rt2x00dev->if_limits_ap; if_limit->max = rt2x00dev->ops->max_ap_intf; diff --git a/package/kernel/mac80211/patches/650-rt2x00-add-support-for-external-PA-on-MT7620.patch b/package/kernel/mac80211/patches/650-rt2x00-add-support-for-external-PA-on-MT7620.patch new file mode 100644 index 0000000000..9fad80b672 --- /dev/null +++ b/package/kernel/mac80211/patches/650-rt2x00-add-support-for-external-PA-on-MT7620.patch @@ -0,0 +1,118 @@ +From 9782a7f7488443568fa4d6088b73c9aff7eb8510 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Wed, 19 Apr 2017 16:14:53 +0200 +Subject: [PATCH] rt2x00: add support for external PA on MT7620 +To: Stanislaw Gruszka +Cc: Helmut Schaa , + linux-wireless@vger.kernel.org, + Kalle Valo + +Signed-off-by: Daniel Golle +--- + drivers/net/wireless/ralink/rt2x00/rt2800.h | 1 + + drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 70 +++++++++++++++++++++++++- + 2 files changed, 70 insertions(+), 1 deletion(-) + +--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h ++++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h +@@ -2749,6 +2749,7 @@ enum rt2800_eeprom_word { + #define EEPROM_NIC_CONF2_RX_STREAM FIELD16(0x000f) + #define EEPROM_NIC_CONF2_TX_STREAM FIELD16(0x00f0) + #define EEPROM_NIC_CONF2_CRYSTAL FIELD16(0x0600) ++#define EEPROM_NIC_CONF2_EXTERNAL_PA FIELD16(0xc000) + + /* + * EEPROM LNA +--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +@@ -4120,6 +4120,61 @@ static void rt2800_config_channel(struct + rt2800_iq_calibrate(rt2x00dev, rf->channel); + } + ++ if (rt2x00_rt(rt2x00dev, RT6352)) { ++ if (test_bit(CAPABILITY_EXTERNAL_PA_TX0, ++ &rt2x00dev->cap_flags)) { ++ rt2x00_warn(rt2x00dev, "Using incomplete support for " \ ++ "external PA\n"); ++ reg = rt2800_register_read(rt2x00dev, RF_CONTROL3); ++ reg |= 0x00000101; ++ rt2800_register_write(rt2x00dev, RF_CONTROL3, reg); ++ ++ reg = rt2800_register_read(rt2x00dev, RF_BYPASS3); ++ reg |= 0x00000101; ++ rt2800_register_write(rt2x00dev, RF_BYPASS3, reg); ++ ++ rt2800_rfcsr_write_bank(rt2x00dev, 4, 43, 0x73); ++ rt2800_rfcsr_write_bank(rt2x00dev, 6, 43, 0x73); ++ rt2800_rfcsr_write_bank(rt2x00dev, 4, 44, 0x73); ++ rt2800_rfcsr_write_bank(rt2x00dev, 6, 44, 0x73); ++ rt2800_rfcsr_write_bank(rt2x00dev, 4, 45, 0x73); ++ rt2800_rfcsr_write_bank(rt2x00dev, 6, 45, 0x73); ++ rt2800_rfcsr_write_bank(rt2x00dev, 4, 46, 0x27); ++ rt2800_rfcsr_write_bank(rt2x00dev, 6, 46, 0x27); ++ rt2800_rfcsr_write_bank(rt2x00dev, 4, 47, 0xC8); ++ rt2800_rfcsr_write_bank(rt2x00dev, 6, 47, 0xC8); ++ rt2800_rfcsr_write_bank(rt2x00dev, 4, 48, 0xA4); ++ rt2800_rfcsr_write_bank(rt2x00dev, 6, 48, 0xA4); ++ rt2800_rfcsr_write_bank(rt2x00dev, 4, 49, 0x05); ++ rt2800_rfcsr_write_bank(rt2x00dev, 6, 49, 0x05); ++ rt2800_rfcsr_write_bank(rt2x00dev, 4, 54, 0x27); ++ rt2800_rfcsr_write_bank(rt2x00dev, 6, 54, 0x27); ++ rt2800_rfcsr_write_bank(rt2x00dev, 4, 55, 0xC8); ++ rt2800_rfcsr_write_bank(rt2x00dev, 6, 55, 0xC8); ++ rt2800_rfcsr_write_bank(rt2x00dev, 4, 56, 0xA4); ++ rt2800_rfcsr_write_bank(rt2x00dev, 6, 56, 0xA4); ++ rt2800_rfcsr_write_bank(rt2x00dev, 4, 57, 0x05); ++ rt2800_rfcsr_write_bank(rt2x00dev, 6, 57, 0x05); ++ rt2800_rfcsr_write_bank(rt2x00dev, 4, 58, 0x27); ++ rt2800_rfcsr_write_bank(rt2x00dev, 6, 58, 0x27); ++ rt2800_rfcsr_write_bank(rt2x00dev, 4, 59, 0xC8); ++ rt2800_rfcsr_write_bank(rt2x00dev, 6, 59, 0xC8); ++ rt2800_rfcsr_write_bank(rt2x00dev, 4, 60, 0xA4); ++ rt2800_rfcsr_write_bank(rt2x00dev, 6, 60, 0xA4); ++ rt2800_rfcsr_write_bank(rt2x00dev, 4, 61, 0x05); ++ rt2800_rfcsr_write_bank(rt2x00dev, 6, 61, 0x05); ++ rt2800_rfcsr_write_bank(rt2x00dev, 5, 05, 0x00); ++ rt2800_rfcsr_write_bank(rt2x00dev, 7, 05, 0x00); ++ ++ rt2800_register_write(rt2x00dev, TX0_RF_GAIN_CORRECT, ++ 0x36303636); ++ rt2800_register_write(rt2x00dev, TX0_RF_GAIN_ATTEN, ++ 0x6C6C6B6C); ++ rt2800_register_write(rt2x00dev, TX1_RF_GAIN_ATTEN, ++ 0x6C6C6B6C); ++ } ++ } ++ + bbp = rt2800_bbp_read(rt2x00dev, 4); + rt2x00_set_field8(&bbp, BBP4_BANDWIDTH, 2 * conf_is_ht40(conf)); + rt2800_bbp_write(rt2x00dev, 4, bbp); +@@ -9314,7 +9369,8 @@ static int rt2800_init_eeprom(struct rt2 + */ + eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1); + +- if (rt2x00_rt(rt2x00dev, RT3352)) { ++ if (rt2x00_rt(rt2x00dev, RT3352) || ++ rt2x00_rt(rt2x00dev, RT6352)) { + if (rt2x00_get_field16(eeprom, + EEPROM_NIC_CONF1_EXTERNAL_TX0_PA_3352)) + __set_bit(CAPABILITY_EXTERNAL_PA_TX0, +@@ -9325,6 +9381,18 @@ static int rt2800_init_eeprom(struct rt2 + &rt2x00dev->cap_flags); + } + ++ eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF2); ++ ++ if (rt2x00_rt(rt2x00dev, RT6352) && eeprom != 0 && eeprom != 0xffff) { ++ if (rt2x00_get_field16(eeprom, ++ EEPROM_NIC_CONF2_EXTERNAL_PA)) { ++ __set_bit(CAPABILITY_EXTERNAL_PA_TX0, ++ &rt2x00dev->cap_flags); ++ __set_bit(CAPABILITY_EXTERNAL_PA_TX1, ++ &rt2x00dev->cap_flags); ++ } ++ } ++ + return 0; + } + diff --git a/package/kernel/mac80211/patches/651-rt2x00-remove-unneccesary-code.patch b/package/kernel/mac80211/patches/651-rt2x00-remove-unneccesary-code.patch new file mode 100644 index 0000000000..475fcbc223 --- /dev/null +++ b/package/kernel/mac80211/patches/651-rt2x00-remove-unneccesary-code.patch @@ -0,0 +1,132 @@ +From pozega.tomislav@gmail.com Thu May 18 12:42:27 2017 +Return-path: +Envelope-to: daniel@makrotopia.org +Delivery-date: Thu, 18 May 2017 12:42:27 +0200 +Received: from mail by fudo.makrotopia.org with sa-checked (Exim 4.88) + (envelope-from ) + id 1dBIsy-00088b-PU + for daniel@makrotopia.org; Thu, 18 May 2017 12:42:27 +0200 +X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on fudo.makrotopia.org +X-Spam-Level: +X-Spam-Status: No, score=-0.8 required=2.5 tests=DKIM_SIGNED,DKIM_VALID, + DKIM_VALID_AU,FREEMAIL_FROM,HTML_MESSAGE,RCVD_IN_DNSWL_LOW shortcircuit=no + autolearn=ham autolearn_force=no version=3.4.1 +Received: from mail-oi0-x22a.google.com ([2607:f8b0:4003:c06::22a]) + by fudo.makrotopia.org with esmtps (TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128) + (Exim 4.88) + (envelope-from ) + id 1dBIsv-00088Q-Dq + for daniel@makrotopia.org; Thu, 18 May 2017 12:42:24 +0200 +Received: by mail-oi0-x22a.google.com with SMTP id w10so48782189oif.0 + for ; Thu, 18 May 2017 03:42:21 -0700 (PDT) +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=gmail.com; s=20161025; + h=mime-version:from:date:message-id:subject:to; + bh=9dF7PHDassYY74+N6dAhmsL/B9i5oG3SEuMzHuazhJo=; + b=cBGJ44v+o4ASyCPmHCBRMmRYnJCv4Gx6lzDiScKn0XqYmNHYpZTPg5cAY1GZFUhHdz + 9QT5fzhJKFikBliSuJc/7/pI8KzvyEAdvawiWA7/5fbeiTZ+zjJnzRVGezqkYDKxjR6u + 7TsoJxR2/oFwo7bOFlThhee+Nwf7qaX8AVal7JdkqovekX79JQ5vsKAa4LapDp7Cl0wr + KCh0WRUHGEgpTLJFyQ3ThPmLqc8bhmu+6/V/LJ53VOY7uksZHMhvaKkk9vDCoOuPnBMK + Cj2/c7z9RTErz/xlHg6HxnBe/pPc31XUsuPJUleOEdZASczPsreEEKacKCONVlP1wjAB + iOkA== +X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=1e100.net; s=20161025; + h=x-gm-message-state:mime-version:from:date:message-id:subject:to; + bh=9dF7PHDassYY74+N6dAhmsL/B9i5oG3SEuMzHuazhJo=; + b=LJAe4ZwS9aNJypROW7j+I9aNfRBWyDYy0c8ABnDbLrIoF9P2AA/Vs/Cli5f7GjaAxr + 1JCx602ach+7R7QjQq/nqNmLuhRCfSvB0TGrq4R4v+CJ4ADO541+PddnFiU1dlIXQRP2 + TE2FOydSO0FGJBMg+kY0eFiidBtYj1T5x7IHAhQzufiuiF6/1xZS8h61CYJjLzt/aR5y + JxOxsVvu3W2YQ0T5wKmAPlKtarFH6ZZgs446bRYt1MX5KAWzIoBM1+IPMMv7lSCpCaDR + fwH05aDyaJW2IzXH5R9Tq7gGYycYjx/SnO7JupJXJVvOzKgBJxp60JwJhCfqCwESDuuD + 8nNA== +X-Gm-Message-State: AODbwcDOpdFZgbxAxFsVsqFdCBN3pRGDvEclZ1heVg2byNZ9BuG5kqJg + GvZ9x4NGt0v8lVGa3esDw0N1KiJENg== +X-Received: by 10.157.17.217 with SMTP id y25mr1310632oty.137.1495104134863; + Thu, 18 May 2017 03:42:14 -0700 (PDT) +MIME-Version: 1.0 +Received: by 10.157.0.105 with HTTP; Thu, 18 May 2017 03:42:14 -0700 (PDT) +From: Tom Psyborg +Date: Thu, 18 May 2017 12:42:14 +0200 +Message-ID: +Subject: [PATCH] rt2x00: remove unneccesary code +To: linux-wireless , + Linux Kernel Mailing List , Arnd Bergmann , + Jes Sorensen , Stanislaw Gruszka , + David Miller , Helmut Schaa , + Kalle Valo , Daniel Golle , + Mathias Kresin , Johannes Berg , + Serge Vasilugin , Roman Yeryomin , + Networking +Content-Type: multipart/alternative; boundary="94eb2c1905d2dc6361054fca0e62" +Status: RO +Content-Length: 11079 +Lines: 178 + +--94eb2c1905d2dc6361054fca0e62 +Content-Type: text/plain; charset="UTF-8" +Content-Transfer-Encoding: quoted-printable + +Use chanreg and dccal helpers to reduce the size of ePA code. + +Signed-off-by: Tomislav Po=C5=BEega +Signed-off-by: Daniel Golle +[daniel@makrotopia.org: fixed white-space so patch applies] +--- + +--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +@@ -4133,38 +4133,22 @@ static void rt2800_config_channel(struct + reg |= 0x00000101; + rt2800_register_write(rt2x00dev, RF_BYPASS3, reg); + +- rt2800_rfcsr_write_bank(rt2x00dev, 4, 43, 0x73); +- rt2800_rfcsr_write_bank(rt2x00dev, 6, 43, 0x73); +- rt2800_rfcsr_write_bank(rt2x00dev, 4, 44, 0x73); +- rt2800_rfcsr_write_bank(rt2x00dev, 6, 44, 0x73); +- rt2800_rfcsr_write_bank(rt2x00dev, 4, 45, 0x73); +- rt2800_rfcsr_write_bank(rt2x00dev, 6, 45, 0x73); +- rt2800_rfcsr_write_bank(rt2x00dev, 4, 46, 0x27); +- rt2800_rfcsr_write_bank(rt2x00dev, 6, 46, 0x27); +- rt2800_rfcsr_write_bank(rt2x00dev, 4, 47, 0xC8); +- rt2800_rfcsr_write_bank(rt2x00dev, 6, 47, 0xC8); +- rt2800_rfcsr_write_bank(rt2x00dev, 4, 48, 0xA4); +- rt2800_rfcsr_write_bank(rt2x00dev, 6, 48, 0xA4); +- rt2800_rfcsr_write_bank(rt2x00dev, 4, 49, 0x05); +- rt2800_rfcsr_write_bank(rt2x00dev, 6, 49, 0x05); +- rt2800_rfcsr_write_bank(rt2x00dev, 4, 54, 0x27); +- rt2800_rfcsr_write_bank(rt2x00dev, 6, 54, 0x27); +- rt2800_rfcsr_write_bank(rt2x00dev, 4, 55, 0xC8); +- rt2800_rfcsr_write_bank(rt2x00dev, 6, 55, 0xC8); +- rt2800_rfcsr_write_bank(rt2x00dev, 4, 56, 0xA4); +- rt2800_rfcsr_write_bank(rt2x00dev, 6, 56, 0xA4); +- rt2800_rfcsr_write_bank(rt2x00dev, 4, 57, 0x05); +- rt2800_rfcsr_write_bank(rt2x00dev, 6, 57, 0x05); +- rt2800_rfcsr_write_bank(rt2x00dev, 4, 58, 0x27); +- rt2800_rfcsr_write_bank(rt2x00dev, 6, 58, 0x27); +- rt2800_rfcsr_write_bank(rt2x00dev, 4, 59, 0xC8); +- rt2800_rfcsr_write_bank(rt2x00dev, 6, 59, 0xC8); +- rt2800_rfcsr_write_bank(rt2x00dev, 4, 60, 0xA4); +- rt2800_rfcsr_write_bank(rt2x00dev, 6, 60, 0xA4); +- rt2800_rfcsr_write_bank(rt2x00dev, 4, 61, 0x05); +- rt2800_rfcsr_write_bank(rt2x00dev, 6, 61, 0x05); +- rt2800_rfcsr_write_bank(rt2x00dev, 5, 05, 0x00); +- rt2800_rfcsr_write_bank(rt2x00dev, 7, 05, 0x00); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0x73); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0x73); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0x73); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 46, 0x27); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0xC8); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xA4); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 49, 0x05); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x27); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0xC8); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xA4); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 57, 0x05); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x27); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0xC8); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xA4); ++ rt2800_rfcsr_write_chanreg(rt2x00dev, 61, 0x05); ++ rt2800_rfcsr_write_dccal(rt2x00dev, 05, 0x00); + + rt2800_register_write(rt2x00dev, TX0_RF_GAIN_CORRECT, + 0x36303636); diff --git a/package/kernel/mac80211/patches/653-0002-rtl8xxxu-Add-initial-code-to-detect-8188eu-devices.patch b/package/kernel/mac80211/patches/653-0002-rtl8xxxu-Add-initial-code-to-detect-8188eu-devices.patch index f90ce492f0..71f93e9556 100644 --- a/package/kernel/mac80211/patches/653-0002-rtl8xxxu-Add-initial-code-to-detect-8188eu-devices.patch +++ b/package/kernel/mac80211/patches/653-0002-rtl8xxxu-Add-initial-code-to-detect-8188eu-devices.patch @@ -110,7 +110,7 @@ Signed-off-by: Jes Sorensen MODULE_FIRMWARE("rtlwifi/rtl8192cufw_A.bin"); MODULE_FIRMWARE("rtlwifi/rtl8192cufw_B.bin"); MODULE_FIRMWARE("rtlwifi/rtl8192cufw_TMSC.bin"); -@@ -6210,6 +6211,8 @@ static struct usb_device_id dev_table[] +@@ -6212,6 +6213,8 @@ static const struct usb_device_id dev_ta {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0xb720, 0xff, 0xff, 0xff), .driver_info = (unsigned long)&rtl8723bu_fops}, #ifdef CPTCFG_RTL8XXXU_UNTESTED diff --git a/package/kernel/mac80211/patches/653-0043-rtl8xxxu-Do-not-set-auto-rate-fallback-on-8188eu.patch b/package/kernel/mac80211/patches/653-0043-rtl8xxxu-Do-not-set-auto-rate-fallback-on-8188eu.patch index c69de5b0a7..1047625de7 100644 --- a/package/kernel/mac80211/patches/653-0043-rtl8xxxu-Do-not-set-auto-rate-fallback-on-8188eu.patch +++ b/package/kernel/mac80211/patches/653-0043-rtl8xxxu-Do-not-set-auto-rate-fallback-on-8188eu.patch @@ -39,7 +39,7 @@ Signed-off-by: Jes Sorensen .adda_2t_path_on_a = 0x04db25a4, --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192e.c +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192e.c -@@ -1655,6 +1655,7 @@ struct rtl8xxxu_fileops rtl8192eu_fops = +@@ -1658,6 +1658,7 @@ struct rtl8xxxu_fileops rtl8192eu_fops = .rx_desc_size = sizeof(struct rtl8xxxu_rxdesc24), .has_s0s1 = 0, .gen2_thermal_meter = 1, diff --git a/package/kernel/mac80211/patches/653-0045-rtl8xxxu-Add-rtl8188etv-to-USB-device-list.patch b/package/kernel/mac80211/patches/653-0045-rtl8xxxu-Add-rtl8188etv-to-USB-device-list.patch index 31c4b6535b..be5f72ff4d 100644 --- a/package/kernel/mac80211/patches/653-0045-rtl8xxxu-Add-rtl8188etv-to-USB-device-list.patch +++ b/package/kernel/mac80211/patches/653-0045-rtl8xxxu-Add-rtl8188etv-to-USB-device-list.patch @@ -13,7 +13,7 @@ Signed-off-by: Jes Sorensen --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c -@@ -6324,6 +6324,9 @@ static struct usb_device_id dev_table[] +@@ -6326,6 +6326,9 @@ static const struct usb_device_id dev_ta #ifdef CPTCFG_RTL8XXXU_UNTESTED {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0x8179, 0xff, 0xff, 0xff), .driver_info = (unsigned long)&rtl8188eu_fops}, diff --git a/package/kernel/mac80211/patches/653-0046-rtl8xxxu-Add-sitecom-dongle-to-USB-device-list.patch b/package/kernel/mac80211/patches/653-0046-rtl8xxxu-Add-sitecom-dongle-to-USB-device-list.patch index fa8ad28d97..b4898018f8 100644 --- a/package/kernel/mac80211/patches/653-0046-rtl8xxxu-Add-sitecom-dongle-to-USB-device-list.patch +++ b/package/kernel/mac80211/patches/653-0046-rtl8xxxu-Add-sitecom-dongle-to-USB-device-list.patch @@ -11,7 +11,7 @@ Signed-off-by: Jes Sorensen --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c -@@ -6327,6 +6327,9 @@ static struct usb_device_id dev_table[] +@@ -6329,6 +6329,9 @@ static const struct usb_device_id dev_ta /* Tested by Hans de Goede - rtl8188etv */ {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0x0179, 0xff, 0xff, 0xff), .driver_info = (unsigned long)&rtl8188eu_fops}, diff --git a/package/kernel/mac80211/patches/653-0049-rtl8xxxu-Add-rtl8188eu-USB-ID-for-D-Link-USB-GO-N150.patch b/package/kernel/mac80211/patches/653-0049-rtl8xxxu-Add-rtl8188eu-USB-ID-for-D-Link-USB-GO-N150.patch index 05c45ca24d..669fca6706 100644 --- a/package/kernel/mac80211/patches/653-0049-rtl8xxxu-Add-rtl8188eu-USB-ID-for-D-Link-USB-GO-N150.patch +++ b/package/kernel/mac80211/patches/653-0049-rtl8xxxu-Add-rtl8188eu-USB-ID-for-D-Link-USB-GO-N150.patch @@ -13,7 +13,7 @@ Signed-off-by: Jes Sorensen --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c -@@ -6330,6 +6330,9 @@ static struct usb_device_id dev_table[] +@@ -6332,6 +6332,9 @@ static const struct usb_device_id dev_ta /* Sitecom rtl8188eus */ {USB_DEVICE_AND_INTERFACE_INFO(0x0df6, 0x0076, 0xff, 0xff, 0xff), .driver_info = (unsigned long)&rtl8188eu_fops}, diff --git a/package/kernel/mac80211/patches/801-libertas-configure-sysfs-links.patch b/package/kernel/mac80211/patches/801-libertas-configure-sysfs-links.patch index 106ef706b8..cfde08d4ea 100644 --- a/package/kernel/mac80211/patches/801-libertas-configure-sysfs-links.patch +++ b/package/kernel/mac80211/patches/801-libertas-configure-sysfs-links.patch @@ -1,17 +1,17 @@ --- a/drivers/net/wireless/marvell/libertas/cfg.c +++ b/drivers/net/wireless/marvell/libertas/cfg.c -@@ -2127,6 +2127,8 @@ struct wireless_dev *lbs_cfg_alloc(struc +@@ -2043,6 +2043,8 @@ struct wireless_dev *lbs_cfg_alloc(struc goto err_wiphy_new; } + set_wiphy_dev(wdev->wiphy, dev); + - lbs_deb_leave(LBS_DEB_CFG80211); return wdev; + err_wiphy_new: --- a/drivers/net/wireless/marvell/libertas/main.c +++ b/drivers/net/wireless/marvell/libertas/main.c -@@ -986,6 +986,7 @@ struct lbs_private *lbs_add_card(void *c +@@ -933,6 +933,7 @@ struct lbs_private *lbs_add_card(void *c goto err_adapter; } diff --git a/package/kernel/mac80211/patches/802-libertas-set-wireless-macaddr.patch b/package/kernel/mac80211/patches/802-libertas-set-wireless-macaddr.patch index 04b4954d29..b26505de21 100644 --- a/package/kernel/mac80211/patches/802-libertas-set-wireless-macaddr.patch +++ b/package/kernel/mac80211/patches/802-libertas-set-wireless-macaddr.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/marvell/libertas/cfg.c +++ b/drivers/net/wireless/marvell/libertas/cfg.c -@@ -2217,6 +2217,8 @@ int lbs_cfg_register(struct lbs_private +@@ -2119,6 +2119,8 @@ int lbs_cfg_register(struct lbs_private wdev->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites); wdev->wiphy->reg_notifier = lbs_reg_notifier; diff --git a/package/kernel/mac80211/patches/810-b43-gpio-mask-module-option.patch b/package/kernel/mac80211/patches/810-b43-gpio-mask-module-option.patch index fd9e6fd974..5ce49d3a07 100644 --- a/package/kernel/mac80211/patches/810-b43-gpio-mask-module-option.patch +++ b/package/kernel/mac80211/patches/810-b43-gpio-mask-module-option.patch @@ -10,8 +10,8 @@ struct b43_phy phy; --- a/drivers/net/wireless/broadcom/b43/main.c +++ b/drivers/net/wireless/broadcom/b43/main.c -@@ -75,6 +75,11 @@ MODULE_FIRMWARE("b43/ucode16_mimo.fw"); - MODULE_FIRMWARE("b43/ucode5.fw"); +@@ -85,6 +85,11 @@ MODULE_FIRMWARE("b43/ucode40.fw"); + MODULE_FIRMWARE("b43/ucode42.fw"); MODULE_FIRMWARE("b43/ucode9.fw"); +static int modparam_gpiomask = 0x000F; @@ -22,7 +22,7 @@ static int modparam_bad_frames_preempt; module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444); MODULE_PARM_DESC(bad_frames_preempt, -@@ -2882,10 +2887,10 @@ static int b43_gpio_init(struct b43_wlde +@@ -2892,10 +2897,10 @@ static int b43_gpio_init(struct b43_wlde u32 mask, set; b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_GPOUTSMSK, 0); diff --git a/package/kernel/mac80211/patches/811-b43_no_pio.patch b/package/kernel/mac80211/patches/811-b43_no_pio.patch index 79428c2784..d23387c8cd 100644 --- a/package/kernel/mac80211/patches/811-b43_no_pio.patch +++ b/package/kernel/mac80211/patches/811-b43_no_pio.patch @@ -11,7 +11,7 @@ b43-$(CPTCFG_B43_LEDS) += leds.o --- a/drivers/net/wireless/broadcom/b43/main.c +++ b/drivers/net/wireless/broadcom/b43/main.c -@@ -2008,10 +2008,12 @@ static void b43_do_interrupt_thread(stru +@@ -2018,10 +2018,12 @@ static void b43_do_interrupt_thread(stru dma_reason[0], dma_reason[1], dma_reason[2], dma_reason[3], dma_reason[4], dma_reason[5]); diff --git a/package/kernel/mac80211/patches/812-b43-add-antenna-control.patch b/package/kernel/mac80211/patches/812-b43-add-antenna-control.patch index 33c9402f18..932c83b48e 100644 --- a/package/kernel/mac80211/patches/812-b43-add-antenna-control.patch +++ b/package/kernel/mac80211/patches/812-b43-add-antenna-control.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/broadcom/b43/main.c +++ b/drivers/net/wireless/broadcom/b43/main.c -@@ -1648,7 +1648,7 @@ static void b43_write_beacon_template(st +@@ -1658,7 +1658,7 @@ static void b43_write_beacon_template(st len, ram_offset, shm_size_offset, rate); /* Write the PHY TX control parameters. */ @@ -9,7 +9,7 @@ antenna = b43_antenna_to_phyctl(antenna); ctl = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL); /* We can't send beacons with short preamble. Would get PHY errors. */ -@@ -3297,8 +3297,8 @@ static int b43_chip_init(struct b43_wlde +@@ -3307,8 +3307,8 @@ static int b43_chip_init(struct b43_wlde /* Select the antennae */ if (phy->ops->set_rx_antenna) @@ -20,7 +20,7 @@ if (phy->type == B43_PHYTYPE_B) { value16 = b43_read16(dev, 0x005E); -@@ -3998,7 +3998,6 @@ static int b43_op_config(struct ieee8021 +@@ -4008,7 +4008,6 @@ static int b43_op_config(struct ieee8021 struct b43_wldev *dev = wl->current_dev; struct b43_phy *phy = &dev->phy; struct ieee80211_conf *conf = &hw->conf; @@ -28,7 +28,7 @@ int err = 0; mutex_lock(&wl->mutex); -@@ -4041,11 +4040,9 @@ static int b43_op_config(struct ieee8021 +@@ -4051,11 +4050,9 @@ static int b43_op_config(struct ieee8021 } /* Antennas for RX and management frame TX. */ @@ -42,7 +42,7 @@ if (wl->radio_enabled != phy->radio_on) { if (wl->radio_enabled) { -@@ -5189,6 +5186,47 @@ static int b43_op_get_survey(struct ieee +@@ -5199,6 +5196,47 @@ static int b43_op_get_survey(struct ieee return 0; } @@ -90,7 +90,7 @@ static const struct ieee80211_ops b43_hw_ops = { .tx = b43_op_tx, .conf_tx = b43_op_conf_tx, -@@ -5210,6 +5248,8 @@ static const struct ieee80211_ops b43_hw +@@ -5220,6 +5258,8 @@ static const struct ieee80211_ops b43_hw .sw_scan_complete = b43_op_sw_scan_complete_notifier, .get_survey = b43_op_get_survey, .rfkill_poll = b43_rfkill_poll, @@ -99,7 +99,7 @@ }; /* Hard-reset the chip. Do not call this directly. -@@ -5513,6 +5553,8 @@ static int b43_one_core_attach(struct b4 +@@ -5523,6 +5563,8 @@ static int b43_one_core_attach(struct b4 if (!wldev) goto out; @@ -108,9 +108,9 @@ wldev->use_pio = b43_modparam_pio; wldev->dev = dev; wldev->wl = wl; -@@ -5605,6 +5647,9 @@ static struct b43_wl *b43_wireless_init( +@@ -5617,6 +5659,9 @@ static struct b43_wl *b43_wireless_init( - hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; + wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); + hw->wiphy->available_antennas_rx = 0x3; + hw->wiphy->available_antennas_tx = 0x3; diff --git a/package/kernel/mac80211/patches/814-b43-only-use-gpio-0-1-for-led.patch b/package/kernel/mac80211/patches/814-b43-only-use-gpio-0-1-for-led.patch index 8d0c0412d2..03f4524c88 100644 --- a/package/kernel/mac80211/patches/814-b43-only-use-gpio-0-1-for-led.patch +++ b/package/kernel/mac80211/patches/814-b43-only-use-gpio-0-1-for-led.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/broadcom/b43/main.c +++ b/drivers/net/wireless/broadcom/b43/main.c -@@ -2899,6 +2899,14 @@ static int b43_gpio_init(struct b43_wlde +@@ -2909,6 +2909,14 @@ static int b43_gpio_init(struct b43_wlde } else if (dev->dev->chip_id == 0x5354) { /* Don't allow overtaking buttons GPIOs */ set &= 0x2; /* 0x2 is LED GPIO on BCM5354 */ diff --git a/package/kernel/mac80211/patches/815-b43-always-take-overlapping-devs.patch b/package/kernel/mac80211/patches/815-b43-always-take-overlapping-devs.patch index ef7f3c92d2..f07151aa4e 100644 --- a/package/kernel/mac80211/patches/815-b43-always-take-overlapping-devs.patch +++ b/package/kernel/mac80211/patches/815-b43-always-take-overlapping-devs.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/broadcom/b43/main.c +++ b/drivers/net/wireless/broadcom/b43/main.c -@@ -117,7 +117,7 @@ static int b43_modparam_pio = 0; +@@ -127,7 +127,7 @@ static int b43_modparam_pio = 0; module_param_named(pio, b43_modparam_pio, int, 0644); MODULE_PARM_DESC(pio, "Use PIO accesses by default: 0=DMA, 1=PIO"); diff --git a/package/kernel/mac80211/patches/860-brcmfmac-register-wiphy-s-during-module_init.patch b/package/kernel/mac80211/patches/860-brcmfmac-register-wiphy-s-during-module_init.patch index d09057f896..cc29402c0b 100644 --- a/package/kernel/mac80211/patches/860-brcmfmac-register-wiphy-s-during-module_init.patch +++ b/package/kernel/mac80211/patches/860-brcmfmac-register-wiphy-s-during-module_init.patch @@ -13,7 +13,7 @@ Signed-off-by: Rafał Miłecki --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c -@@ -1196,6 +1196,7 @@ int __init brcmf_core_init(void) +@@ -1198,6 +1198,7 @@ int __init brcmf_core_init(void) { if (!schedule_work(&brcmf_driver_work)) return -EBUSY; @@ -25,7 +25,7 @@ Signed-off-by: Rafał Miłecki +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c @@ -444,6 +444,7 @@ struct brcmf_fw { u16 bus_nr; - void (*done)(struct device *dev, const struct firmware *fw, + void (*done)(struct device *dev, int err, const struct firmware *fw, void *nvram_image, u32 nvram_len); + struct completion *completion; }; @@ -34,7 +34,7 @@ Signed-off-by: Rafał Miłecki @@ -478,6 +479,8 @@ static void brcmf_fw_request_nvram_done( goto fail; - fwctx->done(fwctx->dev, fwctx->code, nvram, nvram_length); + fwctx->done(fwctx->dev, 0, fwctx->code, nvram, nvram_length); + if (fwctx->completion) + complete(fwctx->completion); kfree(fwctx); @@ -43,31 +43,22 @@ Signed-off-by: Rafał Miłecki @@ -485,6 +488,8 @@ fail: brcmf_dbg(TRACE, "failed: dev=%s\n", dev_name(fwctx->dev)); release_firmware(fwctx->code); - device_release_driver(fwctx->dev); + fwctx->done(fwctx->dev, -ENOENT, NULL, NULL, 0); + if (fwctx->completion) + complete(fwctx->completion); kfree(fwctx); } -@@ -500,6 +505,8 @@ static void brcmf_fw_request_code_done(c - /* only requested code so done here */ - if (!(fwctx->flags & BRCMF_FW_REQUEST_NVRAM)) { - fwctx->done(fwctx->dev, fw, NULL, 0); -+ if (fwctx->completion) -+ complete(fwctx->completion); - kfree(fwctx); - return; - } -@@ -517,6 +524,8 @@ static void brcmf_fw_request_code_done(c - fail: +@@ -516,6 +521,8 @@ fail: brcmf_dbg(TRACE, "failed: dev=%s\n", dev_name(fwctx->dev)); - device_release_driver(fwctx->dev); + done: + fwctx->done(fwctx->dev, ret, fw, NULL, 0); + if (fwctx->completion) + complete(fwctx->completion); kfree(fwctx); } -@@ -528,6 +537,8 @@ int brcmf_fw_get_firmwares_pcie(struct d +@@ -527,6 +534,8 @@ int brcmf_fw_get_firmwares_pcie(struct d u16 domain_nr, u16 bus_nr) { struct brcmf_fw *fwctx; @@ -76,7 +67,7 @@ Signed-off-by: Rafał Miłecki brcmf_dbg(TRACE, "enter: dev=%s\n", dev_name(dev)); if (!fw_cb || !code) -@@ -548,9 +559,17 @@ int brcmf_fw_get_firmwares_pcie(struct d +@@ -547,9 +556,17 @@ int brcmf_fw_get_firmwares_pcie(struct d fwctx->domain_nr = domain_nr; fwctx->bus_nr = bus_nr; diff --git a/package/kernel/mac80211/patches/861-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch b/package/kernel/mac80211/patches/861-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch index 774b333402..7fc1e449d0 100644 --- a/package/kernel/mac80211/patches/861-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch +++ b/package/kernel/mac80211/patches/861-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch @@ -10,8 +10,8 @@ Signed-off-by: Rafał Miłecki --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -@@ -656,9 +656,37 @@ static struct wireless_dev *brcmf_cfg802 - u32 *flags, +@@ -655,9 +655,37 @@ static struct wireless_dev *brcmf_cfg802 + enum nl80211_iftype type, struct vif_params *params) { + struct net_device *dev; diff --git a/package/kernel/mac80211/patches/862-brcmfmac-Disable-power-management.patch b/package/kernel/mac80211/patches/862-brcmfmac-Disable-power-management.patch index 1819cf3999..43f8fbf674 100644 --- a/package/kernel/mac80211/patches/862-brcmfmac-Disable-power-management.patch +++ b/package/kernel/mac80211/patches/862-brcmfmac-Disable-power-management.patch @@ -14,7 +14,7 @@ Signed-off-by: Phil Elwell --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -@@ -2775,6 +2775,10 @@ brcmf_cfg80211_set_power_mgmt(struct wip +@@ -2838,6 +2838,10 @@ brcmf_cfg80211_set_power_mgmt(struct wip * preference in cfg struct to apply this to * FW later while initializing the dongle */ diff --git a/package/kernel/mac80211/patches/921-ath10k_init_devices_synchronously.patch b/package/kernel/mac80211/patches/921-ath10k_init_devices_synchronously.patch index 0c34d96847..94a25b680d 100644 --- a/package/kernel/mac80211/patches/921-ath10k_init_devices_synchronously.patch +++ b/package/kernel/mac80211/patches/921-ath10k_init_devices_synchronously.patch @@ -14,7 +14,7 @@ Signed-off-by: Sven Eckelmann --- a/drivers/net/wireless/ath/ath10k/core.c +++ b/drivers/net/wireless/ath/ath10k/core.c -@@ -2319,6 +2319,16 @@ int ath10k_core_register(struct ath10k * +@@ -2445,6 +2445,16 @@ int ath10k_core_register(struct ath10k * ar->chip_id = chip_id; queue_work(ar->workqueue, &ar->register_work); diff --git a/package/kernel/mac80211/patches/930-ath10k_add_tpt_led_trigger.patch b/package/kernel/mac80211/patches/930-ath10k_add_tpt_led_trigger.patch index 4cf1b9f92a..e0ab671760 100644 --- a/package/kernel/mac80211/patches/930-ath10k_add_tpt_led_trigger.patch +++ b/package/kernel/mac80211/patches/930-ath10k_add_tpt_led_trigger.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath10k/mac.c +++ b/drivers/net/wireless/ath/ath10k/mac.c -@@ -8003,6 +8003,21 @@ static int ath10k_mac_init_rd(struct ath +@@ -8067,6 +8067,21 @@ static int ath10k_mac_init_rd(struct ath return 0; } @@ -22,9 +22,9 @@ int ath10k_mac_register(struct ath10k *ar) { static const u32 cipher_suites[] = { -@@ -8248,6 +8263,12 @@ int ath10k_mac_register(struct ath10k *a - ar->hw->wiphy->cipher_suites = cipher_suites; - ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites); +@@ -8308,6 +8323,12 @@ int ath10k_mac_register(struct ath10k *a + + wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); +#ifdef CPTCFG_MAC80211_LEDS + ieee80211_create_tpt_led_trigger(ar->hw, diff --git a/package/kernel/mac80211/patches/936-ath10k-fix-otp-failure-result.patch b/package/kernel/mac80211/patches/936-ath10k-fix-otp-failure-result.patch new file mode 100644 index 0000000000..0af8025d96 --- /dev/null +++ b/package/kernel/mac80211/patches/936-ath10k-fix-otp-failure-result.patch @@ -0,0 +1,11 @@ +--- a/drivers/net/wireless/ath/ath10k/core.c ++++ b/drivers/net/wireless/ath/ath10k/core.c +@@ -757,7 +757,7 @@ static int ath10k_core_get_board_id_from + if (ret) { + ath10k_err(ar, "could not execute otp for board id check: %d\n", + ret); +- return ret; ++ return -EOPNOTSUPP; + } + + board_id = MS(result, ATH10K_BMI_BOARD_ID_FROM_OTP); diff --git a/package/kernel/mac80211/patches/936-ath10k_skip_otp_check.patch b/package/kernel/mac80211/patches/936-ath10k_skip_otp_check.patch deleted file mode 100644 index 057995c55a..0000000000 --- a/package/kernel/mac80211/patches/936-ath10k_skip_otp_check.patch +++ /dev/null @@ -1,51 +0,0 @@ ---- a/drivers/net/wireless/ath/ath10k/core.c -+++ b/drivers/net/wireless/ath/ath10k/core.c -@@ -1362,9 +1362,6 @@ static int ath10k_core_fetch_firmware_fi - { - int ret; - -- /* calibration file is optional, don't check for any errors */ -- ath10k_fetch_cal_file(ar); -- - ar->fw_api = 5; - ath10k_dbg(ar, ATH10K_DBG_BOOT, "trying fw api %d\n", ar->fw_api); - -@@ -2149,7 +2146,7 @@ EXPORT_SYMBOL(ath10k_core_stop); - static int ath10k_core_probe_fw(struct ath10k *ar) - { - struct bmi_target_info target_info; -- int ret = 0; -+ int calret, ret = 0; - - ret = ath10k_hif_power_up(ar); - if (ret) { -@@ -2173,6 +2170,9 @@ static int ath10k_core_probe_fw(struct a - goto err_power_down; - } - -+ /* calibration file is optional, don't check for any errors */ -+ calret = ath10k_fetch_cal_file(ar); -+ - ret = ath10k_core_fetch_firmware_files(ar); - if (ret) { - ath10k_err(ar, "could not fetch firmware files (%d)\n", ret); -@@ -2195,11 +2195,14 @@ static int ath10k_core_probe_fw(struct a - "could not load pre cal data: %d\n", ret); - } - -- ret = ath10k_core_get_board_id_from_otp(ar); -- if (ret && ret != -EOPNOTSUPP) { -- ath10k_err(ar, "failed to get board id from otp: %d\n", -- ret); -- goto err_free_firmware_files; -+ /* otp and board file not needed if calibration data is present */ -+ if (calret) { -+ ret = ath10k_core_get_board_id_from_otp(ar); -+ if (ret && ret != -EOPNOTSUPP) { -+ ath10k_err(ar, "failed to get board id from otp: %d\n", -+ ret); -+ goto err_free_firmware_files; -+ } - } - - ret = ath10k_core_check_smbios(ar); diff --git a/package/kernel/mac80211/patches/940-mwl8k_init_devices_synchronously.patch b/package/kernel/mac80211/patches/940-mwl8k_init_devices_synchronously.patch index 357faee4bf..a958c78b43 100644 --- a/package/kernel/mac80211/patches/940-mwl8k_init_devices_synchronously.patch +++ b/package/kernel/mac80211/patches/940-mwl8k_init_devices_synchronously.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/marvell/mwl8k.c +++ b/drivers/net/wireless/marvell/mwl8k.c -@@ -6264,6 +6264,8 @@ static int mwl8k_probe(struct pci_dev *p +@@ -6266,6 +6266,8 @@ static int mwl8k_probe(struct pci_dev *p priv->running_bsses = 0; @@ -9,7 +9,7 @@ return rc; err_stop_firmware: -@@ -6297,8 +6299,6 @@ static void mwl8k_remove(struct pci_dev +@@ -6299,8 +6301,6 @@ static void mwl8k_remove(struct pci_dev return; priv = hw->priv; diff --git a/package/kernel/mac80211/patches/960-0010-ath10k-limit-htt-rx-ring-size.patch b/package/kernel/mac80211/patches/960-0010-ath10k-limit-htt-rx-ring-size.patch new file mode 100644 index 0000000000..914472aab9 --- /dev/null +++ b/package/kernel/mac80211/patches/960-0010-ath10k-limit-htt-rx-ring-size.patch @@ -0,0 +1,11 @@ +--- a/drivers/net/wireless/ath/ath10k/htt.h ++++ b/drivers/net/wireless/ath/ath10k/htt.h +@@ -200,7 +200,7 @@ enum htt_rx_ring_flags { + }; + + #define HTT_RX_RING_SIZE_MIN 128 +-#define HTT_RX_RING_SIZE_MAX 2048 ++#define HTT_RX_RING_SIZE_MAX 512 + + struct htt_rx_ring_setup_ring { + __le32 fw_idx_shadow_reg_paddr; diff --git a/package/kernel/mac80211/patches/960-0011-ath10k-limit-pci-buffer-size.patch b/package/kernel/mac80211/patches/960-0011-ath10k-limit-pci-buffer-size.patch new file mode 100644 index 0000000000..a101282d07 --- /dev/null +++ b/package/kernel/mac80211/patches/960-0011-ath10k-limit-pci-buffer-size.patch @@ -0,0 +1,38 @@ +--- a/drivers/net/wireless/ath/ath10k/pci.c ++++ b/drivers/net/wireless/ath/ath10k/pci.c +@@ -128,7 +128,7 @@ static struct ce_attr host_ce_config_wla + .flags = CE_ATTR_FLAGS, + .src_nentries = 0, + .src_sz_max = 2048, +- .dest_nentries = 512, ++ .dest_nentries = 128, + .recv_cb = ath10k_pci_htt_htc_rx_cb, + }, + +@@ -137,7 +137,7 @@ static struct ce_attr host_ce_config_wla + .flags = CE_ATTR_FLAGS, + .src_nentries = 0, + .src_sz_max = 2048, +- .dest_nentries = 128, ++ .dest_nentries = 64, + .recv_cb = ath10k_pci_htc_rx_cb, + }, + +@@ -164,7 +164,7 @@ static struct ce_attr host_ce_config_wla + .flags = CE_ATTR_FLAGS, + .src_nentries = 0, + .src_sz_max = 512, +- .dest_nentries = 512, ++ .dest_nentries = 128, + .recv_cb = ath10k_pci_htt_rx_cb, + }, + +@@ -189,7 +189,7 @@ static struct ce_attr host_ce_config_wla + .flags = CE_ATTR_FLAGS, + .src_nentries = 0, + .src_sz_max = 2048, +- .dest_nentries = 128, ++ .dest_nentries = 96, + .recv_cb = ath10k_pci_pktlog_rx_cb, + }, + diff --git a/target/linux/generic/files/include/linux/ath9k_platform.h b/target/linux/generic/files/include/linux/ath9k_platform.h index 558445ff63..f1f2ad419c 100644 --- a/target/linux/generic/files/include/linux/ath9k_platform.h +++ b/target/linux/generic/files/include/linux/ath9k_platform.h @@ -49,7 +49,6 @@ struct ath9k_platform_data { int num_leds; const struct gpio_led *leds; - const char *led_name; unsigned num_btns; const struct gpio_keys_button *btns; From ff5374b99e9afb7fb6e6dae671fff504ac7f47d7 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Sat, 4 Nov 2017 15:15:27 +0800 Subject: [PATCH 29/37] update kernel to 4.9.60 --- include/kernel-version.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/kernel-version.mk b/include/kernel-version.mk index 2bddc87109..4dd13993a2 100644 --- a/include/kernel-version.mk +++ b/include/kernel-version.mk @@ -4,11 +4,11 @@ LINUX_RELEASE?=1 LINUX_VERSION-3.18 = .71 LINUX_VERSION-4.4 = .93 -LINUX_VERSION-4.9 = .58 +LINUX_VERSION-4.9 = .60 LINUX_KERNEL_HASH-3.18.71 = 5abc9778ad44ce02ed6c8ab52ece8a21c6d20d21f6ed8a19287b4a38a50c1240 LINUX_KERNEL_HASH-4.4.93 = ed349314f16e78a6571b5f8884f6452782aef6c26b81bcc7ccdac44ecd917c36 -LINUX_KERNEL_HASH-4.9.58 = 748f12a28689644b6a9102c67f8fa7938ca73823a949ba6f65024aecf2f221a7 +LINUX_KERNEL_HASH-4.9.60 = 0e326c5c5152c41265d1c681b41b52afce1925f4a382dfd41cb93605f3fcad04 ifdef KERNEL_PATCHVER LINUX_VERSION:=$(KERNEL_PATCHVER)$(strip $(LINUX_VERSION-$(KERNEL_PATCHVER))) From f56a9183618bbc9a2c5b24ff021cf5f4b7859f44 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Sat, 4 Nov 2017 15:39:50 +0800 Subject: [PATCH 30/37] update ath10k firmware --- package/firmware/ath10k-firmware/Makefile | 157 ++++++++++++---------- 1 file changed, 87 insertions(+), 70 deletions(-) diff --git a/package/firmware/ath10k-firmware/Makefile b/package/firmware/ath10k-firmware/Makefile index 8bf5729fff..9a34ac3155 100644 --- a/package/firmware/ath10k-firmware/Makefile +++ b/package/firmware/ath10k-firmware/Makefile @@ -8,9 +8,9 @@ include $(TOPDIR)/rules.mk PKG_NAME:=ath10k-firmware -PKG_SOURCE_DATE:=2017-01-11 -PKG_SOURCE_VERSION:=ab432c60437931a165f0aff1a6e3371f358b75dd -PKG_MIRROR_HASH:=e3188ecd4d7470d3cdde89fefa6258f9ec4f404b23558d1474e5014679b28101 +PKG_SOURCE_DATE:=2017-03-29 +PKG_SOURCE_VERSION:=956e2609b7e42c8c710bba10ef925a5be1be5137 +PKG_MIRROR_HASH:=25f724ff38c830281b3efba4a4ddffaae0c4bd8fea0f4c1061591229ff05535b PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git @@ -32,35 +32,16 @@ $(Package/ath10k-firmware-default) TITLE:=ath10k firmware for QCA9887 devices endef +define Package/ath10k-firmware-qca9888 +$(Package/ath10k-firmware-default) + TITLE:=ath10k firmware for QCA9888 devices +endef + define Package/ath10k-firmware-qca9887-ct $(Package/ath10k-firmware-default) TITLE:=ath10k-CT firmware for QCA9887 devices endef -QCA9887_REV:=3cce88e245f2d685e49411c4f80998f94baf67b8 -QCA9887_FIRMWARE_FILE:=firmware-5.bin_10.2.4-1.0-00013 -QCA9887_FIRMWARE_FILE_HASH:=5966408bd41f309edb595344b8dd088c0fed212debfd91e5f3e8a55ea119c16d -QCA9887_FIRMWARE_FILE_DL:=$(QCA9887_FIRMWARE_FILE).$(QCA9887_FIRMWARE_FILE_HASH) -QCA9887_BOARD_FILE:=board.bin -QCA9887_BOARD_FILE_HASH:=cf4df099f6ee05c181f55ce17297a1d32c61d725eb96246fd315ad5587c42426 -QCA9887_BOARD_FILE_DL:=$(QCA9887_BOARD_FILE).$(QCA9887_BOARD_FILE_HASH) - -define Download/ath10k-qca9887-firmware - URL:=https://github.com/kvalo/ath10k-firmware/raw/$(QCA9887_REV)/QCA9887/hw1.0/ - URL_FILE:=$(QCA9887_FIRMWARE_FILE) - FILE:=$(QCA9887_FIRMWARE_FILE_DL) - HASH:=$(QCA9887_FIRMWARE_FILE_HASH) -endef -$(eval $(call Download,ath10k-qca9887-firmware)) - -define Download/ath10k-qca9887-board - URL:=https://github.com/kvalo/ath10k-firmware/raw/$(QCA9887_REV)/QCA9887/hw1.0/ - URL_FILE:=$(QCA9887_BOARD_FILE) - FILE:=$(QCA9887_BOARD_FILE_DL) - HASH:=$(QCA9887_BOARD_FILE_HASH) -endef -$(eval $(call Download,ath10k-qca9887-board)) - define Package/ath10k-firmware-qca988x $(Package/ath10k-firmware-default) TITLE:=ath10k firmware for QCA988x devices @@ -76,34 +57,41 @@ define Download/ct-firmware URL_FILE:=$($(1)_FIRMWARE_FILE_CT) endef -QCA988X_FIRMWARE_FILE_CT:=firmware-2-ct-full-community.bin-19-rc3-lede +QCA988X_FIRMWARE_FILE_CT:=firmware-2-ct-full-community-19.bin.lede define Download/ath10k-firmware-qca988x-ct $(call Download/ct-firmware,QCA988X,) - HASH:=4112d78161a2c20e7a9490ea8d04e9f919508bafb097d88761dcce026c26f93f + HASH:=bff98f028062dae9fc638c7596aec3c79bf9eddaff65cfacba067f6d72f217cd endef $(eval $(call Download,ath10k-firmware-qca988x-ct)) -QCA9887_FIRMWARE_FILE_CT:=firmware-2-ct-full-community.bin-19-rc3-lede +QCA9887_FIRMWARE_FILE_CT:=firmware-2-ct-full-community-19.bin.lede define Download/ath10k-firmware-qca9887-ct $(call Download/ct-firmware,QCA9887,ath10k-9887) - HASH:=18b61875726d4384de46f75dec1d42fea31aa6d66dba4940cb9d375bc98732e4 + HASH:=95dc106f98672bd9c7d3fe6881ed79ab079cb49b0a995650991b1beaff2b0101 endef $(eval $(call Download,ath10k-firmware-qca9887-ct)) -QCA99X0_FIRMWARE_FILE_CT:=firmware-5-ct-full-community-9.bin-lede.001 +QCA99X0_FIRMWARE_FILE_CT:=firmware-5-ct-full-community-9.bin-lede.004 define Download/ath10k-firmware-qca99x0-ct $(call Download/ct-firmware,QCA99X0,ath10k-10-4) - HASH:=61ff2b52617ae805579f423d6539284f056aba2b9f7e3629d600f6a5077ab703 + HASH:=993c29fd64bb2a59b86d34f58601a1a48b83b541750bc511f78cc17152829b4d endef $(eval $(call Download,ath10k-firmware-qca99x0-ct)) -QCA9984_FIRMWARE_FILE_CT:=firmware-5-ct-full-community-9.bin-lede.001 +QCA9984_FIRMWARE_FILE_CT:=firmware-5-ct-full-community-9.bin-lede.004 define Download/ath10k-firmware-qca9984-ct $(call Download/ct-firmware,QCA9984,ath10k-9984-10-4) - HASH:=e079db5059cf28979ff50c7f6706df87e96a375e8048deeb4f6ede5357577f74 + HASH:=d997eed9a8bc6809c01d367759ba8545c10e3be93ea1f33d6d753127ef0f7c5e endef $(eval $(call Download,ath10k-firmware-qca9984-ct)) +QCA9888_FIRMWARE_FILE_CT:=firmware-5-ct-full-community-9.bin-lede.004 +define Download/ath10k-firmware-qca9888-ct + $(call Download/ct-firmware,QCA9888,ath10k-9888-10-4) + HASH:=bbaa71bc7dcaa264c5875e86639f174908fed09fbace975e325959d42f3754ff +endef +$(eval $(call Download,ath10k-firmware-qca9888-ct)) + define Package/ath10k-firmware-qca99x0 $(Package/ath10k-firmware-default) TITLE:=ath10k firmware for QCA99x0 devices @@ -158,6 +146,14 @@ This firmware conflicts with the standard 9984 firmware, so select only one. endef +define Package/ath10k-firmware-qca9888-ct/description +Alternative ath10k firmware for QCA9886 and QCA9888 from Candela Technologies. +Enables IBSS and other features. See: +http://www.candelatech.com/ath10k-10.4.php +This firmware conflicts with the standard 9886 and 9888 firmware, so select only +one. +endef + define Package/ath10k-firmware-qca99x0/description Standard ath10k firmware for QCA99x0 from QCA This firmware conflicts with the CT 99x0 firmware, so select only @@ -178,6 +174,13 @@ $(Package/ath10k-firmware-default) CATEGORY:=Firmware endef +define Package/ath10k-firmware-qca9888-ct +$(Package/ath10k-firmware-default) + TITLE:=ath10k CT 10.4.3 firmware for QCA9886 and QCA9888 devices + SECTION:=firmware + CATEGORY:=Firmware +endef + define Package/ath10k-firmware-qca9984 $(Package/ath10k-firmware-default) TITLE:=ath10k firmware for QCA9984 devices @@ -185,6 +188,13 @@ $(Package/ath10k-firmware-default) CATEGORY:=Firmware endef +define Package/ath10k-firmware-qca4019 +$(Package/ath10k-firmware-default) + TITLE:=ath10k firmware for IPQ/QCA4019 devices + SECTION:=firmware + CATEGORY:=Firmware +endef + define Package/ath10k-firmware-qca6174 $(Package/ath10k-firmware-default) TITLE:=ath10k firmware for QCA6174 devices @@ -203,50 +213,47 @@ define Download/qca99x0-board endef $(eval $(call Download,qca99x0-board)) -QCA9984_BOARD_REV:=719c0127e52bd70559e71b85ab0331790e1bf66c -QCA9984_BOARD_FILE:=board-2.bin -QCA9984_BOARD_FILE_DL:=$(QCA9984_BOARD_FILE).$(QCA9984_BOARD_REV) -QCA9984_FIRMWARE_REV:=d43cb1188154037506e94abf3aa456cc934c6861 -QCA9984_FIRMWARE_FILE:=firmware-5.bin_10.4-3.4-00072 -QCA9984_FIRMWARE_FILE_DL:=$(QCA9984_FIRMWARE_FILE).$(QCA9984_FIRMWARE_REV) - -define Download/ath10k-qca9984-board - URL:=https://source.codeaurora.org/quic/qsdk/oss/firmware/ath10k-firmware/plain/ath10k/QCA9984/hw1.0/ - URL_FILE:=$(QCA9984_BOARD_FILE)?id=$(QCA9984_BOARD_REV) - FILE:=$(QCA9984_BOARD_FILE_DL) - HASH:=e968b214fd76d5b7859f71841ce40fbd5f47336c3ccbaf95e23f902f5e569aef -endef -$(eval $(call Download,ath10k-qca9984-board)) - -define Download/ath10k-qca9984-firmware - URL:=https://source.codeaurora.org/quic/qsdk/oss/firmware/ath10k-firmware/plain/ath10k/QCA9984/hw1.0/ - URL_FILE:=$(QCA9984_FIRMWARE_FILE)?id=$(QCA9984_FIRMWARE_REV) - FILE:=$(QCA9984_FIRMWARE_FILE_DL) - HASH:=28d5834e8c4ca8fcef9ea033cd8b9b0f9ee84ecf30dbde84c9c64bf8dd9912bc -endef -$(eval $(call Download,ath10k-qca9984-firmware)) - define Build/Compile endef +define Package/ath10k-firmware-qca4019/install + $(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA4019/hw1.0 + $(INSTALL_DATA) \ + $(PKG_BUILD_DIR)/QCA4019/hw1.0/board-2.bin \ + $(1)/lib/firmware/ath10k/QCA4019/hw1.0/ + $(INSTALL_DATA) \ + $(PKG_BUILD_DIR)/QCA4019/hw1.0/3.2.1/firmware-5.bin_10.4-3.2.1-00053 \ + $(1)/lib/firmware/ath10k/QCA4019/hw1.0/firmware-5.bin +endef + define Package/ath10k-firmware-qca9887/install $(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA9887/hw1.0 $(INSTALL_DATA) \ - $(DL_DIR)/$(QCA9887_FIRMWARE_FILE_DL) \ + $(PKG_BUILD_DIR)/QCA9887/hw1.0/10.2.4-1.0/firmware-5.bin_10.2.4-1.0-00029 \ $(1)/lib/firmware/ath10k/QCA9887/hw1.0/firmware-5.bin $(INSTALL_DATA) \ - $(DL_DIR)/$(QCA9887_BOARD_FILE_DL) \ + $(PKG_BUILD_DIR)/QCA9887/hw1.0/board.bin \ $(1)/lib/firmware/ath10k/QCA9887/hw1.0/board.bin endef +define Package/ath10k-firmware-qca9888/install + $(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA9888/hw2.0 + $(INSTALL_DATA) \ + $(PKG_BUILD_DIR)/QCA9888/hw2.0/board-2.bin \ + $(1)/lib/firmware/ath10k/QCA9888/hw2.0/board-2.bin + $(INSTALL_DATA) \ + $(PKG_BUILD_DIR)/QCA9888/hw2.0/firmware-5.bin_10.4-3.2-00072 \ + $(1)/lib/firmware/ath10k/QCA9888/hw2.0/firmware-5.bin +endef + define Package/ath10k-firmware-qca988x/install $(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA988X/hw2.0 $(INSTALL_DATA) \ $(PKG_BUILD_DIR)/QCA988X/hw2.0/board.bin \ $(1)/lib/firmware/ath10k/QCA988X/hw2.0/ $(INSTALL_DATA) \ - $(PKG_BUILD_DIR)/QCA988X/hw2.0/10.2.4-1.0/firmware-5.bin_10.2.4-1.0-00016 \ + $(PKG_BUILD_DIR)/QCA988X/hw2.0/10.2.4-1.0/firmware-5.bin_10.2.4-1.0-00029 \ $(1)/lib/firmware/ath10k/QCA988X/hw2.0/firmware-5.bin endef @@ -256,7 +263,7 @@ define Package/ath10k-firmware-qca9887-ct/install $(DL_DIR)/$(call CT_FIRMWARE_FILE,QCA9887) \ $(1)/lib/firmware/ath10k/QCA9887/hw1.0/firmware-2.bin $(INSTALL_DATA) \ - $(DL_DIR)/$(QCA9887_BOARD_FILE_DL) \ + $(PKG_BUILD_DIR)/QCA9887/hw1.0/board.bin \ $(1)/lib/firmware/ath10k/QCA9887/hw1.0/board.bin endef @@ -303,22 +310,16 @@ endef define Package/ath10k-firmware-qca9984/install $(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA9984/hw1.0 - ln -s \ - ../../cal-pci-0000:01:00.0.bin \ - $(1)/lib/firmware/ath10k/QCA9984/hw1.0/board.bin $(INSTALL_DATA) \ - $(DL_DIR)/$(QCA9984_BOARD_FILE_DL) \ + $(PKG_BUILD_DIR)/QCA9984/hw1.0/board-2.bin \ $(1)/lib/firmware/ath10k/QCA9984/hw1.0/board-2.bin $(INSTALL_DATA) \ - $(DL_DIR)/$(QCA9984_FIRMWARE_FILE_DL) \ + $(PKG_BUILD_DIR)/QCA9984/hw1.0/3.4/firmware-5.bin_10.4-3.4-00082 \ $(1)/lib/firmware/ath10k/QCA9984/hw1.0/firmware-5.bin endef define Package/ath10k-firmware-qca9984-ct/install $(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA9984/hw1.0 - ln -s \ - ../../cal-pci-0000:01:00.0.bin \ - $(1)/lib/firmware/ath10k/QCA9984/hw1.0/board.bin $(INSTALL_DATA) \ $(PKG_BUILD_DIR)/QCA9984/hw1.0/board-2.bin \ $(1)/lib/firmware/ath10k/QCA9984/hw1.0/board-2.bin @@ -327,13 +328,29 @@ define Package/ath10k-firmware-qca9984-ct/install $(1)/lib/firmware/ath10k/QCA9984/hw1.0/firmware-5.bin endef +define Package/ath10k-firmware-qca9888-ct/install + $(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA9888/hw2.0 + ln -s \ + ../../cal-pci-0000:01:00.0.bin \ + $(1)/lib/firmware/ath10k/QCA9888/hw2.0/board.bin + $(INSTALL_DATA) \ + $(PKG_BUILD_DIR)/QCA9888/hw2.0/board-2.bin \ + $(1)/lib/firmware/ath10k/QCA9888/hw2.0/board-2.bin + $(INSTALL_DATA) \ + $(DL_DIR)/$(call CT_FIRMWARE_FILE,QCA9888) \ + $(1)/lib/firmware/ath10k/QCA9888/hw2.0/firmware-5.bin +endef + $(eval $(call BuildPackage,ath10k-firmware-qca9887)) +$(eval $(call BuildPackage,ath10k-firmware-qca9888)) $(eval $(call BuildPackage,ath10k-firmware-qca988x)) $(eval $(call BuildPackage,ath10k-firmware-qca99x0)) $(eval $(call BuildPackage,ath10k-firmware-qca6174)) $(eval $(call BuildPackage,ath10k-firmware-qca9984)) +$(eval $(call BuildPackage,ath10k-firmware-qca4019)) $(eval $(call BuildPackage,ath10k-firmware-qca9887-ct)) $(eval $(call BuildPackage,ath10k-firmware-qca988x-ct)) $(eval $(call BuildPackage,ath10k-firmware-qca99x0-ct)) $(eval $(call BuildPackage,ath10k-firmware-qca9984-ct)) +$(eval $(call BuildPackage,ath10k-firmware-qca9888-ct)) From 9dd831c5862d9305476a7e5f4e783e5f97ab8638 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Sat, 11 Nov 2017 11:39:13 +0800 Subject: [PATCH 31/37] update kernel to 4.9.61 --- include/kernel-version.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/kernel-version.mk b/include/kernel-version.mk index 4dd13993a2..fdf4ac7752 100644 --- a/include/kernel-version.mk +++ b/include/kernel-version.mk @@ -4,11 +4,11 @@ LINUX_RELEASE?=1 LINUX_VERSION-3.18 = .71 LINUX_VERSION-4.4 = .93 -LINUX_VERSION-4.9 = .60 +LINUX_VERSION-4.9 = .61 LINUX_KERNEL_HASH-3.18.71 = 5abc9778ad44ce02ed6c8ab52ece8a21c6d20d21f6ed8a19287b4a38a50c1240 LINUX_KERNEL_HASH-4.4.93 = ed349314f16e78a6571b5f8884f6452782aef6c26b81bcc7ccdac44ecd917c36 -LINUX_KERNEL_HASH-4.9.60 = 0e326c5c5152c41265d1c681b41b52afce1925f4a382dfd41cb93605f3fcad04 +LINUX_KERNEL_HASH-4.9.61 = e0239675728ef0c3697d4b651a1d1a1dd7b2920ed2c5f05a23a23d4aa726d19e ifdef KERNEL_PATCHVER LINUX_VERSION:=$(KERNEL_PATCHVER)$(strip $(LINUX_VERSION-$(KERNEL_PATCHVER))) From 1fcd92469dfb66b1c0e66602fa42971f4d3292ab Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Sat, 11 Nov 2017 11:40:46 +0800 Subject: [PATCH 32/37] remove def-select autosamba to reduce rom size --- include/target.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/target.mk b/include/target.mk index 900c39d231..b18031f8d6 100644 --- a/include/target.mk +++ b/include/target.mk @@ -14,7 +14,7 @@ DEVICE_TYPE?=router # Default packages - the really basic set DEFAULT_PACKAGES:=base-files libc libgcc busybox dropbear mtd uci opkg netifd fstools uclient-fetch logd \ -iptables-mod-nat-extra kmod-nf-nathelper kmod-nf-nathelper-extra kmod-macvlan block-mount automount autosamba\ +iptables-mod-nat-extra kmod-nf-nathelper kmod-nf-nathelper-extra kmod-macvlan block-mount automount \ default-settings ipset-lists luci luci-app-ddns luci-app-sqm luci-app-upnp luci-app-adbyby-plus luci-app-autoreboot \ luci-app-filetransfer luci-app-shadowsocksr-pro luci-app-usb-printer luci-app-vsftpd luci-app-sfe \ luci-app-pptp-server luci-app-ipsec-vpnd luci-app-vlmcsd luci-app-wifischedule luci-app-wol luci-app-nlbwmon From a05e0905fc5d0545bb014376b71d72e7c752a189 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Sat, 11 Nov 2017 11:41:55 +0800 Subject: [PATCH 33/37] update versin to R7.4.4 --- package/lean/default-settings/Makefile | 2 +- package/lean/default-settings/files/zzz-default-settings | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package/lean/default-settings/Makefile b/package/lean/default-settings/Makefile index 3d0a11a763..4cfd87bd34 100644 --- a/package/lean/default-settings/Makefile +++ b/package/lean/default-settings/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=default-settings PKG_VERSION:=1.0 -PKG_RELEASE:=25 +PKG_RELEASE:=26 PKG_LICENSE:=GPLv3 PKG_LICENSE_FILES:=LICENSE diff --git a/package/lean/default-settings/files/zzz-default-settings b/package/lean/default-settings/files/zzz-default-settings index 0134b3aad5..e9c1b06df3 100755 --- a/package/lean/default-settings/files/zzz-default-settings +++ b/package/lean/default-settings/files/zzz-default-settings @@ -47,7 +47,7 @@ sed -i '/set wireless.radio${devidx}.disabled/d' /lib/wifi/mac80211.sh wifi up sed -i '/DISTRIB_REVISION/d' /etc/openwrt_release -echo "DISTRIB_REVISION='R7.4.3 By Lean'" >> /etc/openwrt_release +echo "DISTRIB_REVISION='R7.4.4 By Lean'" >> /etc/openwrt_release sed -i '/DISTRIB_DESCRIPTION/d' /etc/openwrt_release echo "DISTRIB_DESCRIPTION='LEDE 17.01.4'" >> /etc/openwrt_release From 2788000ec24f059ecf9c470e0902274b9155340d Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Sat, 11 Nov 2017 11:44:30 +0800 Subject: [PATCH 34/37] update zh-cn translate for luci-app-ssr-pro --- package/lean/luci-app-shadowsocksr-pro/Makefile | 2 +- .../lean/luci-app-shadowsocksr-pro/po/zh-cn/ssrpro.po | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/package/lean/luci-app-shadowsocksr-pro/Makefile b/package/lean/luci-app-shadowsocksr-pro/Makefile index 79970eac8b..747a2dd808 100644 --- a/package/lean/luci-app-shadowsocksr-pro/Makefile +++ b/package/lean/luci-app-shadowsocksr-pro/Makefile @@ -9,7 +9,7 @@ LUCI_TITLE:=LuCI support for Shadowsocksr LUCI_DEPENDS:=+iptables-mod-tproxy +kmod-ipt-tproxy +ip +ipset-lists +shadowsocksr-libev-alt +pdnsd-alt +coreutils +coreutils-base64 +coreutils-nohup +dnsmasq-full LUCI_PKGARCH:=all PKG_VERSION:=2.0 -PKG_RELEASE:=19 +PKG_RELEASE:=20 include $(TOPDIR)/feeds/luci/luci.mk diff --git a/package/lean/luci-app-shadowsocksr-pro/po/zh-cn/ssrpro.po b/package/lean/luci-app-shadowsocksr-pro/po/zh-cn/ssrpro.po index 98da510884..3727ca95b2 100644 --- a/package/lean/luci-app-shadowsocksr-pro/po/zh-cn/ssrpro.po +++ b/package/lean/luci-app-shadowsocksr-pro/po/zh-cn/ssrpro.po @@ -97,6 +97,15 @@ msgstr "GFW-List附加IP" msgid "
(!)Note: IP add-in to GFW-List. Such as Telegram Messenger" msgstr "
(!)注意:有些应用使用IP而不是域名,例如 Telegram Messenger ,您需要把IP地址加入这里" +msgid "No Proxy" +msgstr "不带理" + +msgid "Global Proxy" +msgstr "全局代理" + +msgid "Game Mode" +msgstr "游戏模式" + From 50acd9e10a8aada62de57f101b0a7a6701b680df Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Sat, 11 Nov 2017 17:17:17 +0800 Subject: [PATCH 35/37] ssr pro zh-cn translate --- package/lean/luci-app-shadowsocksr-pro/po/zh-cn/ssrpro.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/lean/luci-app-shadowsocksr-pro/po/zh-cn/ssrpro.po b/package/lean/luci-app-shadowsocksr-pro/po/zh-cn/ssrpro.po index 3727ca95b2..f4c084b4f8 100644 --- a/package/lean/luci-app-shadowsocksr-pro/po/zh-cn/ssrpro.po +++ b/package/lean/luci-app-shadowsocksr-pro/po/zh-cn/ssrpro.po @@ -98,7 +98,7 @@ msgid "
(!)Note: IP add-in to GFW-List. Such as Telegram Messenger" msgstr "
(!)注意:有些应用使用IP而不是域名,例如 Telegram Messenger ,您需要把IP地址加入这里" msgid "No Proxy" -msgstr "不带理" +msgstr "不代理" msgid "Global Proxy" msgstr "全局代理" From 6bec5daf842a76a8b62410955e3ce464863094f2 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Sat, 11 Nov 2017 23:26:14 +0800 Subject: [PATCH 36/37] update luci ipsec vpn firewall rules --- package/lean/luci-app-ipsec-vpnd/Makefile | 2 +- package/lean/luci-app-ipsec-vpnd/root/etc/ipsec.include | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/package/lean/luci-app-ipsec-vpnd/Makefile b/package/lean/luci-app-ipsec-vpnd/Makefile index a145e33292..1bf6299b67 100644 --- a/package/lean/luci-app-ipsec-vpnd/Makefile +++ b/package/lean/luci-app-ipsec-vpnd/Makefile @@ -9,7 +9,7 @@ LUCI_TITLE:=LuCI support for IPSec VPN Server (IKEv1 with PSK and Xauth) LUCI_DEPENDS:=+strongswan-minimal +strongswan-mod-xauth-generic LUCI_PKGARCH:=all PKG_VERSION:=2.0 -PKG_RELEASE:=5 +PKG_RELEASE:=6 include $(TOPDIR)/feeds/luci/luci.mk diff --git a/package/lean/luci-app-ipsec-vpnd/root/etc/ipsec.include b/package/lean/luci-app-ipsec-vpnd/root/etc/ipsec.include index 84129f6439..d887c623d0 100755 --- a/package/lean/luci-app-ipsec-vpnd/root/etc/ipsec.include +++ b/package/lean/luci-app-ipsec-vpnd/root/etc/ipsec.include @@ -1,3 +1,8 @@ +iptables -D FORWARD -m policy --dir in --pol ipsec --proto esp -j ACCEPT 2>/dev/null +iptables -D FORWARD -m policy --dir out --pol ipsec --proto esp -j ACCEPT 2>/dev/null +iptables -D INPUT -m policy --dir in --pol ipsec --proto esp -j ACCEPT 2>/dev/null +iptables -D OUTPUT -m policy --dir out --pol ipsec --proto esp -j ACCEPT 2>/dev/null + iptables -I FORWARD -m policy --dir in --pol ipsec --proto esp -j ACCEPT iptables -I FORWARD -m policy --dir out --pol ipsec --proto esp -j ACCEPT iptables -I INPUT -m policy --dir in --pol ipsec --proto esp -j ACCEPT From e04efc21acf91acde6814a11bae61304ec56f1f0 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Sat, 11 Nov 2017 23:37:17 +0800 Subject: [PATCH 37/37] fix mvebu now using kernel 4.4 --- target/linux/mvebu/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/target/linux/mvebu/Makefile b/target/linux/mvebu/Makefile index a07aa7cf2d..e319a8f822 100644 --- a/target/linux/mvebu/Makefile +++ b/target/linux/mvebu/Makefile @@ -14,7 +14,7 @@ CPU_TYPE:=cortex-a9 CPU_SUBTYPE:=vfpv3 MAINTAINER:=Imre Kaloz -KERNEL_PATCHVER:=4.9 +KERNEL_PATCHVER:=4.4 include $(INCLUDE_DIR)/target.mk