Merge Official Source
Signed-off-by: ZiMing Mo <msylgj@immortalwrt.org>
This commit is contained in:
commit
f761272538
@ -1,2 +1,2 @@
|
||||
LINUX_VERSION-6.1 = .80
|
||||
LINUX_KERNEL_HASH-6.1.80 = 568ecaaebb8b87c7c8246bba67bc83402972bf34f5811651a2d3cd548ff7b671
|
||||
LINUX_VERSION-6.1 = .81
|
||||
LINUX_KERNEL_HASH-6.1.81 = 0ebd861c6fd47bb0a9d3a09664d704833d1a54750c7bf9c4ad8b5e9cbd49342b
|
||||
|
2
include/kernel-6.6
Normal file
2
include/kernel-6.6
Normal file
@ -0,0 +1,2 @@
|
||||
LINUX_VERSION-6.6 = .20
|
||||
LINUX_KERNEL_HASH-6.6.20 = e2f6c7f39b304248193370f8c5755553ab73ad5672e92dae994a344084d8dd22
|
@ -74,6 +74,7 @@ belkin,rt1800|\
|
||||
h3c,tx1800-plus|\
|
||||
h3c,tx1801-plus|\
|
||||
h3c,tx1806|\
|
||||
iptime,ax2004m|\
|
||||
jcg,q20|\
|
||||
jcg,q20-pb-boot|\
|
||||
linksys,e7350|\
|
||||
@ -94,6 +95,7 @@ ravpower,rp-wd03)
|
||||
ubootenv_add_uci_config "/dev/mtd$idx" "0x4000" "0x1000" "0x1000"
|
||||
;;
|
||||
beeline,smartbox-flash|\
|
||||
iptime,t5004|\
|
||||
linksys,ea6350-v4|\
|
||||
linksys,ea7300-v1|\
|
||||
linksys,ea7300-v2|\
|
||||
|
@ -171,7 +171,7 @@
|
||||
+ipaddr=192.168.1.1
|
||||
+serverip=192.168.1.254
|
||||
+loadaddr=0x48000000
|
||||
+bootargs=root=/dev/fit0
|
||||
+bootargs=root=/dev/fit0 rootwait
|
||||
+bootcmd=if pstore check ; then run boot_recovery ; else run boot_sdmmc ; fi
|
||||
+bootconf=config-1#mt7622-bananapi-bpi-r64-pcie1
|
||||
+bootconf_pcie=config-1#mt7622-bananapi-bpi-r64-pcie1
|
||||
@ -411,7 +411,7 @@
|
||||
+serverip=192.168.1.254
|
||||
+loadaddr=0x48000000
|
||||
+bootcmd=if pstore check ; then run boot_recovery ; else run boot_emmc ; fi
|
||||
+bootargs=root=/dev/fit0
|
||||
+bootargs=root=/dev/fit0 rootwait
|
||||
+bootconf=config-1#mt7622-bananapi-bpi-r64-pcie1
|
||||
+bootconf_pcie=config-1#mt7622-bananapi-bpi-r64-pcie1
|
||||
+bootconf_sata=config-1#mt7622-bananapi-bpi-r64-sata
|
||||
@ -617,7 +617,7 @@
|
||||
+ipaddr=192.168.1.1
|
||||
+serverip=192.168.1.254
|
||||
+loadaddr=0x48000000
|
||||
+bootargs=ubi.block=0,fit root=/dev/fit0
|
||||
+bootargs=ubi.block=0,fit root=/dev/fit0 rootwait
|
||||
+bootcmd=if pstore check ; then run boot_recovery ; else run boot_ubi ; fi
|
||||
+bootconf=config-1#mt7622-bananapi-bpi-r64-pcie1
|
||||
+bootconf_pcie=config-1#mt7622-bananapi-bpi-r64-pcie1
|
||||
|
@ -802,7 +802,7 @@
|
||||
+serverip=192.168.1.254
|
||||
+loadaddr=0x46000000
|
||||
+console=earlycon=uart8250,mmio32,0x11002000 console=ttyS0
|
||||
+bootargs=root=/dev/fit0
|
||||
+bootargs=root=/dev/fit0 rootwait
|
||||
+bootcmd=if pstore check ; then run boot_recovery ; else run boot_sdmmc ; fi
|
||||
+bootconf=config-mt7986a-bananapi-bpi-r3
|
||||
+bootconf_base=config-mt7986a-bananapi-bpi-r3
|
||||
@ -886,7 +886,7 @@
|
||||
+serverip=192.168.1.254
|
||||
+loadaddr=0x46000000
|
||||
+console=earlycon=uart8250,mmio32,0x11002000 console=ttyS0
|
||||
+bootargs=root=/dev/fit0
|
||||
+bootargs=root=/dev/fit0 rootwait
|
||||
+bootcmd=if pstore check ; then run boot_recovery ; else run boot_nor ; fi
|
||||
+bootconf=config-mt7986a-bananapi-bpi-r3
|
||||
+bootconf_base=config-mt7986a-bananapi-bpi-r3
|
||||
@ -949,7 +949,7 @@
|
||||
+serverip=192.168.1.254
|
||||
+loadaddr=0x46000000
|
||||
+console=earlycon=uart8250,mmio32,0x11002000 console=ttyS0
|
||||
+bootargs=root=/dev/fit0
|
||||
+bootargs=root=/dev/fit0 rootwait
|
||||
+bootconf=config-mt7986a-bananapi-bpi-r3
|
||||
+bootconf_base=config-mt7986a-bananapi-bpi-r3
|
||||
+bootconf_nor=mt7986a-bananapi-bpi-r3-nor
|
||||
@ -1025,7 +1025,7 @@
|
||||
+serverip=192.168.1.254
|
||||
+loadaddr=0x46000000
|
||||
+console=earlycon=uart8250,mmio32,0x11002000 console=ttyS0
|
||||
+bootargs=root=/dev/fit0
|
||||
+bootargs=root=/dev/fit0 rootwait
|
||||
+bootcmd=if pstore check ; then run boot_recovery ; else run boot_emmc ; fi
|
||||
+bootconf=config-mt7986a-bananapi-bpi-r3
|
||||
+bootconf_base=config-mt7986a-bananapi-bpi-r3
|
||||
|
@ -417,7 +417,7 @@
|
||||
+serverip=192.168.1.254
|
||||
+loadaddr=0x46000000
|
||||
+console=earlycon=uart8250,mmio32,0x11002000 console=ttyS0
|
||||
+bootargs=root=ubi.block=0,fit root=/dev/fit0
|
||||
+bootargs=root=ubi.block=0,fit root=/dev/fit0 rootwait
|
||||
+bootcmd=if pstore check ; then run boot_recovery ; else run boot_ubi ; fi
|
||||
+bootconf=config-mt7986a-bananapi-bpi-r3-mini
|
||||
+bootdelay=0
|
||||
@ -481,7 +481,7 @@
|
||||
+serverip=192.168.1.254
|
||||
+loadaddr=0x46000000
|
||||
+console=earlycon=uart8250,mmio32,0x11002000 console=ttyS0
|
||||
+bootargs=root=/dev/fit0
|
||||
+bootargs=root=/dev/fit0 rootwait
|
||||
+bootcmd=if pstore check ; then run boot_recovery ; else run boot_emmc ; fi
|
||||
+bootconf=config-mt7986a-bananapi-bpi-r3-mini
|
||||
+bootdelay=0
|
||||
|
@ -555,7 +555,7 @@
|
||||
+ipaddr=192.168.1.1
|
||||
+serverip=192.168.1.254
|
||||
+loadaddr=0x50000000
|
||||
+bootargs=console=ttyS0,115200n1 pci=pcie_bus_perf root=/dev/fit0
|
||||
+bootargs=console=ttyS0,115200n1 pci=pcie_bus_perf root=/dev/fit0 rootwait
|
||||
+bootcmd=if pstore check ; then run boot_recovery ; else run boot_sdmmc ; fi
|
||||
+bootconf=config-mt7988a-bananapi-bpi-r4
|
||||
+bootconf_sd=mt7988a-bananapi-bpi-r4-sd
|
||||
@ -624,7 +624,7 @@
|
||||
+ipaddr=192.168.1.1
|
||||
+serverip=192.168.1.254
|
||||
+loadaddr=0x50000000
|
||||
+bootargs=console=ttyS0,115200n1 pci=pcie_bus_perf root=/dev/fit0 ubi.block=0,fit
|
||||
+bootargs=console=ttyS0,115200n1 pci=pcie_bus_perf root=/dev/fit0 rootwait ubi.block=0,fit
|
||||
+bootconf=config-mt7988a-bananapi-bpi-r4
|
||||
+bootconf_extra=mt7988a-bananapi-bpi-r4-emmc
|
||||
+bootcmd=if pstore check ; then run boot_recovery ; else run boot_ubi ; fi
|
||||
@ -694,7 +694,7 @@
|
||||
+ipaddr=192.168.1.1
|
||||
+serverip=192.168.1.254
|
||||
+loadaddr=0x50000000
|
||||
+bootargs=console=ttyS0,115200n1 pci=pcie_bus_perf root=/dev/fit0
|
||||
+bootargs=console=ttyS0,115200n1 pci=pcie_bus_perf root=/dev/fit0 rootwait
|
||||
+bootcmd=if pstore check ; then run boot_recovery ; else run boot_emmc ; fi
|
||||
+bootconf=config-mt7988a-bananapi-bpi-r4
|
||||
+bootconf_base=config-mt7988a-bananapi-bpi-r4
|
||||
|
@ -8,12 +8,12 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=intel-microcode
|
||||
PKG_VERSION:=20230808
|
||||
PKG_VERSION:=20231114
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE:=intel-microcode_3.$(PKG_VERSION).1.tar.xz
|
||||
PKG_SOURCE_URL:=@DEBIAN/pool/non-free-firmware/i/intel-microcode/
|
||||
PKG_HASH:=29e77c275b3f60a691832c0844f70effbd94a4594d04af21e0c2e6e0c1ac1894
|
||||
PKG_HASH:=637ac30d3fc36eb51d3ed71909f09f7408797f4527c20e58d3b0ad4eafc20869
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/intel-microcode-3.$(PKG_VERSION).1
|
||||
PKG_CPE_ID:=cpe:/a:intel:microcode
|
||||
|
||||
|
@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/version.mk
|
||||
|
||||
PKG_NAME:=ipq-wifi
|
||||
PKG_RELEASE:=1
|
||||
PKG_RELEASE:=2
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL=$(PROJECT_GIT)/project/firmware/qca-wireless.git
|
||||
@ -53,7 +53,6 @@ ALLWIFIBOARDS:= \
|
||||
yyets_le1 \
|
||||
yuncore_ax880 \
|
||||
zte_mf269 \
|
||||
zte_mf289f \
|
||||
zte_mf287 \
|
||||
zte_mf287plus \
|
||||
zyxel_nbg7815
|
||||
@ -171,7 +170,6 @@ $(eval $(call generate-ipq-wifi-package,xiaomi_ax9000,Xiaomi AX9000))
|
||||
$(eval $(call generate-ipq-wifi-package,yyets_le1,YYeTs LE1))
|
||||
$(eval $(call generate-ipq-wifi-package,yuncore_ax880,Yuncore AX880))
|
||||
$(eval $(call generate-ipq-wifi-package,zte_mf269,ZTE MF269))
|
||||
$(eval $(call generate-ipq-wifi-package,zte_mf289f,ZTE MF289F))
|
||||
$(eval $(call generate-ipq-wifi-package,zte_mf287,ZTE MF287))
|
||||
$(eval $(call generate-ipq-wifi-package,zte_mf287plus,ZTE MF287Plus))
|
||||
$(eval $(call generate-ipq-wifi-package,zyxel_nbg7815,Zyxel NBG7815))
|
||||
|
@ -29,6 +29,15 @@ define Package/rtl8188eu-firmware/install
|
||||
endef
|
||||
$(eval $(call BuildPackage,rtl8188eu-firmware))
|
||||
|
||||
Package/rtl8188fu-firmware = $(call Package/firmware-default,RealTek RTL8188FU firmware)
|
||||
define Package/rtl8188fu-firmware/install
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/rtlwifi
|
||||
$(CP) \
|
||||
$(PKG_BUILD_DIR)/rtlwifi/rtl8188fufw.bin \
|
||||
$(1)/lib/firmware/rtlwifi
|
||||
endef
|
||||
$(eval $(call BuildPackage,rtl8188fu-firmware))
|
||||
|
||||
Package/rtl8192ce-firmware = $(call Package/firmware-default,RealTek RTL8192CE firmware)
|
||||
define Package/rtl8192ce-firmware/install
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/rtlwifi
|
||||
|
@ -0,0 +1,11 @@
|
||||
--- a/ath10k-6.4/wmi.h
|
||||
+++ b/ath10k-6.4/wmi.h
|
||||
@@ -6341,7 +6341,7 @@ struct qca9880_set_ctl_table_cmd {
|
||||
__le32 ctl_len; /* in bytes. This may be ignored in firmware,
|
||||
* make sure ctl_info data is sizeof(qca9880_power_ctl) */
|
||||
/** ctl array (len adjusted to number of words) */
|
||||
- __le32 ctl_info[1]; /* data would be the qca9880_power_ctl table above */
|
||||
+ __le32 ctl_info[]; /* data would be the qca9880_power_ctl table above */
|
||||
};
|
||||
|
||||
/* Used by: WMI_PDEV_SET_MIMOGAIN_TABLE_CMDID */
|
@ -538,8 +538,9 @@ static int gpio_keys_button_probe(struct platform_device *pdev,
|
||||
struct device_node *child =
|
||||
of_get_next_child(dev->of_node, prev);
|
||||
|
||||
bdata->gpiod = devm_gpiod_get_from_of_node(dev,
|
||||
child, "gpios", 0, GPIOD_IN, desc);
|
||||
bdata->gpiod = devm_fwnode_gpiod_get(dev,
|
||||
of_fwnode_handle(child), NULL, GPIOD_IN,
|
||||
desc);
|
||||
|
||||
prev = child;
|
||||
}
|
||||
|
@ -263,7 +263,7 @@ define KernelPackage/iscsi-initiator
|
||||
CONFIG_INET \
|
||||
CONFIG_SCSI_LOWLEVEL=y \
|
||||
CONFIG_ISCSI_TCP \
|
||||
CONFIG_SCSI_ISCSI_ATTRS=y
|
||||
CONFIG_SCSI_ISCSI_ATTRS
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/drivers/scsi/iscsi_tcp.ko \
|
||||
$(LINUX_DIR)/drivers/scsi/libiscsi.ko \
|
||||
|
@ -39,10 +39,11 @@ define KernelPackage/crypto-aead
|
||||
TITLE:=CryptoAPI AEAD support
|
||||
KCONFIG:= \
|
||||
CONFIG_CRYPTO_AEAD \
|
||||
CONFIG_CRYPTO_AEAD2
|
||||
CONFIG_CRYPTO_AEAD2 \
|
||||
CONFIG_CRYPTO_GENIV@lt6.6
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/crypto/aead.ko \
|
||||
$(LINUX_DIR)/crypto/geniv.ko
|
||||
$(LINUX_DIR)/crypto/geniv.ko@lt6.6
|
||||
AUTOLOAD:=$(call AutoLoad,09,aead,1)
|
||||
$(call AddDepends/crypto, +kmod-crypto-null)
|
||||
endef
|
||||
@ -216,7 +217,7 @@ $(eval $(call KernelPackage,crypto-ecb))
|
||||
|
||||
define KernelPackage/crypto-ecdh
|
||||
TITLE:=ECDH algorithm
|
||||
DEPENDS:=+kmod-crypto-kpp
|
||||
DEPENDS:=+kmod-crypto-kpp +kmod-crypto-rng
|
||||
KCONFIG:= CONFIG_CRYPTO_ECDH
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/crypto/ecdh_generic.ko \
|
||||
@ -230,7 +231,7 @@ $(eval $(call KernelPackage,crypto-ecdh))
|
||||
|
||||
define KernelPackage/crypto-echainiv
|
||||
TITLE:=Encrypted Chain IV Generator
|
||||
DEPENDS:=+kmod-crypto-aead
|
||||
DEPENDS:=+kmod-crypto-aead +LINUX_6_6:kmod-crypto-geniv
|
||||
KCONFIG:=CONFIG_CRYPTO_ECHAINIV
|
||||
FILES:=$(LINUX_DIR)/crypto/echainiv.ko
|
||||
AUTOLOAD:=$(call AutoLoad,09,echainiv)
|
||||
@ -846,7 +847,8 @@ define KernelPackage/crypto-rsa
|
||||
KCONFIG:= CONFIG_CRYPTO_RSA
|
||||
HIDDEN:=1
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/lib/mpi/mpi.ko \
|
||||
$(LINUX_DIR)/lib/mpi/mpi.ko@lt6.5 \
|
||||
$(LINUX_DIR)/lib/crypto/mpi/mpi.ko@ge6.5 \
|
||||
$(LINUX_DIR)/crypto/akcipher.ko \
|
||||
$(LINUX_DIR)/crypto/rsa_generic.ko
|
||||
AUTOLOAD:=$(call AutoLoad,10,rsa_generic)
|
||||
@ -870,7 +872,7 @@ $(eval $(call KernelPackage,crypto-rmd160))
|
||||
|
||||
define KernelPackage/crypto-rng
|
||||
TITLE:=CryptoAPI random number generation
|
||||
DEPENDS:=+kmod-crypto-hash +kmod-crypto-hmac +kmod-crypto-sha512
|
||||
DEPENDS:=+kmod-crypto-hash +kmod-crypto-hmac +kmod-crypto-sha512 +LINUX_6_6:kmod-crypto-sha3
|
||||
KCONFIG:= \
|
||||
CONFIG_CRYPTO_DRBG \
|
||||
CONFIG_CRYPTO_DRBG_HMAC=y \
|
||||
@ -889,9 +891,22 @@ endef
|
||||
$(eval $(call KernelPackage,crypto-rng))
|
||||
|
||||
|
||||
define KernelPackage/crypto-geniv
|
||||
TITLE:=CryptoAPI Shared IV generator
|
||||
HIDDEN:=1
|
||||
DEPENDS:=+kmod-crypto-rng +kmod-crypto-aead @LINUX_6_6
|
||||
KCONFIG:=CONFIG_CRYPTO_GENIV
|
||||
FILES:=$(LINUX_DIR)/crypto/geniv.ko
|
||||
AUTOLOAD:=$(call AutoLoad,09,geniv)
|
||||
$(call AddDepends/crypto)
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,crypto-geniv))
|
||||
|
||||
|
||||
define KernelPackage/crypto-seqiv
|
||||
TITLE:=CryptoAPI Sequence Number IV Generator
|
||||
DEPENDS:=+kmod-crypto-aead +kmod-crypto-rng
|
||||
DEPENDS:=+kmod-crypto-aead +kmod-crypto-rng +LINUX_6_6:kmod-crypto-geniv
|
||||
KCONFIG:=CONFIG_CRYPTO_SEQIV
|
||||
FILES:=$(LINUX_DIR)/crypto/seqiv.ko
|
||||
AUTOLOAD:=$(call AutoLoad,09,seqiv)
|
||||
|
@ -10,7 +10,7 @@ FS_MENU:=Filesystems
|
||||
define KernelPackage/fs-9p
|
||||
SUBMENU:=$(FS_MENU)
|
||||
TITLE:=Plan 9 Resource Sharing Support
|
||||
DEPENDS:=+kmod-9pnet +LINUX_6_1:kmod-fs-netfs
|
||||
DEPENDS:=+kmod-9pnet +LINUX_6_1:kmod-fs-netfs +LINUX_6_6:kmod-fs-netfs
|
||||
KCONFIG:=\
|
||||
CONFIG_9P_FS \
|
||||
CONFIG_9P_FS_POSIX_ACL=n \
|
||||
@ -87,6 +87,7 @@ define KernelPackage/fs-smbfs-common
|
||||
SUBMENU:=$(FS_MENU)
|
||||
TITLE:=SMBFS common dependencies support
|
||||
HIDDEN:=1
|
||||
DEPENDS:=+LINUX_6_6:kmod-fs-netfs +LINUX_6_6:kmod-nls-ucs2-utils
|
||||
KCONFIG:=\
|
||||
CONFIG_SMBFS_COMMON@lt6.1 \
|
||||
CONFIG_SMBFS@ge6.1
|
||||
@ -343,6 +344,7 @@ define KernelPackage/fs-jfs
|
||||
KCONFIG:=CONFIG_JFS_FS
|
||||
FILES:=$(LINUX_DIR)/fs/jfs/jfs.ko
|
||||
AUTOLOAD:=$(call AutoLoad,30,jfs,1)
|
||||
DEPENDS:=+LINUX_6_6:kmod-nls-ucs2-utils
|
||||
$(call AddDepends/nls)
|
||||
endef
|
||||
|
||||
@ -470,8 +472,7 @@ define KernelPackage/fs-nfs-common
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/fs/lockd/lockd.ko \
|
||||
$(LINUX_DIR)/net/sunrpc/sunrpc.ko \
|
||||
$(LINUX_DIR)/fs/nfs_common/grace.ko \
|
||||
$(LINUX_DIR)/fs/nfs_common/nfs_ssc.ko
|
||||
$(LINUX_DIR)/fs/nfs_common/grace.ko
|
||||
AUTOLOAD:=$(call AutoLoad,30,grace sunrpc lockd)
|
||||
endef
|
||||
|
||||
@ -712,6 +713,7 @@ define KernelPackage/pstore
|
||||
CONFIG_PSTORE_DEFLATE_COMPRESS_DEFAULT=y
|
||||
FILES:= $(LINUX_DIR)/fs/pstore/pstore.ko
|
||||
AUTOLOAD:=$(call AutoLoad,30,pstore,1)
|
||||
DEPENDS:=+LINUX_6_6:kmod-lib-zlib-deflate +LINUX_6_6:kmod-lib-zlib-inflate
|
||||
endef
|
||||
|
||||
define KernelPackage/pstore/description
|
||||
|
@ -34,7 +34,7 @@ define KernelPackage/hwmon-ad7418
|
||||
KCONFIG:=CONFIG_SENSORS_AD7418
|
||||
FILES:=$(LINUX_DIR)/drivers/hwmon/ad7418.ko
|
||||
AUTOLOAD:=$(call AutoLoad,60,ad7418 ad7418)
|
||||
$(call AddDepends/hwmon,+kmod-i2c-core)
|
||||
$(call AddDepends/hwmon,+kmod-i2c-core +LINUX_6_6:kmod-regmap-core)
|
||||
endef
|
||||
|
||||
define KernelPackage/hwmon-ad7418/description
|
||||
@ -52,7 +52,7 @@ define KernelPackage/hwmon-adt7410
|
||||
$(LINUX_DIR)/drivers/hwmon/adt7x10.ko \
|
||||
$(LINUX_DIR)/drivers/hwmon/adt7410.ko
|
||||
AUTOLOAD:=$(call AutoLoad,60,adt7x10 adt7410)
|
||||
$(call AddDepends/hwmon,+kmod-i2c-core +LINUX_6_1:kmod-regmap-core)
|
||||
$(call AddDepends/hwmon,+kmod-i2c-core +!LINUX_5_15:kmod-regmap-core)
|
||||
endef
|
||||
|
||||
define KernelPackage/hwmon-adt7410/description
|
||||
|
@ -383,7 +383,7 @@ $(eval $(call KernelPackage,iio-st_accel-spi))
|
||||
|
||||
|
||||
define KernelPackage/iio-lsm6dsx
|
||||
DEPENDS:=+kmod-iio-kfifo-buf +kmod-regmap-core
|
||||
DEPENDS:=+kmod-iio-kfifo-buf +kmod-regmap-core +LINUX_6_6:kmod-industrialio-triggered-buffer
|
||||
TITLE:=ST LSM6DSx driver for IMU MEMS sensors
|
||||
KCONFIG:=CONFIG_IIO_ST_LSM6DSX
|
||||
FILES:=$(LINUX_DIR)/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.ko
|
||||
|
@ -11,7 +11,7 @@ define KernelPackage/hid
|
||||
SUBMENU:=$(INPUT_MODULES_MENU)
|
||||
TITLE:=HID Devices
|
||||
DEPENDS:=+kmod-input-core +kmod-input-evdev
|
||||
KCONFIG:=CONFIG_HID CONFIG_HIDRAW=y CONFIG_HID_BATTERY_STRENGTH=y
|
||||
KCONFIG:=CONFIG_HID CONFIG_HID_SUPPORT=y CONFIG_HIDRAW=y CONFIG_HID_BATTERY_STRENGTH=y
|
||||
FILES:=$(LINUX_DIR)/drivers/hid/hid.ko
|
||||
AUTOLOAD:=$(call AutoLoad,61,hid)
|
||||
endef
|
||||
@ -179,7 +179,7 @@ $(eval $(call KernelPackage,input-touchscreen-ads7846))
|
||||
define KernelPackage/input-touchscreen-edt-ft5x06
|
||||
SUBMENU:=$(INPUT_MODULES_MENU)
|
||||
TITLE:=EDT FT5x06 and Focaltech FT6236 based touchscreens
|
||||
DEPENDS:=+kmod-i2c-core +kmod-input-core
|
||||
DEPENDS:=+kmod-i2c-core +kmod-input-core +LINUX_6_6:kmod-regmap-i2c
|
||||
KCONFIG:= \
|
||||
CONFIG_INPUT_TOUCHSCREEN=y \
|
||||
CONFIG_TOUCHSCREEN_EDT_FT5X06
|
||||
|
@ -378,7 +378,7 @@ $(eval $(call KernelPackage,phy-smsc))
|
||||
define KernelPackage/phy-airoha-en8811h
|
||||
SUBMENU:=$(NETWORK_DEVICES_MENU)
|
||||
TITLE:=Airoha EN8811H 2.5G Ethernet PHY
|
||||
DEPENDS:=+airoha-en8811h-firmware +kmod-libphy @LINUX_6_1
|
||||
DEPENDS:=+airoha-en8811h-firmware +kmod-libphy @!LINUX_5_15
|
||||
KCONFIG:=CONFIG_AIR_EN8811H_PHY
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/drivers/net/phy/air_en8811h.ko
|
||||
@ -1399,7 +1399,7 @@ $(eval $(call KernelPackage,mlx4-core))
|
||||
define KernelPackage/mlx5-core
|
||||
SUBMENU:=$(NETWORK_DEVICES_MENU)
|
||||
TITLE:=Mellanox ConnectX(R) mlx5 core Network Driver
|
||||
DEPENDS:=@PCI_SUPPORT +kmod-ptp +kmod-mlxfw
|
||||
DEPENDS:=@PCI_SUPPORT +kmod-ptp +kmod-mlxfw +LINUX_6_6:kmod-hwmon-core
|
||||
FILES:=$(LINUX_DIR)/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.ko
|
||||
KCONFIG:= CONFIG_MLX5_CORE \
|
||||
CONFIG_MLX5_CORE_EN=y \
|
||||
@ -1637,7 +1637,7 @@ $(eval $(call KernelPackage,pcs-xpcs))
|
||||
define KernelPackage/stmmac-core
|
||||
SUBMENU:=$(NETWORK_DEVICES_MENU)
|
||||
TITLE:=Synopsis Ethernet Controller core (NXP,STMMicro,others)
|
||||
DEPENDS:=@TARGET_x86_64||TARGET_armsr_armv8 +kmod-pcs-xpcs +kmod-ptp
|
||||
DEPENDS:=@TARGET_x86_64||TARGET_armsr_armv8 +kmod-pcs-xpcs +LINUX_6_6:kmod-of-mdio +kmod-ptp
|
||||
KCONFIG:=CONFIG_STMMAC_ETH \
|
||||
CONFIG_STMMAC_SELFTESTS=n \
|
||||
CONFIG_STMMAC_PLATFORM \
|
||||
|
@ -907,10 +907,26 @@ endef
|
||||
$(eval $(call KernelPackage,sched-ipset))
|
||||
|
||||
|
||||
define KernelPackage/sched-mqprio-common
|
||||
SUBMENU:=$(NETWORK_SUPPORT_MENU)
|
||||
TITLE:=mqprio queue common dependencies support
|
||||
DEPENDS:=@LINUX_6_6
|
||||
HIDDEN:=1
|
||||
KCONFIG:=CONFIG_NET_SCH_MQPRIO_LIB
|
||||
FILES:=$(LINUX_DIR)/net/sched/sch_mqprio_lib.ko
|
||||
endef
|
||||
|
||||
define KernelPackage/sched-mqprio-common/description
|
||||
Common library for manipulating mqprio queue configurations
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,sched-mqprio-common))
|
||||
|
||||
|
||||
define KernelPackage/sched-mqprio
|
||||
SUBMENU:=$(NETWORK_SUPPORT_MENU)
|
||||
TITLE:=Multi-queue priority scheduler (MQPRIO)
|
||||
DEPENDS:=+kmod-sched-core
|
||||
DEPENDS:=+kmod-sched-core +LINUX_6_6:kmod-sched-mqprio-common
|
||||
KCONFIG:=CONFIG_NET_SCH_MQPRIO
|
||||
FILES:=$(LINUX_DIR)/net/sched/sch_mqprio.ko
|
||||
AUTOLOAD:=$(call AutoProbe, sch_mqprio)
|
||||
|
@ -339,3 +339,20 @@ define KernelPackage/nls-utf8/description
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,nls-utf8))
|
||||
|
||||
|
||||
define KernelPackage/nls-ucs2-utils
|
||||
SUBMENU:=Native Language Support
|
||||
TITLE:=UCS-2 common library
|
||||
DEPENDS+=@LINUX_6_6
|
||||
HIDDEN:=1
|
||||
KCONFIG:=CONFIG_NLS_UCS2_UTILS
|
||||
FILES:=$(LINUX_DIR)/fs/nls/nls_ucs2_utils.ko
|
||||
$(call AddDepends/nls)
|
||||
endef
|
||||
|
||||
define KernelPackage/nls-ucs2-utils/description
|
||||
UCS-2 common library
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,nls-ucs2-utils))
|
||||
|
@ -459,6 +459,44 @@ endef
|
||||
$(eval $(call KernelPackage,usb-dwc2-pci))
|
||||
|
||||
|
||||
define KernelPackage/usb-cdns
|
||||
TITLE:=Cadence USB USB controller driver
|
||||
DEPENDS:=+USB_GADGET_SUPPORT:kmod-usb-gadget +kmod-usb-roles
|
||||
KCONFIG:= \
|
||||
CONFIG_USB_CDNS_SUPPORT
|
||||
FILES:= $(LINUX_DIR)/drivers/usb/cdns3/cdns-usb-common.ko
|
||||
AUTOLOAD:=$(call AutoLoad,50,cdns-usb-common,1)
|
||||
$(call AddDepends/usb)
|
||||
endef
|
||||
|
||||
define KernelPackage/usb-cdns/description
|
||||
This driver provides USB Device Controller support for the
|
||||
Cadence USB Core
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,usb-cdns))
|
||||
|
||||
|
||||
define KernelPackage/usb-cdns3
|
||||
TITLE:=Cadence USB3 USB controller driver
|
||||
DEPENDS:=+kmod-usb-cdns
|
||||
KCONFIG:= \
|
||||
CONFIG_USB_CDNS3 \
|
||||
CONFIG_USB_CDNS3_GADGET=y \
|
||||
CONFIG_USB_CDNS3_HOST=y
|
||||
FILES:= $(LINUX_DIR)/drivers/usb/cdns3/cdns3.ko
|
||||
AUTOLOAD:=$(call AutoLoad,54,cdns3,1)
|
||||
$(call AddDepends/usb)
|
||||
endef
|
||||
|
||||
define KernelPackage/usb-cdns3/description
|
||||
This driver provides support for the Dual Role SuperSpeed
|
||||
USB Controller based on the Cadence USB3 IP Core
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,usb-cdns3))
|
||||
|
||||
|
||||
define KernelPackage/usb-dwc3
|
||||
TITLE:=DWC3 USB controller driver
|
||||
KCONFIG:= \
|
||||
@ -1147,7 +1185,7 @@ define KernelPackage/usb-net-asix
|
||||
TITLE:=Kernel module for USB-to-Ethernet Asix convertors
|
||||
DEPENDS:= \
|
||||
+kmod-libphy +kmod-net-selftests +kmod-mdio-devres +kmod-phy-ax88796b \
|
||||
+LINUX_6_1:kmod-phylink
|
||||
+LINUX_6_1:kmod-phylink +LINUX_6_6:kmod-phylink
|
||||
KCONFIG:=CONFIG_USB_NET_AX8817X
|
||||
FILES:=$(LINUX_DIR)/drivers/$(USBNET_DIR)/asix.ko
|
||||
AUTOLOAD:=$(call AutoProbe,asix)
|
||||
@ -1275,7 +1313,7 @@ $(eval $(call KernelPackage,usb-net-smsc75xx))
|
||||
|
||||
define KernelPackage/usb-net-smsc95xx
|
||||
TITLE:=SMSC LAN95XX based USB 2.0 10/100 ethernet devices
|
||||
DEPENDS:=+kmod-libphy +kmod-phy-smsc +LINUX_6_1:kmod-net-selftests
|
||||
DEPENDS:=+kmod-libphy +kmod-phy-smsc +!LINUX_5_15:kmod-net-selftests
|
||||
KCONFIG:=CONFIG_USB_NET_SMSC95XX
|
||||
FILES:=$(LINUX_DIR)/drivers/$(USBNET_DIR)/smsc95xx.ko
|
||||
AUTOLOAD:=$(call AutoProbe,smsc95xx)
|
||||
@ -1568,7 +1606,7 @@ define KernelPackage/usb-hid-mcp2221
|
||||
SUBMENU:=$(USB_MENU)
|
||||
TITLE:=Microchip USB 2.0 to I2C/UART Protocol Converter with GPIO
|
||||
KCONFIG:=CONFIG_HID_MCP2221
|
||||
DEPENDS:=@GPIO_SUPPORT +kmod-usb-hid +kmod-i2c-core
|
||||
DEPENDS:=@GPIO_SUPPORT +kmod-usb-hid +kmod-i2c-core +LINUX_6_6:kmod-iio-core
|
||||
FILES:=$(LINUX_DIR)/drivers/hid/hid-mcp2221.ko
|
||||
AUTOLOAD:=$(call AutoProbe,hid-mcp2221)
|
||||
endef
|
||||
|
@ -265,11 +265,15 @@ define KernelPackage/drm
|
||||
HIDDEN:=1
|
||||
DEPENDS:=+kmod-dma-buf +kmod-i2c-core +PACKAGE_kmod-backlight:kmod-backlight \
|
||||
+kmod-fb
|
||||
KCONFIG:=CONFIG_DRM
|
||||
KCONFIG:=CONFIG_DRM \
|
||||
CONFIG_DRM_EXEC@ge6.6 \
|
||||
CONFIG_DRM_SUBALLOC_HELPER@ge6.4
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/drivers/gpu/drm/drm.ko \
|
||||
$(LINUX_DIR)/drivers/gpu/drm/drm_panel_orientation_quirks.ko
|
||||
AUTOLOAD:=$(call AutoLoad,05,drm)
|
||||
$(LINUX_DIR)/drivers/gpu/drm/drm_panel_orientation_quirks.ko \
|
||||
$(LINUX_DIR)/drivers/gpu/drm/drm_exec.ko@ge6.6 \
|
||||
$(LINUX_DIR)/drivers/gpu/drm/drm_suballoc_helper.ko@ge6.4
|
||||
AUTOLOAD:=$(call AutoLoad,05,drm_exec@ge6.6 drm_suballoc_helper@ge6.4 drm)
|
||||
endef
|
||||
|
||||
define KernelPackage/drm/description
|
||||
@ -282,7 +286,7 @@ $(eval $(call KernelPackage,drm))
|
||||
define KernelPackage/drm-buddy
|
||||
SUBMENU:=$(VIDEO_MENU)
|
||||
TITLE:=A page based buddy allocator
|
||||
DEPENDS:=@DISPLAY_SUPPORT +kmod-drm @LINUX_6_1
|
||||
DEPENDS:=@DISPLAY_SUPPORT +kmod-drm @LINUX_6_1||LINUX_6_6
|
||||
KCONFIG:=CONFIG_DRM_BUDDY
|
||||
FILES:= $(LINUX_DIR)/drivers/gpu/drm/drm_buddy.ko
|
||||
AUTOLOAD:=$(call AutoProbe,drm_buddy)
|
||||
@ -297,7 +301,7 @@ $(eval $(call KernelPackage,drm-buddy))
|
||||
define KernelPackage/drm-display-helper
|
||||
SUBMENU:=$(VIDEO_MENU)
|
||||
TITLE:=DRM helpers for display adapters drivers
|
||||
DEPENDS:=@DISPLAY_SUPPORT +kmod-drm-kms-helper @LINUX_6_1
|
||||
DEPENDS:=@DISPLAY_SUPPORT +kmod-drm-kms-helper @LINUX_6_1||LINUX_6_6
|
||||
KCONFIG:=CONFIG_DRM_DISPLAY_HELPER
|
||||
FILES:=$(LINUX_DIR)/drivers/gpu/drm/display/drm_display_helper.ko
|
||||
AUTOLOAD:=$(call AutoProbe,drm_display_helper)
|
||||
@ -382,7 +386,8 @@ define KernelPackage/drm-amdgpu
|
||||
CONFIG_DRM_AMD_DC=y \
|
||||
CONFIG_DEBUG_KERNEL_DC=n
|
||||
FILES:=$(LINUX_DIR)/drivers/gpu/drm/amd/amdgpu/amdgpu.ko \
|
||||
$(LINUX_DIR)/drivers/gpu/drm/scheduler/gpu-sched.ko
|
||||
$(LINUX_DIR)/drivers/gpu/drm/scheduler/gpu-sched.ko \
|
||||
$(LINUX_DIR)/drivers/gpu/drm/amd/amdxcp/amdxcp.ko@ge6.5
|
||||
AUTOLOAD:=$(call AutoProbe,amdgpu)
|
||||
endef
|
||||
|
||||
@ -629,9 +634,10 @@ $(eval $(call KernelPackage,video-pwc))
|
||||
define KernelPackage/video-uvc
|
||||
TITLE:=USB Video Class (UVC) support
|
||||
DEPENDS:=@USB_SUPPORT +kmod-usb-core +kmod-video-videobuf2 +kmod-input-core
|
||||
KCONFIG:= CONFIG_USB_VIDEO_CLASS
|
||||
FILES:=$(LINUX_DIR)/drivers/media/$(V4L2_USB_DIR)/uvc/uvcvideo.ko
|
||||
AUTOLOAD:=$(call AutoProbe,uvcvideo)
|
||||
KCONFIG:= CONFIG_USB_VIDEO_CLASS CONFIG_UVC_COMMON@ge6.3
|
||||
FILES:=$(LINUX_DIR)/drivers/media/$(V4L2_USB_DIR)/uvc/uvcvideo.ko \
|
||||
$(LINUX_DIR)/drivers/media/common/uvc.ko@ge6.3
|
||||
AUTOLOAD:=$(call AutoProbe,uvc@ge6.3 uvcvideo)
|
||||
$(call AddDepends/camera)
|
||||
endef
|
||||
|
||||
|
@ -434,6 +434,7 @@ define KernelPackage/brcmfmac/config
|
||||
bool "Enable SDIO bus interface support"
|
||||
default y if TARGET_bcm27xx
|
||||
default y if TARGET_imx_cortexa7
|
||||
default y if TARGET_starfive
|
||||
default y if TARGET_rockchip
|
||||
default y if TARGET_sunxi
|
||||
default n
|
||||
|
@ -0,0 +1,32 @@
|
||||
--- a/backport-include/net/genetlink.h
|
||||
+++ b/backport-include/net/genetlink.h
|
||||
@@ -3,6 +3,7 @@
|
||||
#include_next <net/genetlink.h>
|
||||
#include <linux/version.h>
|
||||
|
||||
+#if LINUX_VERSION_IS_LESS(4,12,0)
|
||||
static inline void __bp_genl_info_userhdr_set(struct genl_info *info,
|
||||
void *userhdr)
|
||||
{
|
||||
@@ -14,7 +15,6 @@ static inline void *__bp_genl_info_userh
|
||||
return info->userhdr;
|
||||
}
|
||||
|
||||
-#if LINUX_VERSION_IS_LESS(4,12,0)
|
||||
#define GENL_SET_ERR_MSG(info, msg) NL_SET_ERR_MSG(genl_info_extack(info), msg)
|
||||
|
||||
static inline int genl_err_attr(struct genl_info *info, int err,
|
||||
@@ -44,11 +44,13 @@ static inline struct netlink_ext_ack *ge
|
||||
#endif
|
||||
}
|
||||
|
||||
+#if LINUX_VERSION_IS_LESS(6,6,0)
|
||||
/* this gets put in place of info->userhdr, since we use that above */
|
||||
static inline void *genl_info_userhdr(struct genl_info *info)
|
||||
{
|
||||
return (u8 *)info->genlhdr + GENL_HDRLEN;
|
||||
}
|
||||
+#endif
|
||||
|
||||
#if LINUX_VERSION_IS_LESS(4,10,0)
|
||||
#define __genl_ro_after_init
|
@ -0,0 +1,32 @@
|
||||
--- a/net/wireless/nl80211.c
|
||||
+++ b/net/wireless/nl80211.c
|
||||
@@ -16442,8 +16442,14 @@ static u32 nl80211_internal_flags[] = {
|
||||
#undef SELECTOR
|
||||
};
|
||||
|
||||
+#if LINUX_VERSION_IS_LESS(6,2,0)
|
||||
static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
|
||||
struct genl_info *info)
|
||||
+#else
|
||||
+static int nl80211_pre_doit(const struct genl_split_ops *ops,
|
||||
+ struct sk_buff *skb,
|
||||
+ struct genl_info *info)
|
||||
+#endif
|
||||
{
|
||||
struct cfg80211_registered_device *rdev = NULL;
|
||||
struct wireless_dev *wdev = NULL;
|
||||
@@ -16543,8 +16549,14 @@ out_unlock:
|
||||
return err;
|
||||
}
|
||||
|
||||
+#if LINUX_VERSION_IS_LESS(6,2,0)
|
||||
static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb,
|
||||
struct genl_info *info)
|
||||
+#else
|
||||
+static void nl80211_post_doit(const struct genl_split_ops *ops,
|
||||
+ struct sk_buff *skb,
|
||||
+ struct genl_info *info)
|
||||
+#endif
|
||||
{
|
||||
u32 internal_flags = nl80211_internal_flags[ops->internal_flags];
|
||||
|
@ -0,0 +1,160 @@
|
||||
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
|
||||
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
|
||||
@@ -531,7 +531,11 @@ struct iwl_mvm_tt_mgmt {
|
||||
* @tzone: thermal zone device data
|
||||
*/
|
||||
struct iwl_mvm_thermal_device {
|
||||
+#if LINUX_VERSION_IS_LESS(6,6,0)
|
||||
s16 temp_trips[IWL_MAX_DTS_TRIPS];
|
||||
+#else
|
||||
+ struct thermal_trip trips[IWL_MAX_DTS_TRIPS];
|
||||
+#endif
|
||||
u8 fw_trips_index[IWL_MAX_DTS_TRIPS];
|
||||
struct thermal_zone_device *tzone;
|
||||
};
|
||||
--- a/drivers/net/wireless/intel/iwlwifi/mvm/tt.c
|
||||
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/tt.c
|
||||
@@ -573,6 +573,7 @@ int iwl_mvm_send_temp_report_ths_cmd(str
|
||||
* and uncompressed, the FW should get it compressed and sorted
|
||||
*/
|
||||
|
||||
+#if LINUX_VERSION_IS_LESS(6,6,0)
|
||||
/* compress temp_trips to cmd array, remove uninitialized values*/
|
||||
for (i = 0; i < IWL_MAX_DTS_TRIPS; i++) {
|
||||
if (mvm->tz_device.temp_trips[i] != S16_MIN) {
|
||||
@@ -580,6 +581,15 @@ int iwl_mvm_send_temp_report_ths_cmd(str
|
||||
cpu_to_le16(mvm->tz_device.temp_trips[i]);
|
||||
}
|
||||
}
|
||||
+#else
|
||||
+ /* compress trips to cmd array, remove uninitialized values*/
|
||||
+ for (i = 0; i < IWL_MAX_DTS_TRIPS; i++) {
|
||||
+ if (mvm->tz_device.trips[i].temperature != INT_MIN) {
|
||||
+ cmd.thresholds[idx++] =
|
||||
+ cpu_to_le16((s16)(mvm->tz_device.trips[i].temperature / 1000));
|
||||
+ }
|
||||
+ }
|
||||
+#endif
|
||||
cmd.num_temps = cpu_to_le32(idx);
|
||||
|
||||
if (!idx)
|
||||
@@ -593,8 +603,13 @@ int iwl_mvm_send_temp_report_ths_cmd(str
|
||||
*/
|
||||
for (i = 0; i < idx; i++) {
|
||||
for (j = 0; j < IWL_MAX_DTS_TRIPS; j++) {
|
||||
+#if LINUX_VERSION_IS_LESS(6,6,0)
|
||||
if (le16_to_cpu(cmd.thresholds[i]) ==
|
||||
mvm->tz_device.temp_trips[j])
|
||||
+#else
|
||||
+ if ((int)(le16_to_cpu(cmd.thresholds[i]) * 1000) ==
|
||||
+ mvm->tz_device.trips[j].temperature)
|
||||
+#endif
|
||||
mvm->tz_device.fw_trips_index[i] = j;
|
||||
}
|
||||
}
|
||||
@@ -638,6 +653,7 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
+#if LINUX_VERSION_IS_LESS(6,6,0)
|
||||
static int iwl_mvm_tzone_get_trip_temp(struct thermal_zone_device *device,
|
||||
int trip, int *temp)
|
||||
{
|
||||
@@ -661,14 +677,19 @@ static int iwl_mvm_tzone_get_trip_type(s
|
||||
|
||||
return 0;
|
||||
}
|
||||
+#endif
|
||||
|
||||
static int iwl_mvm_tzone_set_trip_temp(struct thermal_zone_device *device,
|
||||
int trip, int temp)
|
||||
{
|
||||
struct iwl_mvm *mvm = thermal_zone_device_priv(device);
|
||||
struct iwl_mvm_thermal_device *tzone;
|
||||
+#if LINUX_VERSION_IS_LESS(6,6,0)
|
||||
int i, ret;
|
||||
s16 temperature;
|
||||
+#else
|
||||
+ int ret;
|
||||
+#endif
|
||||
|
||||
mutex_lock(&mvm->mutex);
|
||||
|
||||
@@ -678,17 +699,21 @@ static int iwl_mvm_tzone_set_trip_temp(s
|
||||
goto out;
|
||||
}
|
||||
|
||||
+#if LINUX_VERSION_IS_LESS(6,6,0)
|
||||
if (trip < 0 || trip >= IWL_MAX_DTS_TRIPS) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
+#endif
|
||||
|
||||
if ((temp / 1000) > S16_MAX) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
+#if LINUX_VERSION_IS_LESS(6,6,0)
|
||||
temperature = (s16)(temp / 1000);
|
||||
+#endif
|
||||
tzone = &mvm->tz_device;
|
||||
|
||||
if (!tzone) {
|
||||
@@ -696,6 +721,7 @@ static int iwl_mvm_tzone_set_trip_temp(s
|
||||
goto out;
|
||||
}
|
||||
|
||||
+#if LINUX_VERSION_IS_LESS(6,6,0)
|
||||
/* no updates*/
|
||||
if (tzone->temp_trips[trip] == temperature) {
|
||||
ret = 0;
|
||||
@@ -711,6 +737,7 @@ static int iwl_mvm_tzone_set_trip_temp(s
|
||||
}
|
||||
|
||||
tzone->temp_trips[trip] = temperature;
|
||||
+#endif
|
||||
|
||||
ret = iwl_mvm_send_temp_report_ths_cmd(mvm);
|
||||
out:
|
||||
@@ -720,8 +747,10 @@ out:
|
||||
|
||||
static struct thermal_zone_device_ops tzone_ops = {
|
||||
.get_temp = iwl_mvm_tzone_get_temp,
|
||||
+#if LINUX_VERSION_IS_LESS(6,6,0)
|
||||
.get_trip_temp = iwl_mvm_tzone_get_trip_temp,
|
||||
.get_trip_type = iwl_mvm_tzone_get_trip_type,
|
||||
+#endif
|
||||
.set_trip_temp = iwl_mvm_tzone_set_trip_temp,
|
||||
};
|
||||
|
||||
@@ -743,7 +772,12 @@ static void iwl_mvm_thermal_zone_registe
|
||||
BUILD_BUG_ON(ARRAY_SIZE(name) >= THERMAL_NAME_LENGTH);
|
||||
|
||||
sprintf(name, "iwlwifi_%u", atomic_inc_return(&counter) & 0xFF);
|
||||
+#if LINUX_VERSION_IS_LESS(6,6,0)
|
||||
mvm->tz_device.tzone = thermal_zone_device_register(name,
|
||||
+#else
|
||||
+ mvm->tz_device.tzone = thermal_zone_device_register_with_trips(name,
|
||||
+ mvm->tz_device.trips,
|
||||
+#endif
|
||||
IWL_MAX_DTS_TRIPS,
|
||||
IWL_WRITABLE_TRIPS_MSK,
|
||||
mvm, &tzone_ops,
|
||||
@@ -766,8 +800,15 @@ static void iwl_mvm_thermal_zone_registe
|
||||
/* 0 is a valid temperature,
|
||||
* so initialize the array with S16_MIN which invalid temperature
|
||||
*/
|
||||
+#if LINUX_VERSION_IS_LESS(6,6,0)
|
||||
for (i = 0 ; i < IWL_MAX_DTS_TRIPS; i++)
|
||||
mvm->tz_device.temp_trips[i] = S16_MIN;
|
||||
+#else
|
||||
+ for (i = 0 ; i < IWL_MAX_DTS_TRIPS; i++) {
|
||||
+ mvm->tz_device.trips[i].temperature = INT_MIN;
|
||||
+ mvm->tz_device.trips[i].type = THERMAL_TRIP_PASSIVE;
|
||||
+ }
|
||||
+#endif
|
||||
}
|
||||
|
||||
static int iwl_mvm_tcool_get_max_state(struct thermal_cooling_device *cdev,
|
@ -0,0 +1,27 @@
|
||||
From d55cb6d8a99441aff55cb9ce663a07f7f1667e83 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:22 +0100
|
||||
Subject: [PATCH 01/21] wifi: rtl8xxxu: remove assignment of priv->vif in
|
||||
rtl8xxxu_bss_info_changed()
|
||||
|
||||
priv->vif gets already set in rtl8xxxu_add_interface, there is no need
|
||||
to set it also in rtl8xxxu_bss_info_changed().
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-2-martin.kaistra@linutronix.de
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -5004,7 +5004,6 @@ rtl8xxxu_bss_info_changed(struct ieee802
|
||||
|
||||
rtl8xxxu_update_ra_report(rarpt, highest_rate, sgi, bw);
|
||||
|
||||
- priv->vif = vif;
|
||||
priv->rssi_level = RTL8XXXU_RATR_STA_INIT;
|
||||
|
||||
priv->fops->update_rate_mask(priv, ramask, 0, sgi,
|
@ -0,0 +1,61 @@
|
||||
From 2bbd7d584046038ce655e476628bb15e1460fac6 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:23 +0100
|
||||
Subject: [PATCH 02/21] wifi: rtl8xxxu: prepare supporting two virtual
|
||||
interfaces
|
||||
|
||||
To prepare for concurrent mode, add an array ("vifs") to rtl8xxxu_priv
|
||||
to keep track of both interfaces.
|
||||
|
||||
Keep the old priv->vif as long there are still users of it and let
|
||||
priv->vifs[0] point to the same location.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-3-martin.kaistra@linutronix.de
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 2 ++
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 10 +++++++---
|
||||
2 files changed, 9 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
|
||||
@@ -1897,6 +1897,8 @@ struct rtl8xxxu_priv {
|
||||
* is supported and no iface_combinations are provided.
|
||||
*/
|
||||
struct ieee80211_vif *vif;
|
||||
+
|
||||
+ struct ieee80211_vif *vifs[2];
|
||||
struct delayed_work ra_watchdog;
|
||||
struct work_struct c2hcmd_work;
|
||||
struct sk_buff_head c2hcmd_queue;
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -6569,10 +6569,12 @@ static int rtl8xxxu_add_interface(struct
|
||||
int ret;
|
||||
u8 val8;
|
||||
|
||||
- if (!priv->vif)
|
||||
+ if (!priv->vif) {
|
||||
priv->vif = vif;
|
||||
- else
|
||||
+ priv->vifs[0] = vif;
|
||||
+ } else {
|
||||
return -EOPNOTSUPP;
|
||||
+ }
|
||||
|
||||
switch (vif->type) {
|
||||
case NL80211_IFTYPE_STATION:
|
||||
@@ -6622,8 +6624,10 @@ static void rtl8xxxu_remove_interface(st
|
||||
|
||||
dev_dbg(&priv->udev->dev, "%s\n", __func__);
|
||||
|
||||
- if (priv->vif)
|
||||
+ if (priv->vif) {
|
||||
priv->vif = NULL;
|
||||
+ priv->vifs[0] = NULL;
|
||||
+ }
|
||||
}
|
||||
|
||||
static int rtl8xxxu_config(struct ieee80211_hw *hw, u32 changed)
|
@ -0,0 +1,102 @@
|
||||
From 7f444692cde83c1455682c2d0d2c9a666422b867 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:24 +0100
|
||||
Subject: [PATCH 03/21] wifi: rtl8xxxu: support setting linktype for both
|
||||
interfaces
|
||||
|
||||
To prepare for concurrent mode, enhance the set_linktype function to be
|
||||
able to set the linktype in the MSR register for both hardware ports.
|
||||
|
||||
Until the users of set_linktype can handle multiple interfaces, use
|
||||
port_num = 0.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-4-martin.kaistra@linutronix.de
|
||||
---
|
||||
.../wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 37 +++++++++++--------
|
||||
1 file changed, 22 insertions(+), 15 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -1633,33 +1633,41 @@ rtl8xxxu_gen1_set_tx_power(struct rtl8xx
|
||||
}
|
||||
|
||||
static void rtl8xxxu_set_linktype(struct rtl8xxxu_priv *priv,
|
||||
- enum nl80211_iftype linktype)
|
||||
+ enum nl80211_iftype linktype, int port_num)
|
||||
{
|
||||
- u8 val8;
|
||||
-
|
||||
- val8 = rtl8xxxu_read8(priv, REG_MSR);
|
||||
- val8 &= ~MSR_LINKTYPE_MASK;
|
||||
+ u8 val8, type;
|
||||
|
||||
switch (linktype) {
|
||||
case NL80211_IFTYPE_UNSPECIFIED:
|
||||
- val8 |= MSR_LINKTYPE_NONE;
|
||||
+ type = MSR_LINKTYPE_NONE;
|
||||
break;
|
||||
case NL80211_IFTYPE_ADHOC:
|
||||
- val8 |= MSR_LINKTYPE_ADHOC;
|
||||
+ type = MSR_LINKTYPE_ADHOC;
|
||||
break;
|
||||
case NL80211_IFTYPE_STATION:
|
||||
- val8 |= MSR_LINKTYPE_STATION;
|
||||
+ type = MSR_LINKTYPE_STATION;
|
||||
break;
|
||||
case NL80211_IFTYPE_AP:
|
||||
- val8 |= MSR_LINKTYPE_AP;
|
||||
+ type = MSR_LINKTYPE_AP;
|
||||
break;
|
||||
default:
|
||||
- goto out;
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ switch (port_num) {
|
||||
+ case 0:
|
||||
+ val8 = rtl8xxxu_read8(priv, REG_MSR) & 0x0c;
|
||||
+ val8 |= type;
|
||||
+ break;
|
||||
+ case 1:
|
||||
+ val8 = rtl8xxxu_read8(priv, REG_MSR) & 0x03;
|
||||
+ val8 |= type << 2;
|
||||
+ break;
|
||||
+ default:
|
||||
+ return;
|
||||
}
|
||||
|
||||
rtl8xxxu_write8(priv, REG_MSR, val8);
|
||||
-out:
|
||||
- return;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -4236,7 +4244,6 @@ static int rtl8xxxu_init_device(struct i
|
||||
}
|
||||
|
||||
rtl8xxxu_set_mac(priv);
|
||||
- rtl8xxxu_set_linktype(priv, NL80211_IFTYPE_STATION);
|
||||
|
||||
/*
|
||||
* Configure initial WMAC settings
|
||||
@@ -4964,7 +4971,7 @@ rtl8xxxu_bss_info_changed(struct ieee802
|
||||
if (changed & BSS_CHANGED_ASSOC) {
|
||||
dev_dbg(dev, "Changed ASSOC: %i!\n", vif->cfg.assoc);
|
||||
|
||||
- rtl8xxxu_set_linktype(priv, vif->type);
|
||||
+ rtl8xxxu_set_linktype(priv, vif->type, 0);
|
||||
|
||||
if (vif->cfg.assoc) {
|
||||
u32 ramask;
|
||||
@@ -6610,7 +6617,7 @@ static int rtl8xxxu_add_interface(struct
|
||||
ret = -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
- rtl8xxxu_set_linktype(priv, vif->type);
|
||||
+ rtl8xxxu_set_linktype(priv, vif->type, 0);
|
||||
ether_addr_copy(priv->mac_addr, vif->addr);
|
||||
rtl8xxxu_set_mac(priv);
|
||||
|
@ -0,0 +1,28 @@
|
||||
From a047e46a7b98de384a158b25a05dc09aa7d70c5f Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:25 +0100
|
||||
Subject: [PATCH 04/21] wifi: rtl8xxxu: 8188e: convert usage of priv->vif to
|
||||
priv->vifs[0]
|
||||
|
||||
The driver currently does not support AP or concurrent mode for 8188e,
|
||||
so just use priv->vifs[0] instead of priv->vif for now.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-5-martin.kaistra@linutronix.de
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
@@ -1699,7 +1699,7 @@ void rtl8188e_handle_ra_tx_report2(struc
|
||||
/* We only use macid 0, so only the first item is relevant.
|
||||
* AP mode will use more of them if it's ever implemented.
|
||||
*/
|
||||
- if (!priv->vif || priv->vif->type == NL80211_IFTYPE_STATION)
|
||||
+ if (!priv->vifs[0] || priv->vifs[0]->type == NL80211_IFTYPE_STATION)
|
||||
items = 1;
|
||||
|
||||
for (macid = 0; macid < items; macid++) {
|
@ -0,0 +1,72 @@
|
||||
From 00add60cad3c9690ac0f9d4f6685f96ccd607670 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:26 +0100
|
||||
Subject: [PATCH 05/21] wifi: rtl8xxxu: support setting mac address register
|
||||
for both interfaces
|
||||
|
||||
To prepare for concurrent mode, enhance rtl8xxxu_set_mac() to write the
|
||||
mac address of the respective interface to REG_MACID or REG_MACID1.
|
||||
|
||||
Remove the call to rtl8xxxu_set_mac() from the init function as we set
|
||||
it in rtl8xxxu_add_interface() later anyway.
|
||||
|
||||
Until rtl8xxxu_add_interface() can handle both interfaces, call
|
||||
rtl8xxxu_set_mac() with port_num = 0.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-6-martin.kaistra@linutronix.de
|
||||
---
|
||||
.../wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 20 +++++++++++++------
|
||||
1 file changed, 14 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -3580,15 +3580,25 @@ void rtl8723a_phy_lc_calibrate(struct rt
|
||||
rtl8xxxu_write8(priv, REG_TXPAUSE, 0x00);
|
||||
}
|
||||
|
||||
-static int rtl8xxxu_set_mac(struct rtl8xxxu_priv *priv)
|
||||
+static int rtl8xxxu_set_mac(struct rtl8xxxu_priv *priv, int port_num)
|
||||
{
|
||||
int i;
|
||||
u16 reg;
|
||||
|
||||
- reg = REG_MACID;
|
||||
+ switch (port_num) {
|
||||
+ case 0:
|
||||
+ reg = REG_MACID;
|
||||
+ break;
|
||||
+ case 1:
|
||||
+ reg = REG_MACID1;
|
||||
+ break;
|
||||
+ default:
|
||||
+ WARN_ONCE("%s: invalid port_num\n", __func__);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
|
||||
for (i = 0; i < ETH_ALEN; i++)
|
||||
- rtl8xxxu_write8(priv, reg + i, priv->mac_addr[i]);
|
||||
+ rtl8xxxu_write8(priv, reg + i, priv->vifs[port_num]->addr[i]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -4243,8 +4253,6 @@ static int rtl8xxxu_init_device(struct i
|
||||
rtl8xxxu_write32(priv, REG_HIMR, 0xffffffff);
|
||||
}
|
||||
|
||||
- rtl8xxxu_set_mac(priv);
|
||||
-
|
||||
/*
|
||||
* Configure initial WMAC settings
|
||||
*/
|
||||
@@ -6619,7 +6627,7 @@ static int rtl8xxxu_add_interface(struct
|
||||
|
||||
rtl8xxxu_set_linktype(priv, vif->type, 0);
|
||||
ether_addr_copy(priv->mac_addr, vif->addr);
|
||||
- rtl8xxxu_set_mac(priv);
|
||||
+ rtl8xxxu_set_mac(priv, 0);
|
||||
|
||||
return ret;
|
||||
}
|
@ -0,0 +1,75 @@
|
||||
From 9aa776209ca31695bead52674ad943848ccc97d5 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:27 +0100
|
||||
Subject: [PATCH 06/21] wifi: rtl8xxxu: extend wifi connected check to both
|
||||
interfaces
|
||||
|
||||
There are multiple places in the code where the current connection
|
||||
status of wifi is checked. The driver will support two interfaces soon
|
||||
and either one of them (or both) could be connected.
|
||||
|
||||
Convert all uses of (vif && vif->cfg.assoc) to a new helper
|
||||
function rtl8xxxu_is_assoc() which checks both interfaces.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-7-martin.kaistra@linutronix.de
|
||||
---
|
||||
.../wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 20 +++++++++----------
|
||||
1 file changed, 9 insertions(+), 11 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -6043,18 +6043,20 @@ void rtl8723bu_update_bt_link_info(struc
|
||||
btcoex->bt_busy = false;
|
||||
}
|
||||
|
||||
+static inline bool rtl8xxxu_is_assoc(struct rtl8xxxu_priv *priv)
|
||||
+{
|
||||
+ return (priv->vifs[0] && priv->vifs[0]->cfg.assoc) ||
|
||||
+ (priv->vifs[1] && priv->vifs[1]->cfg.assoc);
|
||||
+}
|
||||
+
|
||||
static
|
||||
void rtl8723bu_handle_bt_inquiry(struct rtl8xxxu_priv *priv)
|
||||
{
|
||||
- struct ieee80211_vif *vif;
|
||||
struct rtl8xxxu_btcoex *btcoex;
|
||||
- bool wifi_connected;
|
||||
|
||||
- vif = priv->vif;
|
||||
btcoex = &priv->bt_coex;
|
||||
- wifi_connected = (vif && vif->cfg.assoc);
|
||||
|
||||
- if (!wifi_connected) {
|
||||
+ if (!rtl8xxxu_is_assoc(priv)) {
|
||||
rtl8723bu_set_ps_tdma(priv, 0x8, 0x0, 0x0, 0x0, 0x0);
|
||||
rtl8723bu_set_coex_with_type(priv, 0);
|
||||
} else if (btcoex->has_sco || btcoex->has_hid || btcoex->has_a2dp) {
|
||||
@@ -6072,15 +6074,11 @@ void rtl8723bu_handle_bt_inquiry(struct
|
||||
static
|
||||
void rtl8723bu_handle_bt_info(struct rtl8xxxu_priv *priv)
|
||||
{
|
||||
- struct ieee80211_vif *vif;
|
||||
struct rtl8xxxu_btcoex *btcoex;
|
||||
- bool wifi_connected;
|
||||
|
||||
- vif = priv->vif;
|
||||
btcoex = &priv->bt_coex;
|
||||
- wifi_connected = (vif && vif->cfg.assoc);
|
||||
|
||||
- if (wifi_connected) {
|
||||
+ if (rtl8xxxu_is_assoc(priv)) {
|
||||
u32 val32 = 0;
|
||||
u32 high_prio_tx = 0, high_prio_rx = 0;
|
||||
|
||||
@@ -7103,7 +7101,7 @@ static void rtl8xxxu_track_cfo(struct rt
|
||||
int cfo_khz_a, cfo_khz_b, cfo_average;
|
||||
int crystal_cap;
|
||||
|
||||
- if (!priv->vif || !priv->vif->cfg.assoc) {
|
||||
+ if (!rtl8xxxu_is_assoc(priv)) {
|
||||
/* Reset */
|
||||
cfo->adjust = true;
|
||||
|
@ -0,0 +1,70 @@
|
||||
From 80fd8687db41b1e04f78c37137d090f2165cca6e Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:28 +0100
|
||||
Subject: [PATCH 07/21] wifi: rtl8xxxu: extend check for matching bssid to both
|
||||
interfaces
|
||||
|
||||
The driver will support two interfaces soon, which both can be in
|
||||
station mode, so extend the check, whether cfo information should be
|
||||
parsed, to cover both interfaces.
|
||||
|
||||
For better code readability put the lines with priv->vifs[port_num] in a
|
||||
separate function.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-8-martin.kaistra@linutronix.de
|
||||
---
|
||||
.../wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 22 ++++++++++++-------
|
||||
1 file changed, 14 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -5706,6 +5706,16 @@ static void rtl8xxxu_update_beacon_work_
|
||||
rtl8xxxu_send_beacon_frame(hw, vif);
|
||||
}
|
||||
|
||||
+static inline bool rtl8xxxu_is_packet_match_bssid(struct rtl8xxxu_priv *priv,
|
||||
+ struct ieee80211_hdr *hdr,
|
||||
+ int port_num)
|
||||
+{
|
||||
+ return priv->vifs[port_num] &&
|
||||
+ priv->vifs[port_num]->type == NL80211_IFTYPE_STATION &&
|
||||
+ priv->vifs[port_num]->cfg.assoc &&
|
||||
+ ether_addr_equal(priv->vifs[port_num]->bss_conf.bssid, hdr->addr2);
|
||||
+}
|
||||
+
|
||||
void rtl8723au_rx_parse_phystats(struct rtl8xxxu_priv *priv,
|
||||
struct ieee80211_rx_status *rx_status,
|
||||
struct rtl8723au_phy_stats *phy_stats,
|
||||
@@ -5722,12 +5732,10 @@ void rtl8723au_rx_parse_phystats(struct
|
||||
rx_status->signal = priv->fops->cck_rssi(priv, phy_stats);
|
||||
} else {
|
||||
bool parse_cfo = priv->fops->set_crystal_cap &&
|
||||
- priv->vif &&
|
||||
- priv->vif->type == NL80211_IFTYPE_STATION &&
|
||||
- priv->vif->cfg.assoc &&
|
||||
!crc_icv_err &&
|
||||
!ieee80211_is_ctl(hdr->frame_control) &&
|
||||
- ether_addr_equal(priv->vif->bss_conf.bssid, hdr->addr2);
|
||||
+ (rtl8xxxu_is_packet_match_bssid(priv, hdr, 0) ||
|
||||
+ rtl8xxxu_is_packet_match_bssid(priv, hdr, 1));
|
||||
|
||||
if (parse_cfo) {
|
||||
priv->cfo_tracking.cfo_tail[0] = phy_stats->path_cfotail[0];
|
||||
@@ -5762,12 +5770,10 @@ static void jaguar2_rx_parse_phystats_ty
|
||||
bool crc_icv_err)
|
||||
{
|
||||
bool parse_cfo = priv->fops->set_crystal_cap &&
|
||||
- priv->vif &&
|
||||
- priv->vif->type == NL80211_IFTYPE_STATION &&
|
||||
- priv->vif->cfg.assoc &&
|
||||
!crc_icv_err &&
|
||||
!ieee80211_is_ctl(hdr->frame_control) &&
|
||||
- ether_addr_equal(priv->vif->bss_conf.bssid, hdr->addr2);
|
||||
+ (rtl8xxxu_is_packet_match_bssid(priv, hdr, 0) ||
|
||||
+ rtl8xxxu_is_packet_match_bssid(priv, hdr, 1));
|
||||
u8 pwdb_max = 0;
|
||||
int rx_path;
|
||||
|
@ -0,0 +1,51 @@
|
||||
From f86dd8eaf8da84ee5b803d90b8c311d7e2725d0b Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:29 +0100
|
||||
Subject: [PATCH 08/21] wifi: rtl8xxxu: don't parse CFO, if both interfaces are
|
||||
connected in STA mode
|
||||
|
||||
If both interfaces are in STATION mode and both are connected to an AP,
|
||||
there might be conflicting CFO values for the two connections. Ignore
|
||||
the CFO information in this case.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-9-martin.kaistra@linutronix.de
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -5716,6 +5716,14 @@ static inline bool rtl8xxxu_is_packet_ma
|
||||
ether_addr_equal(priv->vifs[port_num]->bss_conf.bssid, hdr->addr2);
|
||||
}
|
||||
|
||||
+static inline bool rtl8xxxu_is_sta_sta(struct rtl8xxxu_priv *priv)
|
||||
+{
|
||||
+ return (priv->vifs[0] && priv->vifs[0]->cfg.assoc &&
|
||||
+ priv->vifs[0]->type == NL80211_IFTYPE_STATION) &&
|
||||
+ (priv->vifs[1] && priv->vifs[1]->cfg.assoc &&
|
||||
+ priv->vifs[1]->type == NL80211_IFTYPE_STATION);
|
||||
+}
|
||||
+
|
||||
void rtl8723au_rx_parse_phystats(struct rtl8xxxu_priv *priv,
|
||||
struct ieee80211_rx_status *rx_status,
|
||||
struct rtl8723au_phy_stats *phy_stats,
|
||||
@@ -5734,6 +5742,7 @@ void rtl8723au_rx_parse_phystats(struct
|
||||
bool parse_cfo = priv->fops->set_crystal_cap &&
|
||||
!crc_icv_err &&
|
||||
!ieee80211_is_ctl(hdr->frame_control) &&
|
||||
+ !rtl8xxxu_is_sta_sta(priv) &&
|
||||
(rtl8xxxu_is_packet_match_bssid(priv, hdr, 0) ||
|
||||
rtl8xxxu_is_packet_match_bssid(priv, hdr, 1));
|
||||
|
||||
@@ -5772,6 +5781,7 @@ static void jaguar2_rx_parse_phystats_ty
|
||||
bool parse_cfo = priv->fops->set_crystal_cap &&
|
||||
!crc_icv_err &&
|
||||
!ieee80211_is_ctl(hdr->frame_control) &&
|
||||
+ !rtl8xxxu_is_sta_sta(priv) &&
|
||||
(rtl8xxxu_is_packet_match_bssid(priv, hdr, 0) ||
|
||||
rtl8xxxu_is_packet_match_bssid(priv, hdr, 1));
|
||||
u8 pwdb_max = 0;
|
@ -0,0 +1,67 @@
|
||||
From 3ff7a05996f901a7a10068b42e9dc8435f908a4c Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:30 +0100
|
||||
Subject: [PATCH 09/21] wifi: rtl8xxxu: support setting bssid register for
|
||||
multiple interfaces
|
||||
|
||||
To prepare for concurrent mode, enhance rtl8xxxu_set_bssid() to write the
|
||||
BSSID of the respective interface to REG_BSSID or REG_BSSID1.
|
||||
|
||||
Like done with rtl8xxxu_set_mac(), call rtl8xxxu_set_bssid() with
|
||||
port_num = 0, until the callers also support multiple interfaces.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-10-martin.kaistra@linutronix.de
|
||||
---
|
||||
.../wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 18 ++++++++++++++----
|
||||
1 file changed, 14 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -3603,14 +3603,24 @@ static int rtl8xxxu_set_mac(struct rtl8x
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int rtl8xxxu_set_bssid(struct rtl8xxxu_priv *priv, const u8 *bssid)
|
||||
+static int rtl8xxxu_set_bssid(struct rtl8xxxu_priv *priv, const u8 *bssid, int port_num)
|
||||
{
|
||||
int i;
|
||||
u16 reg;
|
||||
|
||||
dev_dbg(&priv->udev->dev, "%s: (%pM)\n", __func__, bssid);
|
||||
|
||||
- reg = REG_BSSID;
|
||||
+ switch (port_num) {
|
||||
+ case 0:
|
||||
+ reg = REG_BSSID;
|
||||
+ break;
|
||||
+ case 1:
|
||||
+ reg = REG_BSSID1;
|
||||
+ break;
|
||||
+ default:
|
||||
+ WARN_ONCE("%s: invalid port_num\n", __func__);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
|
||||
for (i = 0; i < ETH_ALEN; i++)
|
||||
rtl8xxxu_write8(priv, reg + i, bssid[i]);
|
||||
@@ -5068,7 +5078,7 @@ rtl8xxxu_bss_info_changed(struct ieee802
|
||||
|
||||
if (changed & BSS_CHANGED_BSSID) {
|
||||
dev_dbg(dev, "Changed BSSID!\n");
|
||||
- rtl8xxxu_set_bssid(priv, bss_conf->bssid);
|
||||
+ rtl8xxxu_set_bssid(priv, bss_conf->bssid, 0);
|
||||
}
|
||||
|
||||
if (changed & BSS_CHANGED_BASIC_RATES) {
|
||||
@@ -5097,7 +5107,7 @@ static int rtl8xxxu_start_ap(struct ieee
|
||||
struct device *dev = &priv->udev->dev;
|
||||
|
||||
dev_dbg(dev, "Start AP mode\n");
|
||||
- rtl8xxxu_set_bssid(priv, vif->bss_conf.bssid);
|
||||
+ rtl8xxxu_set_bssid(priv, vif->bss_conf.bssid, 0);
|
||||
rtl8xxxu_write16(priv, REG_BCN_INTERVAL, vif->bss_conf.beacon_int);
|
||||
priv->fops->report_connect(priv, RTL8XXXU_BC_MC_MACID, 0, true);
|
||||
|
@ -0,0 +1,44 @@
|
||||
From 43532c050f8eec4056a21978fdb5b958e1477553 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:31 +0100
|
||||
Subject: [PATCH 10/21] wifi: rtl8xxxu: support multiple interfaces in
|
||||
set_aifs()
|
||||
|
||||
In concurrent mode supported by this driver, both interfaces will use
|
||||
the same channel and same wireless mode.
|
||||
It is therefore possible to get the wireless mode by checking the first
|
||||
connected interface.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-11-martin.kaistra@linutronix.de
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 10 ++++++++--
|
||||
1 file changed, 8 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -4913,14 +4913,20 @@ static void rtl8xxxu_set_aifs(struct rtl
|
||||
u8 aifs, aifsn, sifs;
|
||||
int i;
|
||||
|
||||
- if (priv->vif) {
|
||||
+ for (i = 0; i < ARRAY_SIZE(priv->vifs); i++) {
|
||||
+ if (!priv->vifs[i])
|
||||
+ continue;
|
||||
+
|
||||
struct ieee80211_sta *sta;
|
||||
|
||||
rcu_read_lock();
|
||||
- sta = ieee80211_find_sta(priv->vif, priv->vif->bss_conf.bssid);
|
||||
+ sta = ieee80211_find_sta(priv->vifs[i], priv->vifs[i]->bss_conf.bssid);
|
||||
if (sta)
|
||||
wireless_mode = rtl8xxxu_wireless_mode(priv->hw, sta);
|
||||
rcu_read_unlock();
|
||||
+
|
||||
+ if (wireless_mode)
|
||||
+ break;
|
||||
}
|
||||
|
||||
if (priv->hw->conf.chandef.chan->band == NL80211_BAND_5GHZ ||
|
@ -0,0 +1,28 @@
|
||||
From 05b22e9b7d84253f765cde01cb09d144094b61c9 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:32 +0100
|
||||
Subject: [PATCH 11/21] wifi: rtl8xxxu: support multiple interfaces in
|
||||
update_beacon_work_callback()
|
||||
|
||||
As we only want to support AP mode/sending beacons on port 0, it is
|
||||
enough to replace priv->vif with priv->vifs[0].
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-12-martin.kaistra@linutronix.de
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -5712,7 +5712,7 @@ static void rtl8xxxu_update_beacon_work_
|
||||
struct rtl8xxxu_priv *priv =
|
||||
container_of(work, struct rtl8xxxu_priv, update_beacon_work);
|
||||
struct ieee80211_hw *hw = priv->hw;
|
||||
- struct ieee80211_vif *vif = priv->vif;
|
||||
+ struct ieee80211_vif *vif = priv->vifs[0];
|
||||
|
||||
if (!vif) {
|
||||
WARN_ONCE(true, "no vif to update beacon\n");
|
@ -0,0 +1,33 @@
|
||||
From 6b76638287055791e74b32c401a39ea1b91e7158 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:33 +0100
|
||||
Subject: [PATCH 12/21] wifi: rtl8xxxu: support multiple interfaces in
|
||||
configure_filter()
|
||||
|
||||
As we only want to support AP mode/sending beacons on port 0, change
|
||||
from priv->vif to priv->vifs[0] in the check for AP mode.
|
||||
Additionally, if we are in AP mode, don't filter RX beacon and probe
|
||||
response frames to still allow working STATION mode on the other
|
||||
interface.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-13-martin.kaistra@linutronix.de
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -6794,8 +6794,8 @@ static void rtl8xxxu_configure_filter(st
|
||||
else
|
||||
rcr |= RCR_CHECK_BSSID_BEACON | RCR_CHECK_BSSID_MATCH;
|
||||
|
||||
- if (priv->vif && priv->vif->type == NL80211_IFTYPE_AP)
|
||||
- rcr &= ~RCR_CHECK_BSSID_MATCH;
|
||||
+ if (priv->vifs[0] && priv->vifs[0]->type == NL80211_IFTYPE_AP)
|
||||
+ rcr &= ~(RCR_CHECK_BSSID_MATCH | RCR_CHECK_BSSID_BEACON);
|
||||
|
||||
if (*total_flags & FIF_CONTROL)
|
||||
rcr |= RCR_ACCEPT_CTRL_FRAME;
|
@ -0,0 +1,66 @@
|
||||
From 3f9baa99f8429ea6f56e7cc8d881c027518e9573 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:34 +0100
|
||||
Subject: [PATCH 13/21] wifi: rtl8xxxu: support multiple interfaces in
|
||||
watchdog_callback()
|
||||
|
||||
Check first whether priv->vifs[0] exists and is of type STATION, then go
|
||||
to priv->vifs[1]. Make sure to call refresh_rate_mask for both
|
||||
interfaces.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-14-martin.kaistra@linutronix.de
|
||||
---
|
||||
.../wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 19 +++++++++++--------
|
||||
1 file changed, 11 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -7200,11 +7200,15 @@ static void rtl8xxxu_watchdog_callback(s
|
||||
{
|
||||
struct ieee80211_vif *vif;
|
||||
struct rtl8xxxu_priv *priv;
|
||||
+ int i;
|
||||
|
||||
priv = container_of(work, struct rtl8xxxu_priv, ra_watchdog.work);
|
||||
- vif = priv->vif;
|
||||
+ for (i = 0; i < ARRAY_SIZE(priv->vifs); i++) {
|
||||
+ vif = priv->vifs[i];
|
||||
+
|
||||
+ if (!vif || vif->type != NL80211_IFTYPE_STATION)
|
||||
+ continue;
|
||||
|
||||
- if (vif && vif->type == NL80211_IFTYPE_STATION) {
|
||||
int signal;
|
||||
struct ieee80211_sta *sta;
|
||||
|
||||
@@ -7215,22 +7219,21 @@ static void rtl8xxxu_watchdog_callback(s
|
||||
|
||||
dev_dbg(dev, "%s: no sta found\n", __func__);
|
||||
rcu_read_unlock();
|
||||
- goto out;
|
||||
+ continue;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
signal = ieee80211_ave_rssi(vif);
|
||||
|
||||
- priv->fops->report_rssi(priv, 0,
|
||||
+ priv->fops->report_rssi(priv, rtl8xxxu_get_macid(priv, sta),
|
||||
rtl8xxxu_signal_to_snr(signal));
|
||||
|
||||
- if (priv->fops->set_crystal_cap)
|
||||
- rtl8xxxu_track_cfo(priv);
|
||||
-
|
||||
rtl8xxxu_refresh_rate_mask(priv, signal, sta, false);
|
||||
}
|
||||
|
||||
-out:
|
||||
+ if (priv->fops->set_crystal_cap)
|
||||
+ rtl8xxxu_track_cfo(priv);
|
||||
+
|
||||
schedule_delayed_work(&priv->ra_watchdog, 2 * HZ);
|
||||
}
|
||||
|
@ -0,0 +1,137 @@
|
||||
From eef55f1545c92c7181d5083453dee1296298ad3e Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:35 +0100
|
||||
Subject: [PATCH 14/21] wifi: rtl8xxxu: support multiple interfaces in
|
||||
{add,remove}_interface()
|
||||
|
||||
Add a custom struct to store in vif->drv_priv with a reference to
|
||||
port_num and fill it when a new interface is added. Choose a free
|
||||
port_num for the newly added interface.
|
||||
|
||||
As we only want to support AP mode/sending beacons on port 0, only change
|
||||
the beacon settings if a new interface is actually assigned to port 0.
|
||||
|
||||
Call set_linktype() and set_mac() with the appropriate port_num.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-15-martin.kaistra@linutronix.de
|
||||
---
|
||||
.../net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 4 ++
|
||||
.../wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 52 +++++++++++--------
|
||||
2 files changed, 34 insertions(+), 22 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
|
||||
@@ -1921,6 +1921,10 @@ struct rtl8xxxu_sta_info {
|
||||
u8 macid;
|
||||
};
|
||||
|
||||
+struct rtl8xxxu_vif {
|
||||
+ int port_num;
|
||||
+};
|
||||
+
|
||||
struct rtl8xxxu_rx_urb {
|
||||
struct urb urb;
|
||||
struct ieee80211_hw *hw;
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -6610,28 +6610,33 @@ error:
|
||||
static int rtl8xxxu_add_interface(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
+ struct rtl8xxxu_vif *rtlvif = (struct rtl8xxxu_vif *)vif->drv_priv;
|
||||
struct rtl8xxxu_priv *priv = hw->priv;
|
||||
- int ret;
|
||||
+ int port_num;
|
||||
u8 val8;
|
||||
|
||||
- if (!priv->vif) {
|
||||
- priv->vif = vif;
|
||||
- priv->vifs[0] = vif;
|
||||
- } else {
|
||||
+ if (!priv->vifs[0])
|
||||
+ port_num = 0;
|
||||
+ else if (!priv->vifs[1])
|
||||
+ port_num = 1;
|
||||
+ else
|
||||
return -EOPNOTSUPP;
|
||||
- }
|
||||
|
||||
switch (vif->type) {
|
||||
case NL80211_IFTYPE_STATION:
|
||||
- rtl8xxxu_stop_tx_beacon(priv);
|
||||
+ if (port_num == 0) {
|
||||
+ rtl8xxxu_stop_tx_beacon(priv);
|
||||
|
||||
- val8 = rtl8xxxu_read8(priv, REG_BEACON_CTRL);
|
||||
- val8 |= BEACON_ATIM | BEACON_FUNCTION_ENABLE |
|
||||
- BEACON_DISABLE_TSF_UPDATE;
|
||||
- rtl8xxxu_write8(priv, REG_BEACON_CTRL, val8);
|
||||
- ret = 0;
|
||||
+ val8 = rtl8xxxu_read8(priv, REG_BEACON_CTRL);
|
||||
+ val8 |= BEACON_ATIM | BEACON_FUNCTION_ENABLE |
|
||||
+ BEACON_DISABLE_TSF_UPDATE;
|
||||
+ rtl8xxxu_write8(priv, REG_BEACON_CTRL, val8);
|
||||
+ }
|
||||
break;
|
||||
case NL80211_IFTYPE_AP:
|
||||
+ if (port_num == 1)
|
||||
+ return -EOPNOTSUPP;
|
||||
+
|
||||
rtl8xxxu_write8(priv, REG_BEACON_CTRL,
|
||||
BEACON_DISABLE_TSF_UPDATE | BEACON_CTRL_MBSSID);
|
||||
rtl8xxxu_write8(priv, REG_ATIMWND, 0x0c); /* 12ms */
|
||||
@@ -6648,31 +6653,32 @@ static int rtl8xxxu_add_interface(struct
|
||||
val8 = rtl8xxxu_read8(priv, REG_CCK_CHECK);
|
||||
val8 &= ~BIT_BCN_PORT_SEL;
|
||||
rtl8xxxu_write8(priv, REG_CCK_CHECK, val8);
|
||||
-
|
||||
- ret = 0;
|
||||
break;
|
||||
default:
|
||||
- ret = -EOPNOTSUPP;
|
||||
+ return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
- rtl8xxxu_set_linktype(priv, vif->type, 0);
|
||||
+ priv->vifs[port_num] = vif;
|
||||
+ priv->vif = vif;
|
||||
+ rtlvif->port_num = port_num;
|
||||
+
|
||||
+ rtl8xxxu_set_linktype(priv, vif->type, port_num);
|
||||
ether_addr_copy(priv->mac_addr, vif->addr);
|
||||
- rtl8xxxu_set_mac(priv, 0);
|
||||
+ rtl8xxxu_set_mac(priv, port_num);
|
||||
|
||||
- return ret;
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
static void rtl8xxxu_remove_interface(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
+ struct rtl8xxxu_vif *rtlvif = (struct rtl8xxxu_vif *)vif->drv_priv;
|
||||
struct rtl8xxxu_priv *priv = hw->priv;
|
||||
|
||||
dev_dbg(&priv->udev->dev, "%s\n", __func__);
|
||||
|
||||
- if (priv->vif) {
|
||||
- priv->vif = NULL;
|
||||
- priv->vifs[0] = NULL;
|
||||
- }
|
||||
+ priv->vif = NULL;
|
||||
+ priv->vifs[rtlvif->port_num] = NULL;
|
||||
}
|
||||
|
||||
static int rtl8xxxu_config(struct ieee80211_hw *hw, u32 changed)
|
||||
@@ -7661,6 +7667,8 @@ static int rtl8xxxu_probe(struct usb_int
|
||||
if (ret)
|
||||
goto err_set_intfdata;
|
||||
|
||||
+ hw->vif_data_size = sizeof(struct rtl8xxxu_vif);
|
||||
+
|
||||
hw->wiphy->max_scan_ssids = 1;
|
||||
hw->wiphy->max_scan_ie_len = IEEE80211_MAX_DATA_LEN;
|
||||
if (priv->fops->max_macid_num)
|
@ -0,0 +1,57 @@
|
||||
From 073401c3b6b9eaea027240baf07f2b84dd2d2d26 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:36 +0100
|
||||
Subject: [PATCH 15/21] wifi: rtl8xxxu: support multiple interfaces in
|
||||
bss_info_changed()
|
||||
|
||||
Call set_linktype and set_bssid now with correct port_num. Call
|
||||
stop_tx_beacon only for port 0, as we don't support beacons on port 1.
|
||||
Explicit changes to BEACON will only happen for AP type interfaces, so
|
||||
we don't need an additional check there.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-16-martin.kaistra@linutronix.de
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 8 +++++---
|
||||
1 file changed, 5 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -4983,6 +4983,7 @@ static void
|
||||
rtl8xxxu_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
struct ieee80211_bss_conf *bss_conf, u64 changed)
|
||||
{
|
||||
+ struct rtl8xxxu_vif *rtlvif = (struct rtl8xxxu_vif *)vif->drv_priv;
|
||||
struct rtl8xxxu_priv *priv = hw->priv;
|
||||
struct device *dev = &priv->udev->dev;
|
||||
struct ieee80211_sta *sta;
|
||||
@@ -4995,7 +4996,7 @@ rtl8xxxu_bss_info_changed(struct ieee802
|
||||
if (changed & BSS_CHANGED_ASSOC) {
|
||||
dev_dbg(dev, "Changed ASSOC: %i!\n", vif->cfg.assoc);
|
||||
|
||||
- rtl8xxxu_set_linktype(priv, vif->type, 0);
|
||||
+ rtl8xxxu_set_linktype(priv, vif->type, rtlvif->port_num);
|
||||
|
||||
if (vif->cfg.assoc) {
|
||||
u32 ramask;
|
||||
@@ -5042,7 +5043,8 @@ rtl8xxxu_bss_info_changed(struct ieee802
|
||||
|
||||
rtl8xxxu_write8(priv, REG_BCN_MAX_ERR, 0xff);
|
||||
|
||||
- rtl8xxxu_stop_tx_beacon(priv);
|
||||
+ if (rtlvif->port_num == 0)
|
||||
+ rtl8xxxu_stop_tx_beacon(priv);
|
||||
|
||||
/* joinbss sequence */
|
||||
rtl8xxxu_write16(priv, REG_BCN_PSR_RPT,
|
||||
@@ -5084,7 +5086,7 @@ rtl8xxxu_bss_info_changed(struct ieee802
|
||||
|
||||
if (changed & BSS_CHANGED_BSSID) {
|
||||
dev_dbg(dev, "Changed BSSID!\n");
|
||||
- rtl8xxxu_set_bssid(priv, bss_conf->bssid, 0);
|
||||
+ rtl8xxxu_set_bssid(priv, bss_conf->bssid, rtlvif->port_num);
|
||||
}
|
||||
|
||||
if (changed & BSS_CHANGED_BASIC_RATES) {
|
@ -0,0 +1,32 @@
|
||||
From 61fdbd9e2a9d74c716bf4d9684653de5efdee691 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:37 +0100
|
||||
Subject: [PATCH 16/21] wifi: rtl8xxxu: support multiple interface in
|
||||
start_ap()
|
||||
|
||||
Call set_bssid() with the correct port_num now.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-17-martin.kaistra@linutronix.de
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -5111,11 +5111,12 @@ error:
|
||||
static int rtl8xxxu_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
struct ieee80211_bss_conf *link_conf)
|
||||
{
|
||||
+ struct rtl8xxxu_vif *rtlvif = (struct rtl8xxxu_vif *)vif->drv_priv;
|
||||
struct rtl8xxxu_priv *priv = hw->priv;
|
||||
struct device *dev = &priv->udev->dev;
|
||||
|
||||
dev_dbg(dev, "Start AP mode\n");
|
||||
- rtl8xxxu_set_bssid(priv, vif->bss_conf.bssid, 0);
|
||||
+ rtl8xxxu_set_bssid(priv, vif->bss_conf.bssid, rtlvif->port_num);
|
||||
rtl8xxxu_write16(priv, REG_BCN_INTERVAL, vif->bss_conf.beacon_int);
|
||||
priv->fops->report_connect(priv, RTL8XXXU_BC_MC_MACID, 0, true);
|
||||
|
@ -0,0 +1,82 @@
|
||||
From 5ce0d7e8aee03e73b35f0fe1f1ebbdd4e45776f3 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:38 +0100
|
||||
Subject: [PATCH 17/21] wifi: rtl8xxxu: add macids for STA mode
|
||||
|
||||
Until now, the driver only assigned a dedicated macid for connections
|
||||
made in AP mode, in STA mode the return value of rtl8xxxu_get_macid()
|
||||
was simply 0.
|
||||
To differentiate between port 0 and 1, when both are in STA mode,
|
||||
allocate a second macid (with value 1) and set sta_info->macid according
|
||||
to the used port_num in rtl8xxxu_sta_add().
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-18-martin.kaistra@linutronix.de
|
||||
---
|
||||
.../net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 1 +
|
||||
.../wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 18 +++++++++++++++++-
|
||||
2 files changed, 18 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
|
||||
@@ -1774,6 +1774,7 @@ struct rtl8xxxu_cfo_tracking {
|
||||
#define RTL8XXXU_HW_LED_CONTROL 2
|
||||
#define RTL8XXXU_MAX_MAC_ID_NUM 128
|
||||
#define RTL8XXXU_BC_MC_MACID 0
|
||||
+#define RTL8XXXU_BC_MC_MACID1 1
|
||||
|
||||
struct rtl8xxxu_priv {
|
||||
struct ieee80211_hw *hw;
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -4053,10 +4053,13 @@ static inline u8 rtl8xxxu_get_macid(stru
|
||||
{
|
||||
struct rtl8xxxu_sta_info *sta_info;
|
||||
|
||||
- if (!priv->vif || priv->vif->type == NL80211_IFTYPE_STATION || !sta)
|
||||
+ if (!sta)
|
||||
return 0;
|
||||
|
||||
sta_info = (struct rtl8xxxu_sta_info *)sta->drv_priv;
|
||||
+ if (!sta_info)
|
||||
+ return 0;
|
||||
+
|
||||
return sta_info->macid;
|
||||
}
|
||||
|
||||
@@ -4536,6 +4539,7 @@ static int rtl8xxxu_init_device(struct i
|
||||
rtl8188e_ra_info_init_all(&priv->ra_info);
|
||||
|
||||
set_bit(RTL8XXXU_BC_MC_MACID, priv->mac_id_map);
|
||||
+ set_bit(RTL8XXXU_BC_MC_MACID1, priv->mac_id_map);
|
||||
|
||||
exit:
|
||||
return ret;
|
||||
@@ -7375,6 +7379,7 @@ static int rtl8xxxu_sta_add(struct ieee8
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
struct rtl8xxxu_sta_info *sta_info = (struct rtl8xxxu_sta_info *)sta->drv_priv;
|
||||
+ struct rtl8xxxu_vif *rtlvif = (struct rtl8xxxu_vif *)vif->drv_priv;
|
||||
struct rtl8xxxu_priv *priv = hw->priv;
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_AP) {
|
||||
@@ -7384,6 +7389,17 @@ static int rtl8xxxu_sta_add(struct ieee8
|
||||
|
||||
rtl8xxxu_refresh_rate_mask(priv, 0, sta, true);
|
||||
priv->fops->report_connect(priv, sta_info->macid, H2C_MACID_ROLE_STA, true);
|
||||
+ } else {
|
||||
+ switch (rtlvif->port_num) {
|
||||
+ case 0:
|
||||
+ sta_info->macid = RTL8XXXU_BC_MC_MACID;
|
||||
+ break;
|
||||
+ case 1:
|
||||
+ sta_info->macid = RTL8XXXU_BC_MC_MACID1;
|
||||
+ break;
|
||||
+ default:
|
||||
+ break;
|
||||
+ }
|
||||
}
|
||||
|
||||
return 0;
|
@ -0,0 +1,49 @@
|
||||
From f232e9d91bb84817c60c051a3e3b56dd2721a7b3 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:39 +0100
|
||||
Subject: [PATCH 18/21] wifi: rtl8xxxu: remove obsolete priv->vif
|
||||
|
||||
Now that all uses of priv->vif have been converted to priv->vifs[]
|
||||
remove the old attribute.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-19-martin.kaistra@linutronix.de
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 5 -----
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 2 --
|
||||
2 files changed, 7 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
|
||||
@@ -1893,11 +1893,6 @@ struct rtl8xxxu_priv {
|
||||
u8 rssi_level;
|
||||
DECLARE_BITMAP(tx_aggr_started, IEEE80211_NUM_TIDS);
|
||||
DECLARE_BITMAP(tid_tx_operational, IEEE80211_NUM_TIDS);
|
||||
- /*
|
||||
- * Only one virtual interface permitted because only STA mode
|
||||
- * is supported and no iface_combinations are provided.
|
||||
- */
|
||||
- struct ieee80211_vif *vif;
|
||||
|
||||
struct ieee80211_vif *vifs[2];
|
||||
struct delayed_work ra_watchdog;
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -6666,7 +6666,6 @@ static int rtl8xxxu_add_interface(struct
|
||||
}
|
||||
|
||||
priv->vifs[port_num] = vif;
|
||||
- priv->vif = vif;
|
||||
rtlvif->port_num = port_num;
|
||||
|
||||
rtl8xxxu_set_linktype(priv, vif->type, port_num);
|
||||
@@ -6684,7 +6683,6 @@ static void rtl8xxxu_remove_interface(st
|
||||
|
||||
dev_dbg(&priv->udev->dev, "%s\n", __func__);
|
||||
|
||||
- priv->vif = NULL;
|
||||
priv->vifs[rtlvif->port_num] = NULL;
|
||||
}
|
||||
|
@ -0,0 +1,226 @@
|
||||
From b837f78fbffa5f8e7e7c59879db54793abf161ec Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:40 +0100
|
||||
Subject: [PATCH 19/21] wifi: rtl8xxxu: add hw crypto support for AP mode
|
||||
|
||||
Add a custom function for allocating entries in the sec cam. This allows
|
||||
us to store multiple keys with the same keyidx.
|
||||
|
||||
The maximum number of sec cam entries for 8188f is 16 according to the
|
||||
vendor driver. Add the number to rtl8xxxu_fileops, so that other chips
|
||||
which might support more entries, can set a different number there.
|
||||
|
||||
Set the bssid as mac address for group keys instead of just using the
|
||||
ethernet broadcast address and use BIT(6) in the sec cam ctrl entry
|
||||
for differentiating them from pairwise keys like in the vendor driver.
|
||||
|
||||
Add the TXDESC_EN_DESC_ID bit and the hw_key_idx to tx
|
||||
broadcast/multicast packets in AP mode.
|
||||
|
||||
Finally, allow the usage of rtl8xxxu_set_key() for AP mode.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-20-martin.kaistra@linutronix.de
|
||||
---
|
||||
.../net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 5 ++
|
||||
.../realtek/rtl8xxxu/rtl8xxxu_8188f.c | 1 +
|
||||
.../wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 48 +++++++++++++++----
|
||||
3 files changed, 44 insertions(+), 10 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
|
||||
@@ -498,6 +498,7 @@ struct rtl8xxxu_txdesc40 {
|
||||
#define DESC_RATE_ID_SHIFT 16
|
||||
#define DESC_RATE_ID_MASK 0xf
|
||||
#define TXDESC_NAVUSEHDR BIT(20)
|
||||
+#define TXDESC_EN_DESC_ID BIT(21)
|
||||
#define TXDESC_SEC_RC4 0x00400000
|
||||
#define TXDESC_SEC_AES 0x00c00000
|
||||
#define TXDESC_PKT_OFFSET_SHIFT 26
|
||||
@@ -1775,6 +1776,7 @@ struct rtl8xxxu_cfo_tracking {
|
||||
#define RTL8XXXU_MAX_MAC_ID_NUM 128
|
||||
#define RTL8XXXU_BC_MC_MACID 0
|
||||
#define RTL8XXXU_BC_MC_MACID1 1
|
||||
+#define RTL8XXXU_MAX_SEC_CAM_NUM 64
|
||||
|
||||
struct rtl8xxxu_priv {
|
||||
struct ieee80211_hw *hw;
|
||||
@@ -1908,6 +1910,7 @@ struct rtl8xxxu_priv {
|
||||
char led_name[32];
|
||||
struct led_classdev led_cdev;
|
||||
DECLARE_BITMAP(mac_id_map, RTL8XXXU_MAX_MAC_ID_NUM);
|
||||
+ DECLARE_BITMAP(cam_map, RTL8XXXU_MAX_SEC_CAM_NUM);
|
||||
};
|
||||
|
||||
struct rtl8xxxu_sta_info {
|
||||
@@ -1919,6 +1922,7 @@ struct rtl8xxxu_sta_info {
|
||||
|
||||
struct rtl8xxxu_vif {
|
||||
int port_num;
|
||||
+ u8 hw_key_idx;
|
||||
};
|
||||
|
||||
struct rtl8xxxu_rx_urb {
|
||||
@@ -1993,6 +1997,7 @@ struct rtl8xxxu_fileops {
|
||||
u16 max_aggr_num;
|
||||
u8 supports_ap:1;
|
||||
u16 max_macid_num;
|
||||
+ u16 max_sec_cam_num;
|
||||
u32 adda_1t_init;
|
||||
u32 adda_1t_path_on;
|
||||
u32 adda_2t_path_on_a;
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188f.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188f.c
|
||||
@@ -1751,6 +1751,7 @@ struct rtl8xxxu_fileops rtl8188fu_fops =
|
||||
.max_aggr_num = 0x0c14,
|
||||
.supports_ap = 1,
|
||||
.max_macid_num = 16,
|
||||
+ .max_sec_cam_num = 16,
|
||||
.adda_1t_init = 0x03c00014,
|
||||
.adda_1t_path_on = 0x03c00014,
|
||||
.trxff_boundary = 0x3f7f,
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -4559,8 +4559,10 @@ static void rtl8xxxu_cam_write(struct rt
|
||||
* This is a bit of a hack - the lower bits of the cipher
|
||||
* suite selector happens to match the cipher index in the CAM
|
||||
*/
|
||||
- addr = key->keyidx << CAM_CMD_KEY_SHIFT;
|
||||
+ addr = key->hw_key_idx << CAM_CMD_KEY_SHIFT;
|
||||
ctrl = (key->cipher & 0x0f) << 2 | key->keyidx | CAM_WRITE_VALID;
|
||||
+ if (!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE))
|
||||
+ ctrl |= BIT(6);
|
||||
|
||||
for (j = 5; j >= 0; j--) {
|
||||
switch (j) {
|
||||
@@ -5546,13 +5548,14 @@ static void rtl8xxxu_tx(struct ieee80211
|
||||
struct rtl8xxxu_tx_urb *tx_urb;
|
||||
struct ieee80211_sta *sta = NULL;
|
||||
struct ieee80211_vif *vif = tx_info->control.vif;
|
||||
+ struct rtl8xxxu_vif *rtlvif = (struct rtl8xxxu_vif *)vif->drv_priv;
|
||||
struct device *dev = &priv->udev->dev;
|
||||
u32 queue, rts_rate;
|
||||
u16 pktlen = skb->len;
|
||||
int tx_desc_size = priv->fops->tx_desc_size;
|
||||
u8 macid;
|
||||
int ret;
|
||||
- bool ampdu_enable, sgi = false, short_preamble = false;
|
||||
+ bool ampdu_enable, sgi = false, short_preamble = false, bmc = false;
|
||||
|
||||
if (skb_headroom(skb) < tx_desc_size) {
|
||||
dev_warn(dev,
|
||||
@@ -5594,10 +5597,14 @@ static void rtl8xxxu_tx(struct ieee80211
|
||||
tx_desc->txdw0 =
|
||||
TXDESC_OWN | TXDESC_FIRST_SEGMENT | TXDESC_LAST_SEGMENT;
|
||||
if (is_multicast_ether_addr(ieee80211_get_DA(hdr)) ||
|
||||
- is_broadcast_ether_addr(ieee80211_get_DA(hdr)))
|
||||
+ is_broadcast_ether_addr(ieee80211_get_DA(hdr))) {
|
||||
tx_desc->txdw0 |= TXDESC_BROADMULTICAST;
|
||||
+ bmc = true;
|
||||
+ }
|
||||
+
|
||||
|
||||
tx_desc->txdw1 = cpu_to_le32(queue << TXDESC_QUEUE_SHIFT);
|
||||
+ macid = rtl8xxxu_get_macid(priv, sta);
|
||||
|
||||
if (tx_info->control.hw_key) {
|
||||
switch (tx_info->control.hw_key->cipher) {
|
||||
@@ -5612,6 +5619,10 @@ static void rtl8xxxu_tx(struct ieee80211
|
||||
default:
|
||||
break;
|
||||
}
|
||||
+ if (bmc && rtlvif->hw_key_idx != 0xff) {
|
||||
+ tx_desc->txdw1 |= TXDESC_EN_DESC_ID;
|
||||
+ macid = rtlvif->hw_key_idx;
|
||||
+ }
|
||||
}
|
||||
|
||||
/* (tx_info->flags & IEEE80211_TX_CTL_AMPDU) && */
|
||||
@@ -5655,7 +5666,6 @@ static void rtl8xxxu_tx(struct ieee80211
|
||||
else
|
||||
rts_rate = 0;
|
||||
|
||||
- macid = rtl8xxxu_get_macid(priv, sta);
|
||||
priv->fops->fill_txdesc(hw, hdr, tx_info, tx_desc, sgi, short_preamble,
|
||||
ampdu_enable, rts_rate, macid);
|
||||
|
||||
@@ -6667,6 +6677,7 @@ static int rtl8xxxu_add_interface(struct
|
||||
|
||||
priv->vifs[port_num] = vif;
|
||||
rtlvif->port_num = port_num;
|
||||
+ rtlvif->hw_key_idx = 0xff;
|
||||
|
||||
rtl8xxxu_set_linktype(priv, vif->type, port_num);
|
||||
ether_addr_copy(priv->mac_addr, vif->addr);
|
||||
@@ -6843,11 +6854,19 @@ static int rtl8xxxu_set_rts_threshold(st
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int rtl8xxxu_get_free_sec_cam(struct ieee80211_hw *hw)
|
||||
+{
|
||||
+ struct rtl8xxxu_priv *priv = hw->priv;
|
||||
+
|
||||
+ return find_first_zero_bit(priv->cam_map, priv->fops->max_sec_cam_num);
|
||||
+}
|
||||
+
|
||||
static int rtl8xxxu_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta,
|
||||
struct ieee80211_key_conf *key)
|
||||
{
|
||||
+ struct rtl8xxxu_vif *rtlvif = (struct rtl8xxxu_vif *)vif->drv_priv;
|
||||
struct rtl8xxxu_priv *priv = hw->priv;
|
||||
struct device *dev = &priv->udev->dev;
|
||||
u8 mac_addr[ETH_ALEN];
|
||||
@@ -6859,9 +6878,6 @@ static int rtl8xxxu_set_key(struct ieee8
|
||||
dev_dbg(dev, "%s: cmd %02x, cipher %08x, index %i\n",
|
||||
__func__, cmd, key->cipher, key->keyidx);
|
||||
|
||||
- if (vif->type != NL80211_IFTYPE_STATION)
|
||||
- return -EOPNOTSUPP;
|
||||
-
|
||||
if (key->keyidx > 3)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
@@ -6885,7 +6901,7 @@ static int rtl8xxxu_set_key(struct ieee8
|
||||
ether_addr_copy(mac_addr, sta->addr);
|
||||
} else {
|
||||
dev_dbg(dev, "%s: group key\n", __func__);
|
||||
- eth_broadcast_addr(mac_addr);
|
||||
+ ether_addr_copy(mac_addr, vif->bss_conf.bssid);
|
||||
}
|
||||
|
||||
val16 = rtl8xxxu_read16(priv, REG_CR);
|
||||
@@ -6899,16 +6915,28 @@ static int rtl8xxxu_set_key(struct ieee8
|
||||
|
||||
switch (cmd) {
|
||||
case SET_KEY:
|
||||
- key->hw_key_idx = key->keyidx;
|
||||
+
|
||||
+ retval = rtl8xxxu_get_free_sec_cam(hw);
|
||||
+ if (retval < 0)
|
||||
+ return -EOPNOTSUPP;
|
||||
+
|
||||
+ key->hw_key_idx = retval;
|
||||
+
|
||||
+ if (vif->type == NL80211_IFTYPE_AP && !(key->flags & IEEE80211_KEY_FLAG_PAIRWISE))
|
||||
+ rtlvif->hw_key_idx = key->hw_key_idx;
|
||||
+
|
||||
key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
|
||||
rtl8xxxu_cam_write(priv, key, mac_addr);
|
||||
+ set_bit(key->hw_key_idx, priv->cam_map);
|
||||
retval = 0;
|
||||
break;
|
||||
case DISABLE_KEY:
|
||||
rtl8xxxu_write32(priv, REG_CAM_WRITE, 0x00000000);
|
||||
val32 = CAM_CMD_POLLING | CAM_CMD_WRITE |
|
||||
- key->keyidx << CAM_CMD_KEY_SHIFT;
|
||||
+ key->hw_key_idx << CAM_CMD_KEY_SHIFT;
|
||||
rtl8xxxu_write32(priv, REG_CAM_CMD, val32);
|
||||
+ rtlvif->hw_key_idx = 0xff;
|
||||
+ clear_bit(key->hw_key_idx, priv->cam_map);
|
||||
retval = 0;
|
||||
break;
|
||||
default:
|
@ -0,0 +1,130 @@
|
||||
From 69abad618efd17e50bc6f880332ab36b660b0b34 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:41 +0100
|
||||
Subject: [PATCH 20/21] wifi: rtl8xxxu: make supporting AP mode only on port 0
|
||||
transparent
|
||||
|
||||
When the driver is used for concurrent mode, both virtual interfaces can
|
||||
be set to station or AP mode, though only one can be in AP mode at the
|
||||
same time.
|
||||
|
||||
In order to keep the code simple, use only hw port 0 for AP mode. When
|
||||
an interface is added in AP mode which would be assigned to port 1, use
|
||||
a switch_port function to transparently swap the mapping between virtual
|
||||
interface and hw port.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-21-martin.kaistra@linutronix.de
|
||||
---
|
||||
.../wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 91 ++++++++++++++++++-
|
||||
1 file changed, 89 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -6624,6 +6624,91 @@ error:
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static void rtl8xxxu_switch_ports(struct rtl8xxxu_priv *priv)
|
||||
+{
|
||||
+ u8 macid[ETH_ALEN], bssid[ETH_ALEN], macid_1[ETH_ALEN], bssid_1[ETH_ALEN];
|
||||
+ u8 msr, bcn_ctrl, bcn_ctrl_1, atimwnd[2], atimwnd_1[2];
|
||||
+ struct rtl8xxxu_vif *rtlvif;
|
||||
+ struct ieee80211_vif *vif;
|
||||
+ u8 tsftr[8], tsftr_1[8];
|
||||
+ int i;
|
||||
+
|
||||
+ msr = rtl8xxxu_read8(priv, REG_MSR);
|
||||
+ bcn_ctrl = rtl8xxxu_read8(priv, REG_BEACON_CTRL);
|
||||
+ bcn_ctrl_1 = rtl8xxxu_read8(priv, REG_BEACON_CTRL_1);
|
||||
+
|
||||
+ for (i = 0; i < ARRAY_SIZE(atimwnd); i++)
|
||||
+ atimwnd[i] = rtl8xxxu_read8(priv, REG_ATIMWND + i);
|
||||
+ for (i = 0; i < ARRAY_SIZE(atimwnd_1); i++)
|
||||
+ atimwnd_1[i] = rtl8xxxu_read8(priv, REG_ATIMWND_1 + i);
|
||||
+
|
||||
+ for (i = 0; i < ARRAY_SIZE(tsftr); i++)
|
||||
+ tsftr[i] = rtl8xxxu_read8(priv, REG_TSFTR + i);
|
||||
+ for (i = 0; i < ARRAY_SIZE(tsftr); i++)
|
||||
+ tsftr_1[i] = rtl8xxxu_read8(priv, REG_TSFTR1 + i);
|
||||
+
|
||||
+ for (i = 0; i < ARRAY_SIZE(macid); i++)
|
||||
+ macid[i] = rtl8xxxu_read8(priv, REG_MACID + i);
|
||||
+
|
||||
+ for (i = 0; i < ARRAY_SIZE(bssid); i++)
|
||||
+ bssid[i] = rtl8xxxu_read8(priv, REG_BSSID + i);
|
||||
+
|
||||
+ for (i = 0; i < ARRAY_SIZE(macid_1); i++)
|
||||
+ macid_1[i] = rtl8xxxu_read8(priv, REG_MACID1 + i);
|
||||
+
|
||||
+ for (i = 0; i < ARRAY_SIZE(bssid_1); i++)
|
||||
+ bssid_1[i] = rtl8xxxu_read8(priv, REG_BSSID1 + i);
|
||||
+
|
||||
+ /* disable bcn function, disable update TSF */
|
||||
+ rtl8xxxu_write8(priv, REG_BEACON_CTRL, (bcn_ctrl &
|
||||
+ (~BEACON_FUNCTION_ENABLE)) | BEACON_DISABLE_TSF_UPDATE);
|
||||
+ rtl8xxxu_write8(priv, REG_BEACON_CTRL_1, (bcn_ctrl_1 &
|
||||
+ (~BEACON_FUNCTION_ENABLE)) | BEACON_DISABLE_TSF_UPDATE);
|
||||
+
|
||||
+ /* switch msr */
|
||||
+ msr = (msr & 0xf0) | ((msr & 0x03) << 2) | ((msr & 0x0c) >> 2);
|
||||
+ rtl8xxxu_write8(priv, REG_MSR, msr);
|
||||
+
|
||||
+ /* write port0 */
|
||||
+ rtl8xxxu_write8(priv, REG_BEACON_CTRL, bcn_ctrl_1 & ~BEACON_FUNCTION_ENABLE);
|
||||
+ for (i = 0; i < ARRAY_SIZE(atimwnd_1); i++)
|
||||
+ rtl8xxxu_write8(priv, REG_ATIMWND + i, atimwnd_1[i]);
|
||||
+ for (i = 0; i < ARRAY_SIZE(tsftr_1); i++)
|
||||
+ rtl8xxxu_write8(priv, REG_TSFTR + i, tsftr_1[i]);
|
||||
+ for (i = 0; i < ARRAY_SIZE(macid_1); i++)
|
||||
+ rtl8xxxu_write8(priv, REG_MACID + i, macid_1[i]);
|
||||
+ for (i = 0; i < ARRAY_SIZE(bssid_1); i++)
|
||||
+ rtl8xxxu_write8(priv, REG_BSSID + i, bssid_1[i]);
|
||||
+
|
||||
+ /* write port1 */
|
||||
+ rtl8xxxu_write8(priv, REG_BEACON_CTRL_1, bcn_ctrl & ~BEACON_FUNCTION_ENABLE);
|
||||
+ for (i = 0; i < ARRAY_SIZE(atimwnd); i++)
|
||||
+ rtl8xxxu_write8(priv, REG_ATIMWND_1 + i, atimwnd[i]);
|
||||
+ for (i = 0; i < ARRAY_SIZE(tsftr); i++)
|
||||
+ rtl8xxxu_write8(priv, REG_TSFTR1 + i, tsftr[i]);
|
||||
+ for (i = 0; i < ARRAY_SIZE(macid); i++)
|
||||
+ rtl8xxxu_write8(priv, REG_MACID1 + i, macid[i]);
|
||||
+ for (i = 0; i < ARRAY_SIZE(bssid); i++)
|
||||
+ rtl8xxxu_write8(priv, REG_BSSID1 + i, bssid[i]);
|
||||
+
|
||||
+ /* write bcn ctl */
|
||||
+ rtl8xxxu_write8(priv, REG_BEACON_CTRL, bcn_ctrl_1);
|
||||
+ rtl8xxxu_write8(priv, REG_BEACON_CTRL_1, bcn_ctrl);
|
||||
+
|
||||
+ vif = priv->vifs[0];
|
||||
+ priv->vifs[0] = priv->vifs[1];
|
||||
+ priv->vifs[1] = vif;
|
||||
+
|
||||
+ /* priv->vifs[0] is NULL here, based on how this function is currently
|
||||
+ * called from rtl8xxxu_add_interface().
|
||||
+ * When this function will be used in the future for a different
|
||||
+ * scenario, please check whether vifs[0] or vifs[1] can be NULL and if
|
||||
+ * necessary add code to set port_num = 1.
|
||||
+ */
|
||||
+ rtlvif = (struct rtl8xxxu_vif *)priv->vifs[1]->drv_priv;
|
||||
+ rtlvif->port_num = 1;
|
||||
+}
|
||||
+
|
||||
static int rtl8xxxu_add_interface(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
@@ -6651,8 +6736,10 @@ static int rtl8xxxu_add_interface(struct
|
||||
}
|
||||
break;
|
||||
case NL80211_IFTYPE_AP:
|
||||
- if (port_num == 1)
|
||||
- return -EOPNOTSUPP;
|
||||
+ if (port_num == 1) {
|
||||
+ rtl8xxxu_switch_ports(priv);
|
||||
+ port_num = 0;
|
||||
+ }
|
||||
|
||||
rtl8xxxu_write8(priv, REG_BEACON_CTRL,
|
||||
BEACON_DISABLE_TSF_UPDATE | BEACON_CTRL_MBSSID);
|
@ -0,0 +1,76 @@
|
||||
From 1cd165adf314f6bf25cde58f02f4ff51d01730b0 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:42 +0100
|
||||
Subject: [PATCH 21/21] wifi: rtl8xxxu: declare concurrent mode support for
|
||||
8188f
|
||||
|
||||
Everything is in place now for concurrent mode, we can tell the system
|
||||
that we support it.
|
||||
We will allow a maximum of 2 virtual interfaces, one of them can be in
|
||||
AP mode.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-22-martin.kaistra@linutronix.de
|
||||
---
|
||||
.../net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 1 +
|
||||
.../realtek/rtl8xxxu/rtl8xxxu_8188f.c | 1 +
|
||||
.../wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 19 +++++++++++++++++++
|
||||
3 files changed, 21 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
|
||||
@@ -1992,6 +1992,7 @@ struct rtl8xxxu_fileops {
|
||||
u8 init_reg_rxfltmap:1;
|
||||
u8 init_reg_pkt_life_time:1;
|
||||
u8 init_reg_hmtfr:1;
|
||||
+ u8 supports_concurrent:1;
|
||||
u8 ampdu_max_time;
|
||||
u8 ustime_tsf_edca;
|
||||
u16 max_aggr_num;
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188f.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188f.c
|
||||
@@ -1752,6 +1752,7 @@ struct rtl8xxxu_fileops rtl8188fu_fops =
|
||||
.supports_ap = 1,
|
||||
.max_macid_num = 16,
|
||||
.max_sec_cam_num = 16,
|
||||
+ .supports_concurrent = 1,
|
||||
.adda_1t_init = 0x03c00014,
|
||||
.adda_1t_path_on = 0x03c00014,
|
||||
.trxff_boundary = 0x3f7f,
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -7665,6 +7665,20 @@ static void rtl8xxxu_deinit_led(struct r
|
||||
led_classdev_unregister(led);
|
||||
}
|
||||
|
||||
+struct ieee80211_iface_limit rtl8xxxu_limits[] = {
|
||||
+ { .max = 2, .types = BIT(NL80211_IFTYPE_STATION), },
|
||||
+ { .max = 1, .types = BIT(NL80211_IFTYPE_AP), },
|
||||
+};
|
||||
+
|
||||
+struct ieee80211_iface_combination rtl8xxxu_combinations[] = {
|
||||
+ {
|
||||
+ .limits = rtl8xxxu_limits,
|
||||
+ .n_limits = ARRAY_SIZE(rtl8xxxu_limits),
|
||||
+ .max_interfaces = 2,
|
||||
+ .num_different_channels = 1,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
static int rtl8xxxu_probe(struct usb_interface *interface,
|
||||
const struct usb_device_id *id)
|
||||
{
|
||||
@@ -7810,6 +7824,11 @@ static int rtl8xxxu_probe(struct usb_int
|
||||
hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_AP);
|
||||
hw->queues = 4;
|
||||
|
||||
+ if (priv->fops->supports_concurrent) {
|
||||
+ hw->wiphy->iface_combinations = rtl8xxxu_combinations;
|
||||
+ hw->wiphy->n_iface_combinations = ARRAY_SIZE(rtl8xxxu_combinations);
|
||||
+ }
|
||||
+
|
||||
sband = &rtl8xxxu_supported_band;
|
||||
sband->ht_cap.ht_supported = true;
|
||||
sband->ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
|
@ -0,0 +1,98 @@
|
||||
From 9475cc7ac31503521af95e38151e9d856e8ff30b Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Sun, 31 Dec 2023 00:45:54 +0200
|
||||
Subject: [PATCH 1/2] wifi: rtl8xxxu: Fix LED control code of RTL8192FU
|
||||
|
||||
Some devices, like the Comfast CF-826F, use LED1, which already works.
|
||||
Others, like Asus USB-N13 C1, use LED0, which doesn't work correctly.
|
||||
|
||||
Write the right values to the LED control registers to make LED0 work
|
||||
as well.
|
||||
|
||||
This is unfortunately tested only with the Comfast CF-826F.
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/7a2c3158-3a45-4466-b11e-fc09802b20e2@gmail.com
|
||||
---
|
||||
.../realtek/rtl8xxxu/rtl8xxxu_8192f.c | 32 +++++++++++++------
|
||||
.../wireless/realtek/rtl8xxxu/rtl8xxxu_regs.h | 15 +++++++++
|
||||
2 files changed, 38 insertions(+), 9 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192f.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192f.c
|
||||
@@ -2014,26 +2014,40 @@ static int rtl8192fu_led_brightness_set(
|
||||
struct rtl8xxxu_priv *priv = container_of(led_cdev,
|
||||
struct rtl8xxxu_priv,
|
||||
led_cdev);
|
||||
- u16 ledcfg;
|
||||
+ u32 ledcfg;
|
||||
|
||||
/* Values obtained by observing the USB traffic from the Windows driver. */
|
||||
rtl8xxxu_write32(priv, REG_SW_GPIO_SHARE_CTRL_0, 0x20080);
|
||||
rtl8xxxu_write32(priv, REG_SW_GPIO_SHARE_CTRL_1, 0x1b0000);
|
||||
|
||||
- ledcfg = rtl8xxxu_read16(priv, REG_LEDCFG0);
|
||||
+ ledcfg = rtl8xxxu_read32(priv, REG_LEDCFG0);
|
||||
+
|
||||
+ /* Comfast CF-826F uses LED1. Asus USB-N13 C1 uses LED0. Set both. */
|
||||
+
|
||||
+ u32p_replace_bits(&ledcfg, LED_GPIO_ENABLE, LEDCFG0_LED2EN);
|
||||
+ u32p_replace_bits(&ledcfg, LED_IO_MODE_OUTPUT, LEDCFG0_LED0_IO_MODE);
|
||||
+ u32p_replace_bits(&ledcfg, LED_IO_MODE_OUTPUT, LEDCFG0_LED1_IO_MODE);
|
||||
|
||||
if (brightness == LED_OFF) {
|
||||
- /* Value obtained like above. */
|
||||
- ledcfg = BIT(1) | BIT(7);
|
||||
+ u32p_replace_bits(&ledcfg, LED_MODE_SW_CTRL, LEDCFG0_LED0CM);
|
||||
+ u32p_replace_bits(&ledcfg, LED_SW_OFF, LEDCFG0_LED0SV);
|
||||
+ u32p_replace_bits(&ledcfg, LED_MODE_SW_CTRL, LEDCFG0_LED1CM);
|
||||
+ u32p_replace_bits(&ledcfg, LED_SW_OFF, LEDCFG0_LED1SV);
|
||||
} else if (brightness == LED_ON) {
|
||||
- /* Value obtained like above. */
|
||||
- ledcfg = BIT(1) | BIT(7) | BIT(11);
|
||||
+ u32p_replace_bits(&ledcfg, LED_MODE_SW_CTRL, LEDCFG0_LED0CM);
|
||||
+ u32p_replace_bits(&ledcfg, LED_SW_ON, LEDCFG0_LED0SV);
|
||||
+ u32p_replace_bits(&ledcfg, LED_MODE_SW_CTRL, LEDCFG0_LED1CM);
|
||||
+ u32p_replace_bits(&ledcfg, LED_SW_ON, LEDCFG0_LED1SV);
|
||||
} else if (brightness == RTL8XXXU_HW_LED_CONTROL) {
|
||||
- /* Value obtained by brute force. */
|
||||
- ledcfg = BIT(8) | BIT(9);
|
||||
+ u32p_replace_bits(&ledcfg, LED_MODE_TX_OR_RX_EVENTS,
|
||||
+ LEDCFG0_LED0CM);
|
||||
+ u32p_replace_bits(&ledcfg, LED_SW_OFF, LEDCFG0_LED0SV);
|
||||
+ u32p_replace_bits(&ledcfg, LED_MODE_TX_OR_RX_EVENTS,
|
||||
+ LEDCFG0_LED1CM);
|
||||
+ u32p_replace_bits(&ledcfg, LED_SW_OFF, LEDCFG0_LED1SV);
|
||||
}
|
||||
|
||||
- rtl8xxxu_write16(priv, REG_LEDCFG0, ledcfg);
|
||||
+ rtl8xxxu_write32(priv, REG_LEDCFG0, ledcfg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_regs.h
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_regs.h
|
||||
@@ -146,6 +146,21 @@
|
||||
#define GPIO_INTM_EDGE_TRIG_IRQ BIT(9)
|
||||
|
||||
#define REG_LEDCFG0 0x004c
|
||||
+#define LEDCFG0_LED0CM GENMASK(2, 0)
|
||||
+#define LEDCFG0_LED1CM GENMASK(10, 8)
|
||||
+#define LED_MODE_SW_CTRL 0x0
|
||||
+#define LED_MODE_TX_OR_RX_EVENTS 0x3
|
||||
+#define LEDCFG0_LED0SV BIT(3)
|
||||
+#define LEDCFG0_LED1SV BIT(11)
|
||||
+#define LED_SW_OFF 0x0
|
||||
+#define LED_SW_ON 0x1
|
||||
+#define LEDCFG0_LED0_IO_MODE BIT(7)
|
||||
+#define LEDCFG0_LED1_IO_MODE BIT(15)
|
||||
+#define LED_IO_MODE_OUTPUT 0x0
|
||||
+#define LED_IO_MODE_INPUT 0x1
|
||||
+#define LEDCFG0_LED2EN BIT(21)
|
||||
+#define LED_GPIO_DISABLE 0x0
|
||||
+#define LED_GPIO_ENABLE 0x1
|
||||
#define LEDCFG0_DPDT_SELECT BIT(23)
|
||||
#define REG_LEDCFG1 0x004d
|
||||
#define LEDCFG1_HW_LED_CONTROL BIT(1)
|
@ -0,0 +1,36 @@
|
||||
From 80850ca041f2c7ee28fa5e47c5c1b106415f099f Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Tue, 2 Jan 2024 21:33:07 +0200
|
||||
Subject: [PATCH 2/2] wifi: rtl8xxxu: Fix off by one initial RTS rate
|
||||
|
||||
rtl8xxxu_set_basic_rates() sets the wrong initial RTS rate. It sets the
|
||||
next higher rate than the one it should set, e.g. 36M instead of 24M.
|
||||
|
||||
The while loop was supposed to find the index of the most significant
|
||||
bit which is 1, but it was copied incorrectly from the vendor driver.
|
||||
Use __fls() instead.
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/761e6836-6cd6-4930-91b6-0446834655c5@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 7 +++----
|
||||
1 file changed, 3 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -4870,10 +4870,9 @@ static void rtl8xxxu_set_basic_rates(str
|
||||
|
||||
dev_dbg(&priv->udev->dev, "%s: rates %08x\n", __func__, rate_cfg);
|
||||
|
||||
- while (rate_cfg) {
|
||||
- rate_cfg = (rate_cfg >> 1);
|
||||
- rate_idx++;
|
||||
- }
|
||||
+ if (rate_cfg)
|
||||
+ rate_idx = __fls(rate_cfg);
|
||||
+
|
||||
rtl8xxxu_write8(priv, REG_INIRTS_RATE_SEL, rate_idx);
|
||||
}
|
||||
|
@ -0,0 +1,27 @@
|
||||
From 1213acb478a7181cd73eeaf00db430f1e45b1361 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Thu, 11 Jan 2024 17:36:27 +0100
|
||||
Subject: [PATCH 1/2] wifi: rtl8xxxu: add cancel_work_sync() for c2hcmd_work
|
||||
|
||||
The workqueue might still be running, when the driver is stopped. To
|
||||
avoid a use-after-free, call cancel_work_sync() in rtl8xxxu_stop().
|
||||
|
||||
Fixes: e542e66b7c2e ("rtl8xxxu: add bluetooth co-existence support for single antenna")
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20240111163628.320697-2-martin.kaistra@linutronix.de
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -7480,6 +7480,7 @@ static void rtl8xxxu_stop(struct ieee802
|
||||
if (priv->usb_interrupts)
|
||||
rtl8xxxu_write32(priv, REG_USB_HIMR, 0);
|
||||
|
||||
+ cancel_work_sync(&priv->c2hcmd_work);
|
||||
cancel_delayed_work_sync(&priv->ra_watchdog);
|
||||
|
||||
rtl8xxxu_free_rx_resources(priv);
|
@ -0,0 +1,100 @@
|
||||
From ece90a8622320bf5a24d3326da1f8e109891573c Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Thu, 11 Jan 2024 17:36:28 +0100
|
||||
Subject: [PATCH 2/2] wifi: rtl8xxxu: enable channel switch support
|
||||
|
||||
The CSA countdown in the beacon frames, which are sent out by firmware,
|
||||
needs to get updated by the driver. To achieve this, convert
|
||||
update_beacon_work to delayed_work and schedule it with the beacon
|
||||
interval in case CSA is active and the countdown is not complete.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20240111163628.320697-3-martin.kaistra@linutronix.de
|
||||
---
|
||||
.../net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 2 +-
|
||||
.../wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 19 +++++++++++++++----
|
||||
2 files changed, 16 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
|
||||
@@ -1900,7 +1900,7 @@ struct rtl8xxxu_priv {
|
||||
struct delayed_work ra_watchdog;
|
||||
struct work_struct c2hcmd_work;
|
||||
struct sk_buff_head c2hcmd_queue;
|
||||
- struct work_struct update_beacon_work;
|
||||
+ struct delayed_work update_beacon_work;
|
||||
struct rtl8xxxu_btcoex bt_coex;
|
||||
struct rtl8xxxu_ra_report ra_report;
|
||||
struct rtl8xxxu_cfo_tracking cfo_tracking;
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -4605,7 +4605,7 @@ static int rtl8xxxu_set_tim(struct ieee8
|
||||
{
|
||||
struct rtl8xxxu_priv *priv = hw->priv;
|
||||
|
||||
- schedule_work(&priv->update_beacon_work);
|
||||
+ schedule_delayed_work(&priv->update_beacon_work, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -5107,7 +5107,7 @@ rtl8xxxu_bss_info_changed(struct ieee802
|
||||
}
|
||||
|
||||
if (changed & BSS_CHANGED_BEACON)
|
||||
- schedule_work(&priv->update_beacon_work);
|
||||
+ schedule_delayed_work(&priv->update_beacon_work, 0);
|
||||
|
||||
error:
|
||||
return;
|
||||
@@ -5726,7 +5726,7 @@ static void rtl8xxxu_send_beacon_frame(s
|
||||
static void rtl8xxxu_update_beacon_work_callback(struct work_struct *work)
|
||||
{
|
||||
struct rtl8xxxu_priv *priv =
|
||||
- container_of(work, struct rtl8xxxu_priv, update_beacon_work);
|
||||
+ container_of(work, struct rtl8xxxu_priv, update_beacon_work.work);
|
||||
struct ieee80211_hw *hw = priv->hw;
|
||||
struct ieee80211_vif *vif = priv->vifs[0];
|
||||
|
||||
@@ -5735,6 +5735,14 @@ static void rtl8xxxu_update_beacon_work_
|
||||
return;
|
||||
}
|
||||
|
||||
+ if (vif->bss_conf.csa_active) {
|
||||
+ if (ieee80211_beacon_cntdwn_is_complete(vif)) {
|
||||
+ ieee80211_csa_finish(vif);
|
||||
+ return;
|
||||
+ }
|
||||
+ schedule_delayed_work(&priv->update_beacon_work,
|
||||
+ msecs_to_jiffies(vif->bss_conf.beacon_int));
|
||||
+ }
|
||||
rtl8xxxu_send_beacon_frame(hw, vif);
|
||||
}
|
||||
|
||||
@@ -7482,6 +7490,7 @@ static void rtl8xxxu_stop(struct ieee802
|
||||
|
||||
cancel_work_sync(&priv->c2hcmd_work);
|
||||
cancel_delayed_work_sync(&priv->ra_watchdog);
|
||||
+ cancel_delayed_work_sync(&priv->update_beacon_work);
|
||||
|
||||
rtl8xxxu_free_rx_resources(priv);
|
||||
rtl8xxxu_free_tx_resources(priv);
|
||||
@@ -7763,7 +7772,7 @@ static int rtl8xxxu_probe(struct usb_int
|
||||
spin_lock_init(&priv->rx_urb_lock);
|
||||
INIT_WORK(&priv->rx_urb_wq, rtl8xxxu_rx_urb_work);
|
||||
INIT_DELAYED_WORK(&priv->ra_watchdog, rtl8xxxu_watchdog_callback);
|
||||
- INIT_WORK(&priv->update_beacon_work, rtl8xxxu_update_beacon_work_callback);
|
||||
+ INIT_DELAYED_WORK(&priv->update_beacon_work, rtl8xxxu_update_beacon_work_callback);
|
||||
skb_queue_head_init(&priv->c2hcmd_queue);
|
||||
|
||||
usb_set_intfdata(interface, hw);
|
||||
@@ -7824,6 +7833,8 @@ static int rtl8xxxu_probe(struct usb_int
|
||||
hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_AP);
|
||||
hw->queues = 4;
|
||||
|
||||
+ hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
|
||||
+
|
||||
if (priv->fops->supports_concurrent) {
|
||||
hw->wiphy->iface_combinations = rtl8xxxu_combinations;
|
||||
hw->wiphy->n_iface_combinations = ARRAY_SIZE(rtl8xxxu_combinations);
|
@ -0,0 +1,31 @@
|
||||
From 426e7b4773921d07ab4ab8ba16fbad396d6c9971 Mon Sep 17 00:00:00 2001
|
||||
From: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Date: Tue, 16 Jan 2024 16:09:44 +0800
|
||||
Subject: [PATCH 1/2] wifi: rtl8xxxu: convert EN_DESC_ID of TX descriptor to
|
||||
le32 type
|
||||
|
||||
Fields of TX descriptor are little-endian order, so correct EN_DESC_ID
|
||||
field to le32 type.
|
||||
|
||||
Fixes: b837f78fbffa ("wifi: rtl8xxxu: add hw crypto support for AP mode")
|
||||
Reported-by: kernel test robot <lkp@intel.com>
|
||||
Closes: https://lore.kernel.org/oe-kbuild-all/202401161318.YtXoCkjU-lkp@intel.com/
|
||||
Cc: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20240116080945.20172-1-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -5619,7 +5619,7 @@ static void rtl8xxxu_tx(struct ieee80211
|
||||
break;
|
||||
}
|
||||
if (bmc && rtlvif->hw_key_idx != 0xff) {
|
||||
- tx_desc->txdw1 |= TXDESC_EN_DESC_ID;
|
||||
+ tx_desc->txdw1 |= cpu_to_le32(TXDESC_EN_DESC_ID);
|
||||
macid = rtlvif->hw_key_idx;
|
||||
}
|
||||
}
|
@ -0,0 +1,36 @@
|
||||
From 92c7428f942da7dfcdc629b05b5114f80822d7a4 Mon Sep 17 00:00:00 2001
|
||||
From: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Date: Tue, 16 Jan 2024 16:09:45 +0800
|
||||
Subject: [PATCH 2/2] wifi: rtl8xxxu: make instances of iface limit and
|
||||
combination to be static const
|
||||
|
||||
rtl8xxxu_limits and rtl8xxxu_combinations can be static const, so add
|
||||
modifiers as desire. Otherwise, Sparse reports warnings
|
||||
|
||||
rtl8xxxu_core.c:7677:30: warning: symbol 'rtl8xxxu_limits' was not declared. Should it be static?
|
||||
rtl8xxxu_core.c:7682:36: warning: symbol 'rtl8xxxu_combinations' was not declared. Should it be static?
|
||||
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20240116080945.20172-2-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -7674,12 +7674,12 @@ static void rtl8xxxu_deinit_led(struct r
|
||||
led_classdev_unregister(led);
|
||||
}
|
||||
|
||||
-struct ieee80211_iface_limit rtl8xxxu_limits[] = {
|
||||
+static const struct ieee80211_iface_limit rtl8xxxu_limits[] = {
|
||||
{ .max = 2, .types = BIT(NL80211_IFTYPE_STATION), },
|
||||
{ .max = 1, .types = BIT(NL80211_IFTYPE_AP), },
|
||||
};
|
||||
|
||||
-struct ieee80211_iface_combination rtl8xxxu_combinations[] = {
|
||||
+static const struct ieee80211_iface_combination rtl8xxxu_combinations[] = {
|
||||
{
|
||||
.limits = rtl8xxxu_limits,
|
||||
.n_limits = ARRAY_SIZE(rtl8xxxu_limits),
|
@ -0,0 +1,100 @@
|
||||
From 563d5025cf3b51c7bf20e6966af433ed5f838875 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Tue, 16 Jan 2024 10:50:01 +0100
|
||||
Subject: [PATCH] wifi: rtl8xxxu: add missing number of sec cam entries for all
|
||||
variants
|
||||
|
||||
Commit b837f78fbffa ("wifi: rtl8xxxu: add hw crypto support for AP
|
||||
mode") introduced max_sec_cam_num as a member of rtl8xxxu_fileops.
|
||||
It was missed to set this number for all variants except 8188f, which
|
||||
caused rtl8xxxu_get_free_sec_cam() to always return 0 and therefore breaking
|
||||
encrypted traffic.
|
||||
|
||||
Fix it by adding the numbers for all variants. The values are taken from
|
||||
the vendor drivers and rtlwifi.
|
||||
|
||||
Link: https://lore.kernel.org/linux-wireless/20240111163603.2325-1-zenmchen@gmail.com/
|
||||
Fixes: b837f78fbffa ("wifi: rtl8xxxu: add hw crypto support for AP mode")
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20240116095001.399500-1-martin.kaistra@linutronix.de
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c | 1 +
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192c.c | 1 +
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192e.c | 1 +
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192f.c | 1 +
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8710b.c | 1 +
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8723a.c | 1 +
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8723b.c | 1 +
|
||||
7 files changed, 7 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
@@ -1882,6 +1882,7 @@ struct rtl8xxxu_fileops rtl8188eu_fops =
|
||||
.has_tx_report = 1,
|
||||
.init_reg_pkt_life_time = 1,
|
||||
.gen2_thermal_meter = 1,
|
||||
+ .max_sec_cam_num = 32,
|
||||
.adda_1t_init = 0x0b1b25a0,
|
||||
.adda_1t_path_on = 0x0bdb25a0,
|
||||
/*
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192c.c
|
||||
@@ -613,6 +613,7 @@ struct rtl8xxxu_fileops rtl8192cu_fops =
|
||||
.rx_agg_buf_size = 16000,
|
||||
.tx_desc_size = sizeof(struct rtl8xxxu_txdesc32),
|
||||
.rx_desc_size = sizeof(struct rtl8xxxu_rxdesc16),
|
||||
+ .max_sec_cam_num = 32,
|
||||
.adda_1t_init = 0x0b1b25a0,
|
||||
.adda_1t_path_on = 0x0bdb25a0,
|
||||
.adda_2t_path_on_a = 0x04db25a4,
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192e.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192e.c
|
||||
@@ -1769,6 +1769,7 @@ struct rtl8xxxu_fileops rtl8192eu_fops =
|
||||
.needs_full_init = 1,
|
||||
.supports_ap = 1,
|
||||
.max_macid_num = 128,
|
||||
+ .max_sec_cam_num = 64,
|
||||
.adda_1t_init = 0x0fc01616,
|
||||
.adda_1t_path_on = 0x0fc01616,
|
||||
.adda_2t_path_on_a = 0x0fc01616,
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192f.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192f.c
|
||||
@@ -2095,6 +2095,7 @@ struct rtl8xxxu_fileops rtl8192fu_fops =
|
||||
.max_aggr_num = 0x1f1f,
|
||||
.supports_ap = 1,
|
||||
.max_macid_num = 128,
|
||||
+ .max_sec_cam_num = 64,
|
||||
.trxff_boundary = 0x3f3f,
|
||||
.pbp_rx = PBP_PAGE_SIZE_256,
|
||||
.pbp_tx = PBP_PAGE_SIZE_256,
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8710b.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8710b.c
|
||||
@@ -1877,6 +1877,7 @@ struct rtl8xxxu_fileops rtl8710bu_fops =
|
||||
.max_aggr_num = 0x0c14,
|
||||
.supports_ap = 1,
|
||||
.max_macid_num = 16,
|
||||
+ .max_sec_cam_num = 32,
|
||||
.adda_1t_init = 0x03c00016,
|
||||
.adda_1t_path_on = 0x03c00016,
|
||||
.trxff_boundary = 0x3f7f,
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8723a.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8723a.c
|
||||
@@ -510,6 +510,7 @@ struct rtl8xxxu_fileops rtl8723au_fops =
|
||||
.rx_agg_buf_size = 16000,
|
||||
.tx_desc_size = sizeof(struct rtl8xxxu_txdesc32),
|
||||
.rx_desc_size = sizeof(struct rtl8xxxu_rxdesc16),
|
||||
+ .max_sec_cam_num = 32,
|
||||
.adda_1t_init = 0x0b1b25a0,
|
||||
.adda_1t_path_on = 0x0bdb25a0,
|
||||
.adda_2t_path_on_a = 0x04db25a4,
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8723b.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8723b.c
|
||||
@@ -1744,6 +1744,7 @@ struct rtl8xxxu_fileops rtl8723bu_fops =
|
||||
.max_aggr_num = 0x0c14,
|
||||
.supports_ap = 1,
|
||||
.max_macid_num = 128,
|
||||
+ .max_sec_cam_num = 64,
|
||||
.adda_1t_init = 0x01c00014,
|
||||
.adda_1t_path_on = 0x01c00014,
|
||||
.adda_2t_path_on_a = 0x01c00014,
|
@ -0,0 +1,37 @@
|
||||
From 17903a283593c1dbf9da041f836004163ca30f7b Mon Sep 17 00:00:00 2001
|
||||
From: Dan Carpenter <dan.carpenter@linaro.org>
|
||||
Date: Wed, 31 Jan 2024 10:10:07 +0300
|
||||
Subject: [PATCH] wifi: rtl8xxxu: fix error messages
|
||||
|
||||
The first parameter of WARN_ONCE() is a condition so this code will end
|
||||
up printing the function name instead of the proper message.
|
||||
|
||||
Fixes: 3ff7a05996f9 ("wifi: rtl8xxxu: support setting bssid register for multiple interfaces")
|
||||
Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/7b144531-a8da-4725-8911-9b614a525a35@moroto.mountain
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -3593,7 +3593,7 @@ static int rtl8xxxu_set_mac(struct rtl8x
|
||||
reg = REG_MACID1;
|
||||
break;
|
||||
default:
|
||||
- WARN_ONCE("%s: invalid port_num\n", __func__);
|
||||
+ WARN_ONCE(1, "%s: invalid port_num\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -3618,7 +3618,7 @@ static int rtl8xxxu_set_bssid(struct rtl
|
||||
reg = REG_BSSID1;
|
||||
break;
|
||||
default:
|
||||
- WARN_ONCE("%s: invalid port_num\n", __func__);
|
||||
+ WARN_ONCE(1, "%s: invalid port_num\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -0,0 +1,36 @@
|
||||
From 1209f487d452ff7e822dec30661fd6b5163fb8cf Mon Sep 17 00:00:00 2001
|
||||
From: Chun Qiu <cqca@cock.lu>
|
||||
Date: Mon, 29 Jan 2024 13:30:30 +0800
|
||||
Subject: [PATCH] wifi: rtl8xxxu: Add TP-Link TL-WN823N V2
|
||||
|
||||
TP-Link TL-WN823N V2 (2357:0135) is based on rtl8192fu and has been
|
||||
tested to work with the rtl8xxxu driver.
|
||||
|
||||
Signed-off-by: Chun Qiu <cqca@cock.lu>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20240129053030.16369-1-cqca@cock.lu
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -7733,7 +7733,7 @@ static int rtl8xxxu_probe(struct usb_int
|
||||
untested = 0;
|
||||
break;
|
||||
case 0x2357:
|
||||
- if (id->idProduct == 0x0109)
|
||||
+ if (id->idProduct == 0x0109 || id->idProduct == 0x0135)
|
||||
untested = 0;
|
||||
break;
|
||||
case 0x0b05:
|
||||
@@ -8025,6 +8025,9 @@ static const struct usb_device_id dev_ta
|
||||
.driver_info = (unsigned long)&rtl8192fu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0x318b, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192fu_fops},
|
||||
+/* TP-Link TL-WN823N V2 */
|
||||
+{USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0135, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (unsigned long)&rtl8192fu_fops},
|
||||
#ifdef CPTCFG_RTL8XXXU_UNTESTED
|
||||
/* Still supported by rtlwifi */
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0x8176, 0xff, 0xff, 0xff),
|
@ -0,0 +1,411 @@
|
||||
From 94dd7ce1885e530a7b10bbe50d5d68ba1bb99e6e Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Mon, 5 Feb 2024 10:30:40 +0100
|
||||
Subject: [PATCH] wifi: rtl8xxxu: update rate mask per sta
|
||||
|
||||
Until now, rtl8xxxu_watchdog_callback() only fetches RSSI and updates
|
||||
the rate mask in station mode. This means, in AP mode only the default
|
||||
rate mask is used.
|
||||
|
||||
In order to have the rate mask reflect the actual connection quality,
|
||||
extend rtl8xxxu_watchdog_callback() to iterate over every sta. Like in
|
||||
the rtw88 driver, add a function to collect all currently present stas
|
||||
and then iterate over a list of copies to ensure no RCU lock problems
|
||||
for register access via USB. Remove the existing RCU lock in
|
||||
rtl8xxxu_refresh_rate_mask().
|
||||
|
||||
Since the currently used ieee80211_ave_rssi() is only for 'vif', add
|
||||
driver-level tracking of RSSI per sta.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20240205093040.1941140-1-martin.kaistra@linutronix.de
|
||||
---
|
||||
.../net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 8 +-
|
||||
.../wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 188 ++++++++++++++----
|
||||
2 files changed, 158 insertions(+), 38 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
|
||||
@@ -6,6 +6,7 @@
|
||||
*/
|
||||
|
||||
#include <asm/byteorder.h>
|
||||
+#include <linux/average.h>
|
||||
|
||||
#define RTL8XXXU_DEBUG_REG_WRITE 0x01
|
||||
#define RTL8XXXU_DEBUG_REG_READ 0x02
|
||||
@@ -1858,6 +1859,8 @@ struct rtl8xxxu_priv {
|
||||
int next_mbox;
|
||||
int nr_out_eps;
|
||||
|
||||
+ /* Ensure no added or deleted stas while iterating */
|
||||
+ struct mutex sta_mutex;
|
||||
struct mutex h2c_mutex;
|
||||
/* Protect the indirect register accesses of RTL8710BU. */
|
||||
struct mutex syson_indirect_access_mutex;
|
||||
@@ -1892,7 +1895,6 @@ struct rtl8xxxu_priv {
|
||||
u8 pi_enabled:1;
|
||||
u8 no_pape:1;
|
||||
u8 int_buf[USB_INTR_CONTENT_LENGTH];
|
||||
- u8 rssi_level;
|
||||
DECLARE_BITMAP(tx_aggr_started, IEEE80211_NUM_TIDS);
|
||||
DECLARE_BITMAP(tid_tx_operational, IEEE80211_NUM_TIDS);
|
||||
|
||||
@@ -1913,11 +1915,15 @@ struct rtl8xxxu_priv {
|
||||
DECLARE_BITMAP(cam_map, RTL8XXXU_MAX_SEC_CAM_NUM);
|
||||
};
|
||||
|
||||
+DECLARE_EWMA(rssi, 10, 16);
|
||||
+
|
||||
struct rtl8xxxu_sta_info {
|
||||
struct ieee80211_sta *sta;
|
||||
struct ieee80211_vif *vif;
|
||||
|
||||
u8 macid;
|
||||
+ struct ewma_rssi avg_rssi;
|
||||
+ u8 rssi_level;
|
||||
};
|
||||
|
||||
struct rtl8xxxu_vif {
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -4991,10 +4991,11 @@ rtl8xxxu_bss_info_changed(struct ieee802
|
||||
struct rtl8xxxu_vif *rtlvif = (struct rtl8xxxu_vif *)vif->drv_priv;
|
||||
struct rtl8xxxu_priv *priv = hw->priv;
|
||||
struct device *dev = &priv->udev->dev;
|
||||
+ struct rtl8xxxu_sta_info *sta_info;
|
||||
struct ieee80211_sta *sta;
|
||||
struct rtl8xxxu_ra_report *rarpt;
|
||||
+ u8 val8, macid;
|
||||
u32 val32;
|
||||
- u8 val8;
|
||||
|
||||
rarpt = &priv->ra_report;
|
||||
|
||||
@@ -5017,6 +5018,7 @@ rtl8xxxu_bss_info_changed(struct ieee802
|
||||
rcu_read_unlock();
|
||||
goto error;
|
||||
}
|
||||
+ macid = rtl8xxxu_get_macid(priv, sta);
|
||||
|
||||
if (sta->deflink.ht_cap.ht_supported)
|
||||
dev_info(dev, "%s: HT supported\n", __func__);
|
||||
@@ -5037,14 +5039,15 @@ rtl8xxxu_bss_info_changed(struct ieee802
|
||||
bw = RATE_INFO_BW_40;
|
||||
else
|
||||
bw = RATE_INFO_BW_20;
|
||||
+
|
||||
+ sta_info = (struct rtl8xxxu_sta_info *)sta->drv_priv;
|
||||
+ sta_info->rssi_level = RTL8XXXU_RATR_STA_INIT;
|
||||
rcu_read_unlock();
|
||||
|
||||
rtl8xxxu_update_ra_report(rarpt, highest_rate, sgi, bw);
|
||||
|
||||
- priv->rssi_level = RTL8XXXU_RATR_STA_INIT;
|
||||
-
|
||||
priv->fops->update_rate_mask(priv, ramask, 0, sgi,
|
||||
- bw == RATE_INFO_BW_40, 0);
|
||||
+ bw == RATE_INFO_BW_40, macid);
|
||||
|
||||
rtl8xxxu_write8(priv, REG_BCN_MAX_ERR, 0xff);
|
||||
|
||||
@@ -6317,6 +6320,76 @@ static void rtl8188e_c2hcmd_callback(str
|
||||
}
|
||||
}
|
||||
|
||||
+#define rtl8xxxu_iterate_vifs_atomic(priv, iterator, data) \
|
||||
+ ieee80211_iterate_active_interfaces_atomic((priv)->hw, \
|
||||
+ IEEE80211_IFACE_ITER_NORMAL, iterator, data)
|
||||
+
|
||||
+struct rtl8xxxu_rx_update_rssi_data {
|
||||
+ struct rtl8xxxu_priv *priv;
|
||||
+ struct ieee80211_hdr *hdr;
|
||||
+ struct ieee80211_rx_status *rx_status;
|
||||
+ u8 *bssid;
|
||||
+};
|
||||
+
|
||||
+static void rtl8xxxu_rx_update_rssi_iter(void *data, u8 *mac,
|
||||
+ struct ieee80211_vif *vif)
|
||||
+{
|
||||
+ struct rtl8xxxu_rx_update_rssi_data *iter_data = data;
|
||||
+ struct ieee80211_sta *sta;
|
||||
+ struct ieee80211_hdr *hdr = iter_data->hdr;
|
||||
+ struct rtl8xxxu_priv *priv = iter_data->priv;
|
||||
+ struct rtl8xxxu_sta_info *sta_info;
|
||||
+ struct ieee80211_rx_status *rx_status = iter_data->rx_status;
|
||||
+ u8 *bssid = iter_data->bssid;
|
||||
+
|
||||
+ if (!ether_addr_equal(vif->bss_conf.bssid, bssid))
|
||||
+ return;
|
||||
+
|
||||
+ if (!(ether_addr_equal(vif->addr, hdr->addr1) ||
|
||||
+ ieee80211_is_beacon(hdr->frame_control)))
|
||||
+ return;
|
||||
+
|
||||
+ sta = ieee80211_find_sta_by_ifaddr(priv->hw, hdr->addr2,
|
||||
+ vif->addr);
|
||||
+ if (!sta)
|
||||
+ return;
|
||||
+
|
||||
+ sta_info = (struct rtl8xxxu_sta_info *)sta->drv_priv;
|
||||
+ ewma_rssi_add(&sta_info->avg_rssi, -rx_status->signal);
|
||||
+}
|
||||
+
|
||||
+static inline u8 *get_hdr_bssid(struct ieee80211_hdr *hdr)
|
||||
+{
|
||||
+ __le16 fc = hdr->frame_control;
|
||||
+ u8 *bssid;
|
||||
+
|
||||
+ if (ieee80211_has_tods(fc))
|
||||
+ bssid = hdr->addr1;
|
||||
+ else if (ieee80211_has_fromds(fc))
|
||||
+ bssid = hdr->addr2;
|
||||
+ else
|
||||
+ bssid = hdr->addr3;
|
||||
+
|
||||
+ return bssid;
|
||||
+}
|
||||
+
|
||||
+static void rtl8xxxu_rx_update_rssi(struct rtl8xxxu_priv *priv,
|
||||
+ struct ieee80211_rx_status *rx_status,
|
||||
+ struct ieee80211_hdr *hdr)
|
||||
+{
|
||||
+ struct rtl8xxxu_rx_update_rssi_data data = {};
|
||||
+
|
||||
+ if (ieee80211_is_ctl(hdr->frame_control))
|
||||
+ return;
|
||||
+
|
||||
+ data.priv = priv;
|
||||
+ data.hdr = hdr;
|
||||
+ data.rx_status = rx_status;
|
||||
+ data.bssid = get_hdr_bssid(hdr);
|
||||
+
|
||||
+ rtl8xxxu_iterate_vifs_atomic(priv, rtl8xxxu_rx_update_rssi_iter, &data);
|
||||
+}
|
||||
+
|
||||
int rtl8xxxu_parse_rxdesc16(struct rtl8xxxu_priv *priv, struct sk_buff *skb)
|
||||
{
|
||||
struct ieee80211_hw *hw = priv->hw;
|
||||
@@ -6376,18 +6449,26 @@ int rtl8xxxu_parse_rxdesc16(struct rtl8x
|
||||
skb_queue_tail(&priv->c2hcmd_queue, skb);
|
||||
schedule_work(&priv->c2hcmd_work);
|
||||
} else {
|
||||
+ struct ieee80211_hdr *hdr;
|
||||
+
|
||||
phy_stats = (struct rtl8723au_phy_stats *)skb->data;
|
||||
|
||||
skb_pull(skb, drvinfo_sz + desc_shift);
|
||||
|
||||
skb_trim(skb, pkt_len);
|
||||
|
||||
- if (rx_desc->phy_stats)
|
||||
+ hdr = (struct ieee80211_hdr *)skb->data;
|
||||
+ if (rx_desc->phy_stats) {
|
||||
priv->fops->parse_phystats(
|
||||
priv, rx_status, phy_stats,
|
||||
rx_desc->rxmcs,
|
||||
- (struct ieee80211_hdr *)skb->data,
|
||||
+ hdr,
|
||||
rx_desc->crc32 || rx_desc->icverr);
|
||||
+ if (!rx_desc->crc32 && !rx_desc->icverr)
|
||||
+ rtl8xxxu_rx_update_rssi(priv,
|
||||
+ rx_status,
|
||||
+ hdr);
|
||||
+ }
|
||||
|
||||
rx_status->mactime = rx_desc->tsfl;
|
||||
rx_status->flag |= RX_FLAG_MACTIME_START;
|
||||
@@ -6484,10 +6565,15 @@ int rtl8xxxu_parse_rxdesc24(struct rtl8x
|
||||
} else {
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
||||
|
||||
- if (rx_desc->phy_stats)
|
||||
+ if (rx_desc->phy_stats) {
|
||||
priv->fops->parse_phystats(priv, rx_status, phy_stats,
|
||||
rx_desc->rxmcs, hdr,
|
||||
rx_desc->crc32 || rx_desc->icverr);
|
||||
+ if (!rx_desc->crc32 && !rx_desc->icverr)
|
||||
+ rtl8xxxu_rx_update_rssi(priv,
|
||||
+ rx_status,
|
||||
+ hdr);
|
||||
+ }
|
||||
|
||||
rx_status->mactime = rx_desc->tsfl;
|
||||
rx_status->flag |= RX_FLAG_MACTIME_START;
|
||||
@@ -7111,6 +7197,7 @@ static void rtl8xxxu_refresh_rate_mask(s
|
||||
int signal, struct ieee80211_sta *sta,
|
||||
bool force)
|
||||
{
|
||||
+ struct rtl8xxxu_sta_info *sta_info = (struct rtl8xxxu_sta_info *)sta->drv_priv;
|
||||
struct ieee80211_hw *hw = priv->hw;
|
||||
u16 wireless_mode;
|
||||
u8 rssi_level, ratr_idx;
|
||||
@@ -7119,7 +7206,7 @@ static void rtl8xxxu_refresh_rate_mask(s
|
||||
u8 go_up_gap = 5;
|
||||
u8 macid = rtl8xxxu_get_macid(priv, sta);
|
||||
|
||||
- rssi_level = priv->rssi_level;
|
||||
+ rssi_level = sta_info->rssi_level;
|
||||
snr = rtl8xxxu_signal_to_snr(signal);
|
||||
snr_thresh_high = RTL8XXXU_SNR_THRESH_HIGH;
|
||||
snr_thresh_low = RTL8XXXU_SNR_THRESH_LOW;
|
||||
@@ -7144,18 +7231,16 @@ static void rtl8xxxu_refresh_rate_mask(s
|
||||
else
|
||||
rssi_level = RTL8XXXU_RATR_STA_LOW;
|
||||
|
||||
- if (rssi_level != priv->rssi_level || force) {
|
||||
+ if (rssi_level != sta_info->rssi_level || force) {
|
||||
int sgi = 0;
|
||||
u32 rate_bitmap = 0;
|
||||
|
||||
- rcu_read_lock();
|
||||
rate_bitmap = (sta->deflink.supp_rates[0] & 0xfff) |
|
||||
(sta->deflink.ht_cap.mcs.rx_mask[0] << 12) |
|
||||
(sta->deflink.ht_cap.mcs.rx_mask[1] << 20);
|
||||
if (sta->deflink.ht_cap.cap &
|
||||
(IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_SGI_20))
|
||||
sgi = 1;
|
||||
- rcu_read_unlock();
|
||||
|
||||
wireless_mode = rtl8xxxu_wireless_mode(hw, sta);
|
||||
switch (wireless_mode) {
|
||||
@@ -7236,7 +7321,7 @@ static void rtl8xxxu_refresh_rate_mask(s
|
||||
break;
|
||||
}
|
||||
|
||||
- priv->rssi_level = rssi_level;
|
||||
+ sta_info->rssi_level = rssi_level;
|
||||
priv->fops->update_rate_mask(priv, rate_bitmap, ratr_idx, sgi, txbw_40mhz, macid);
|
||||
}
|
||||
}
|
||||
@@ -7329,40 +7414,60 @@ static void rtl8xxxu_track_cfo(struct rt
|
||||
rtl8xxxu_set_atc_status(priv, abs(cfo_average) >= CFO_TH_ATC);
|
||||
}
|
||||
|
||||
-static void rtl8xxxu_watchdog_callback(struct work_struct *work)
|
||||
+static void rtl8xxxu_ra_iter(void *data, struct ieee80211_sta *sta)
|
||||
{
|
||||
- struct ieee80211_vif *vif;
|
||||
- struct rtl8xxxu_priv *priv;
|
||||
- int i;
|
||||
+ struct rtl8xxxu_sta_info *sta_info = (struct rtl8xxxu_sta_info *)sta->drv_priv;
|
||||
+ struct rtl8xxxu_priv *priv = data;
|
||||
+ int signal = -ewma_rssi_read(&sta_info->avg_rssi);
|
||||
|
||||
- priv = container_of(work, struct rtl8xxxu_priv, ra_watchdog.work);
|
||||
- for (i = 0; i < ARRAY_SIZE(priv->vifs); i++) {
|
||||
- vif = priv->vifs[i];
|
||||
+ priv->fops->report_rssi(priv, rtl8xxxu_get_macid(priv, sta),
|
||||
+ rtl8xxxu_signal_to_snr(signal));
|
||||
+ rtl8xxxu_refresh_rate_mask(priv, signal, sta, false);
|
||||
+}
|
||||
+
|
||||
+struct rtl8xxxu_stas_entry {
|
||||
+ struct list_head list;
|
||||
+ struct ieee80211_sta *sta;
|
||||
+};
|
||||
|
||||
- if (!vif || vif->type != NL80211_IFTYPE_STATION)
|
||||
- continue;
|
||||
+struct rtl8xxxu_iter_stas_data {
|
||||
+ struct rtl8xxxu_priv *priv;
|
||||
+ struct list_head list;
|
||||
+};
|
||||
|
||||
- int signal;
|
||||
- struct ieee80211_sta *sta;
|
||||
+static void rtl8xxxu_collect_sta_iter(void *data, struct ieee80211_sta *sta)
|
||||
+{
|
||||
+ struct rtl8xxxu_iter_stas_data *iter_stas = data;
|
||||
+ struct rtl8xxxu_stas_entry *stas_entry;
|
||||
|
||||
- rcu_read_lock();
|
||||
- sta = ieee80211_find_sta(vif, vif->bss_conf.bssid);
|
||||
- if (!sta) {
|
||||
- struct device *dev = &priv->udev->dev;
|
||||
+ stas_entry = kmalloc(sizeof(*stas_entry), GFP_ATOMIC);
|
||||
+ if (!stas_entry)
|
||||
+ return;
|
||||
|
||||
- dev_dbg(dev, "%s: no sta found\n", __func__);
|
||||
- rcu_read_unlock();
|
||||
- continue;
|
||||
- }
|
||||
- rcu_read_unlock();
|
||||
+ stas_entry->sta = sta;
|
||||
+ list_add_tail(&stas_entry->list, &iter_stas->list);
|
||||
+}
|
||||
|
||||
- signal = ieee80211_ave_rssi(vif);
|
||||
+static void rtl8xxxu_watchdog_callback(struct work_struct *work)
|
||||
+{
|
||||
|
||||
- priv->fops->report_rssi(priv, rtl8xxxu_get_macid(priv, sta),
|
||||
- rtl8xxxu_signal_to_snr(signal));
|
||||
+ struct rtl8xxxu_iter_stas_data iter_data;
|
||||
+ struct rtl8xxxu_stas_entry *sta_entry, *tmp;
|
||||
+ struct rtl8xxxu_priv *priv;
|
||||
|
||||
- rtl8xxxu_refresh_rate_mask(priv, signal, sta, false);
|
||||
+ priv = container_of(work, struct rtl8xxxu_priv, ra_watchdog.work);
|
||||
+ iter_data.priv = priv;
|
||||
+ INIT_LIST_HEAD(&iter_data.list);
|
||||
+
|
||||
+ mutex_lock(&priv->sta_mutex);
|
||||
+ ieee80211_iterate_stations_atomic(priv->hw, rtl8xxxu_collect_sta_iter,
|
||||
+ &iter_data);
|
||||
+ list_for_each_entry_safe(sta_entry, tmp, &iter_data.list, list) {
|
||||
+ list_del_init(&sta_entry->list);
|
||||
+ rtl8xxxu_ra_iter(priv, sta_entry->sta);
|
||||
+ kfree(sta_entry);
|
||||
}
|
||||
+ mutex_unlock(&priv->sta_mutex);
|
||||
|
||||
if (priv->fops->set_crystal_cap)
|
||||
rtl8xxxu_track_cfo(priv);
|
||||
@@ -7504,10 +7609,15 @@ static int rtl8xxxu_sta_add(struct ieee8
|
||||
struct rtl8xxxu_vif *rtlvif = (struct rtl8xxxu_vif *)vif->drv_priv;
|
||||
struct rtl8xxxu_priv *priv = hw->priv;
|
||||
|
||||
+ mutex_lock(&priv->sta_mutex);
|
||||
+ ewma_rssi_init(&sta_info->avg_rssi);
|
||||
if (vif->type == NL80211_IFTYPE_AP) {
|
||||
+ sta_info->rssi_level = RTL8XXXU_RATR_STA_INIT;
|
||||
sta_info->macid = rtl8xxxu_acquire_macid(priv);
|
||||
- if (sta_info->macid >= RTL8XXXU_MAX_MAC_ID_NUM)
|
||||
+ if (sta_info->macid >= RTL8XXXU_MAX_MAC_ID_NUM) {
|
||||
+ mutex_unlock(&priv->sta_mutex);
|
||||
return -ENOSPC;
|
||||
+ }
|
||||
|
||||
rtl8xxxu_refresh_rate_mask(priv, 0, sta, true);
|
||||
priv->fops->report_connect(priv, sta_info->macid, H2C_MACID_ROLE_STA, true);
|
||||
@@ -7523,6 +7633,7 @@ static int rtl8xxxu_sta_add(struct ieee8
|
||||
break;
|
||||
}
|
||||
}
|
||||
+ mutex_unlock(&priv->sta_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -7534,8 +7645,10 @@ static int rtl8xxxu_sta_remove(struct ie
|
||||
struct rtl8xxxu_sta_info *sta_info = (struct rtl8xxxu_sta_info *)sta->drv_priv;
|
||||
struct rtl8xxxu_priv *priv = hw->priv;
|
||||
|
||||
+ mutex_lock(&priv->sta_mutex);
|
||||
if (vif->type == NL80211_IFTYPE_AP)
|
||||
rtl8xxxu_release_macid(priv, sta_info->macid);
|
||||
+ mutex_unlock(&priv->sta_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -7766,6 +7879,7 @@ static int rtl8xxxu_probe(struct usb_int
|
||||
mutex_init(&priv->usb_buf_mutex);
|
||||
mutex_init(&priv->syson_indirect_access_mutex);
|
||||
mutex_init(&priv->h2c_mutex);
|
||||
+ mutex_init(&priv->sta_mutex);
|
||||
INIT_LIST_HEAD(&priv->tx_urb_free_list);
|
||||
spin_lock_init(&priv->tx_urb_lock);
|
||||
INIT_LIST_HEAD(&priv->rx_urb_pending_list);
|
@ -0,0 +1,40 @@
|
||||
From 513c559ca9f05394da79fbf20a8f89eec5f53dce Mon Sep 17 00:00:00 2001
|
||||
From: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Date: Fri, 16 Feb 2024 11:39:23 +0800
|
||||
Subject: [PATCH] wifi: rtl8xxxu: check vif before using in rtl8xxxu_tx()
|
||||
|
||||
The 'vif' is from tx_info of SKB, and other codes check 'vif' before using,
|
||||
which raises smatch warnings:
|
||||
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c:5656 rtl8xxxu_tx()
|
||||
warn: variable dereferenced before check 'vif' (see line 5553)
|
||||
|
||||
Compile tested only.
|
||||
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20240216033923.34683-1-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -5550,7 +5550,7 @@ static void rtl8xxxu_tx(struct ieee80211
|
||||
struct rtl8xxxu_tx_urb *tx_urb;
|
||||
struct ieee80211_sta *sta = NULL;
|
||||
struct ieee80211_vif *vif = tx_info->control.vif;
|
||||
- struct rtl8xxxu_vif *rtlvif = (struct rtl8xxxu_vif *)vif->drv_priv;
|
||||
+ struct rtl8xxxu_vif *rtlvif = vif ? (struct rtl8xxxu_vif *)vif->drv_priv : NULL;
|
||||
struct device *dev = &priv->udev->dev;
|
||||
u32 queue, rts_rate;
|
||||
u16 pktlen = skb->len;
|
||||
@@ -5621,7 +5621,7 @@ static void rtl8xxxu_tx(struct ieee80211
|
||||
default:
|
||||
break;
|
||||
}
|
||||
- if (bmc && rtlvif->hw_key_idx != 0xff) {
|
||||
+ if (bmc && rtlvif && rtlvif->hw_key_idx != 0xff) {
|
||||
tx_desc->txdw1 |= cpu_to_le32(TXDESC_EN_DESC_ID);
|
||||
macid = rtlvif->hw_key_idx;
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
From a7e178259c5bc900da762b33d3a20b7ee1206f07 Mon Sep 17 00:00:00 2001
|
||||
From: Shiji Yang <yangshiji66@outlook.com>
|
||||
Date: Fri, 23 Feb 2024 21:34:32 +0800
|
||||
Subject: [PATCH] wifi: rtl8xxxu: fix mixed declarations in rtl8xxxu_set_aifs()
|
||||
|
||||
Moving struct ieee80211_sta *sta variable definition to the front
|
||||
of the code to fix the ISO C90 forbids mixed declarations and code
|
||||
warning.
|
||||
|
||||
Fixes: 43532c050f8e ("wifi: rtl8xxxu: support multiple interfaces in set_aifs()")
|
||||
Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/TYAP286MB03157A408E0D69F2F6FBD88ABC552@TYAP286MB0315.JPNP286.PROD.OUTLOOK.COM
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -4919,11 +4919,11 @@ static void rtl8xxxu_set_aifs(struct rtl
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(priv->vifs); i++) {
|
||||
+ struct ieee80211_sta *sta;
|
||||
+
|
||||
if (!priv->vifs[i])
|
||||
continue;
|
||||
|
||||
- struct ieee80211_sta *sta;
|
||||
-
|
||||
rcu_read_lock();
|
||||
sta = ieee80211_find_sta(priv->vifs[i], priv->vifs[i]->bss_conf.bssid);
|
||||
if (sta)
|
@ -28,11 +28,15 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||
|
||||
--- a/net/mac80211/sta_info.c
|
||||
+++ b/net/mac80211/sta_info.c
|
||||
@@ -561,6 +561,7 @@ __sta_info_alloc(struct ieee80211_sub_if
|
||||
@@ -561,6 +561,11 @@ __sta_info_alloc(struct ieee80211_sub_if
|
||||
INIT_WORK(&sta->drv_deliver_wk, sta_deliver_ps_frames);
|
||||
INIT_WORK(&sta->ampdu_mlme.work, ieee80211_ba_session_work);
|
||||
mutex_init(&sta->ampdu_mlme.mtx);
|
||||
+#if LINUX_VERSION_IS_LESS(6,2,0)
|
||||
+ sta->ampdu_mlme.dialog_token_allocator = prandom_u32_max(U8_MAX);
|
||||
+#else
|
||||
+ sta->ampdu_mlme.dialog_token_allocator = get_random_u32_below(U8_MAX);
|
||||
+#endif
|
||||
#ifdef CPTCFG_MAC80211_MESH
|
||||
if (ieee80211_vif_is_mesh(&sdata->vif)) {
|
||||
sta->mesh = kzalloc(sizeof(*sta->mesh), gfp);
|
||||
|
@ -0,0 +1,24 @@
|
||||
--- a/mac80211.c
|
||||
+++ b/mac80211.c
|
||||
@@ -4,7 +4,9 @@
|
||||
*/
|
||||
#include <linux/sched.h>
|
||||
#include <linux/of.h>
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(6,6,0)
|
||||
#include <net/page_pool.h>
|
||||
+#endif
|
||||
#include "mt76.h"
|
||||
|
||||
#define CHAN2G(_idx, _freq) { \
|
||||
--- a/mt76.h
|
||||
+++ b/mt76.h
|
||||
@@ -13,6 +13,9 @@
|
||||
#include <linux/leds.h>
|
||||
#include <linux/usb.h>
|
||||
#include <linux/average.h>
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(6,6,0)
|
||||
+#include <net/page_pool/helpers.h>
|
||||
+#endif
|
||||
#include <linux/soc/mediatek/mtk_wed.h>
|
||||
#include <net/mac80211.h>
|
||||
#include "util.h"
|
@ -0,0 +1,11 @@
|
||||
--- a/core/rtw_bt_mp.c
|
||||
+++ b/core/rtw_bt_mp.c
|
||||
@@ -169,7 +169,7 @@ mptbt_CheckBtRspStatus(
|
||||
PBT_EXT_C2H pExtC2h
|
||||
)
|
||||
{
|
||||
- BT_CTRL_STATUS retStatus=BT_OP_STATUS_SUCCESS;
|
||||
+ BT_CTRL_STATUS retStatus=BT_STATUS_SUCCESS;
|
||||
|
||||
switch(pExtC2h->statusCode) {
|
||||
case BT_OP_STATUS_SUCCESS:
|
@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=libevent2
|
||||
PKG_VERSION:=2.1.12
|
||||
PKG_RELEASE:=1
|
||||
PKG_RELEASE:=2
|
||||
|
||||
PKG_SOURCE:=libevent-$(PKG_VERSION)-stable.tar.gz
|
||||
PKG_SOURCE_URL:=https://github.com/libevent/libevent/releases/download/release-$(PKG_VERSION)-stable
|
||||
|
58
package/libs/libevent2/patches/001-relative-cmake.patch
Normal file
58
package/libs/libevent2/patches/001-relative-cmake.patch
Normal file
@ -0,0 +1,58 @@
|
||||
From 81c6b8823c1b58d7837e827bb1098aa5f9e5956b Mon Sep 17 00:00:00 2001
|
||||
From: "Jeremy W. Murphy" <jeremy.william.murphy@gmail.com>
|
||||
Date: Tue, 16 May 2023 05:07:36 +1000
|
||||
Subject: [PATCH] cmake: Only use relative paths for install DESTINATION option
|
||||
(#1405)
|
||||
|
||||
As described in #1404, the explicit use of CMAKE_INSTALL_PREFIX conflicts with using command-line --prefix.
|
||||
|
||||
This simply removes all explicit use of CMAKE_INSTALL_PREFIX.
|
||||
|
||||
Otherwise this path will be duplicated:
|
||||
|
||||
$ cmake -DCMAKE_BUILD_TYPE=debug -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_INSTALL_PREFIX=inst ..
|
||||
$ DESTDIR=inst ninja install
|
||||
...
|
||||
-- Installing: inst/src/le/libevent/.cmake-debug/inst/include/event2/util.h
|
||||
-- Installing: inst/src/le/libevent/.cmake-debug/inst/include/event2/ws.h
|
||||
...
|
||||
|
||||
Fixes: #1404
|
||||
Co-authored-by: Jeremy Murphy <jeremymu@blackmagicdesign.com>
|
||||
---
|
||||
CMakeLists.txt | 3 +--
|
||||
cmake/AddEventLibrary.cmake | 4 ++--
|
||||
2 files changed, 3 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/CMakeLists.txt
|
||||
+++ b/CMakeLists.txt
|
||||
@@ -1452,8 +1452,7 @@ endif()
|
||||
# Installation preparation.
|
||||
#
|
||||
|
||||
-set(EVENT_INSTALL_CMAKE_DIR
|
||||
- "${CMAKE_INSTALL_PREFIX}/lib/cmake/libevent")
|
||||
+set(EVENT_INSTALL_CMAKE_DIR "lib/cmake/libevent")
|
||||
|
||||
export(PACKAGE libevent)
|
||||
|
||||
--- a/cmake/AddEventLibrary.cmake
|
||||
+++ b/cmake/AddEventLibrary.cmake
|
||||
@@ -31,7 +31,7 @@ macro(generate_pkgconfig LIB_NAME)
|
||||
configure_file("lib${LIB_NAME}.pc.in" "lib${LIB_NAME}.pc" @ONLY)
|
||||
install(
|
||||
FILES "${CMAKE_CURRENT_BINARY_DIR}/lib${LIB_NAME}.pc"
|
||||
- DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig"
|
||||
+ DESTINATION "lib/pkgconfig"
|
||||
)
|
||||
endmacro()
|
||||
|
||||
@@ -150,7 +150,7 @@ macro(add_event_library LIB_NAME)
|
||||
set_target_properties(
|
||||
"${LIB_NAME}_shared" PROPERTIES
|
||||
OUTPUT_NAME "${LIB_NAME}-${EVENT_PACKAGE_RELEASE}.${CURRENT_MINUS_AGE}"
|
||||
- INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib"
|
||||
+ INSTALL_NAME_DIR "lib"
|
||||
LINK_FLAGS "-compatibility_version ${COMPATIBILITY_VERSION} -current_version ${COMPATIBILITY_VERSION}.${EVENT_ABI_LIBVERSION_REVISION}")
|
||||
else()
|
||||
math(EXPR CURRENT_MINUS_AGE "${EVENT_ABI_LIBVERSION_CURRENT}-${EVENT_ABI_LIBVERSION_AGE}")
|
@ -8,13 +8,13 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=dnsmasq
|
||||
PKG_UPSTREAM_VERSION:=2.89
|
||||
PKG_UPSTREAM_VERSION:=2.90
|
||||
PKG_VERSION:=$(subst test,~~test,$(subst rc,~rc,$(PKG_UPSTREAM_VERSION)))
|
||||
PKG_RELEASE:=8
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_UPSTREAM_VERSION).tar.xz
|
||||
PKG_SOURCE_URL:=https://thekelleys.org.uk/dnsmasq/
|
||||
PKG_HASH:=02bd230346cf0b9d5909f5e151df168b2707103785eb616b56685855adebb609
|
||||
PKG_HASH:=8e50309bd837bfec9649a812e066c09b6988b73d749b7d293c06c57d46a109e4
|
||||
|
||||
PKG_LICENSE:=GPL-2.0
|
||||
PKG_LICENSE_FILES:=COPYING
|
||||
|
@ -1,6 +1,23 @@
|
||||
diff --git a/src/dnsmasq.c b/src/dnsmasq.c
|
||||
index 30fb419..776351a 100644
|
||||
--- a/src/dnsmasq.c
|
||||
+++ b/src/dnsmasq.c
|
||||
@@ -2025,6 +2025,10 @@ static void check_dns_listeners(time_t now)
|
||||
daemon->pipe_to_parent = pipefd[1];
|
||||
}
|
||||
|
||||
+#ifdef HAVE_UBUS
|
||||
+ drop_ubus_listeners();
|
||||
+#endif
|
||||
+
|
||||
/* start with no upstream connections. */
|
||||
for (s = daemon->servers; s; s = s->next)
|
||||
s->tcpfd = -1;
|
||||
diff --git a/src/dnsmasq.h b/src/dnsmasq.h
|
||||
index e455c3f..c84ba48 100644
|
||||
--- a/src/dnsmasq.h
|
||||
+++ b/src/dnsmasq.h
|
||||
@@ -1631,14 +1631,26 @@ void emit_dbus_signal(int action, struct
|
||||
@@ -1673,14 +1673,26 @@ void emit_dbus_signal(int action, struct dhcp_lease *lease, char *hostname);
|
||||
|
||||
/* ubus.c */
|
||||
#ifdef HAVE_UBUS
|
||||
@ -11,6 +28,7 @@
|
||||
void set_ubus_listeners(void);
|
||||
void check_ubus_listeners(void);
|
||||
+void drop_ubus_listeners(void);
|
||||
+int ubus_dns_notify_has_subscribers(void);
|
||||
+struct blob_buf *ubus_dns_notify_prepare(void);
|
||||
+int ubus_dns_notify(const char *type, ubus_dns_notify_cb cb, void *priv);
|
||||
void ubus_event_bcast(const char *type, const char *mac, const char *ip, const char *name, const char *interface);
|
||||
@ -19,14 +37,28 @@
|
||||
void ubus_event_bcast_connmark_allowlist_resolved(u32 mark, const char *pattern, const char *ip, u32 ttl);
|
||||
# endif
|
||||
+#else
|
||||
+struct blob_buf;
|
||||
+static inline struct blob_buf *ubus_dns_notify_prepare(void)
|
||||
+static inline int ubus_dns_notify_has_subscribers(void)
|
||||
+{
|
||||
+ return NULL;
|
||||
+ return 0;
|
||||
+}
|
||||
#endif
|
||||
|
||||
/* ipset.c */
|
||||
diff --git a/src/forward.c b/src/forward.c
|
||||
index 32f37e4..3d28963 100644
|
||||
--- a/src/forward.c
|
||||
+++ b/src/forward.c
|
||||
@@ -803,7 +803,7 @@ static size_t process_reply(struct dns_header *header, time_t now, struct server
|
||||
cache_secure = 0;
|
||||
}
|
||||
|
||||
- if (daemon->doctors && do_doctor(header, n, daemon->namebuff))
|
||||
+ if ((daemon->doctors || ubus_dns_notify_has_subscribers()) && do_doctor(header, n, daemon->namebuff))
|
||||
cache_secure = 0;
|
||||
|
||||
/* check_for_bogus_wildcard() does it's own caching, so
|
||||
diff --git a/src/rfc1035.c b/src/rfc1035.c
|
||||
index 387d894..7bf7967 100644
|
||||
--- a/src/rfc1035.c
|
||||
+++ b/src/rfc1035.c
|
||||
@@ -13,8 +13,10 @@
|
||||
@ -41,7 +73,7 @@
|
||||
|
||||
int extract_name(struct dns_header *header, size_t plen, unsigned char **pp,
|
||||
char *name, int isExtract, int extrabytes)
|
||||
@@ -394,9 +396,64 @@ static int private_net6(struct in6_addr
|
||||
@@ -384,10 +386,65 @@ static int private_net6(struct in6_addr *a, int ban_localhost)
|
||||
((u32 *)a)[0] == htonl(0x20010db8); /* RFC 6303 4.6 */
|
||||
}
|
||||
|
||||
@ -100,14 +132,15 @@
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
static unsigned char *do_doctor(unsigned char *p, int count, struct dns_header *header, size_t qlen, int *doctored)
|
||||
int do_doctor(struct dns_header *header, size_t qlen, char *namebuff)
|
||||
{
|
||||
unsigned char *p;
|
||||
- int i, qtype, qclass, rdlen;
|
||||
+ int i, qtype, qclass, rdlen, ttl;
|
||||
|
||||
for (i = count; i != 0; i--)
|
||||
{
|
||||
@@ -405,7 +462,7 @@ static unsigned char *do_doctor(unsigned
|
||||
int done = 0;
|
||||
|
||||
if (!(p = skip_questions(header, qlen)))
|
||||
@@ -404,7 +461,7 @@ int do_doctor(struct dns_header *header, size_t qlen, char *namebuff)
|
||||
|
||||
GETSHORT(qtype, p);
|
||||
GETSHORT(qclass, p);
|
||||
@ -116,53 +149,36 @@
|
||||
GETSHORT(rdlen, p);
|
||||
|
||||
if (qclass == C_IN && qtype == T_A)
|
||||
@@ -416,6 +473,9 @@ static unsigned char *do_doctor(unsigned
|
||||
@@ -415,6 +472,9 @@ int do_doctor(struct dns_header *header, size_t qlen, char *namebuff)
|
||||
if (!CHECK_LEN(header, p, qlen, INADDRSZ))
|
||||
return 0;
|
||||
return done;
|
||||
|
||||
+ if (ubus_dns_doctor(daemon->namebuff, ttl, p, AF_INET))
|
||||
+ *doctored = 1;
|
||||
+ header->hb3 &= ~HB3_AA;
|
||||
+
|
||||
/* alignment */
|
||||
memcpy(&addr, p, INADDRSZ);
|
||||
memcpy(&addr.addr4, p, INADDRSZ);
|
||||
|
||||
@@ -433,13 +493,22 @@ static unsigned char *do_doctor(unsigned
|
||||
addr.s_addr &= ~doctor->mask.s_addr;
|
||||
addr.s_addr |= (doctor->out.s_addr & doctor->mask.s_addr);
|
||||
/* Since we munged the data, the server it came from is no longer authoritative */
|
||||
- header->hb3 &= ~HB3_AA;
|
||||
*doctored = 1;
|
||||
memcpy(p, &addr, INADDRSZ);
|
||||
@@ -444,6 +504,14 @@ int do_doctor(struct dns_header *header, size_t qlen, char *namebuff)
|
||||
break;
|
||||
}
|
||||
}
|
||||
-
|
||||
+ else if (qclass == C_IN && qtype == T_AAAA)
|
||||
+ {
|
||||
+ if (!CHECK_LEN(header, p, qlen, IN6ADDRSZ))
|
||||
+ return 0;
|
||||
+
|
||||
+ if (ubus_dns_doctor(daemon->namebuff, ttl, p, AF_INET6))
|
||||
+ *doctored = 1;
|
||||
+ header->hb3 &= ~HB3_AA;
|
||||
+ }
|
||||
+
|
||||
+ if (*doctored)
|
||||
+ header->hb3 &= ~HB3_AA;
|
||||
|
||||
if (!ADD_RDLEN(header, p, qlen, rdlen))
|
||||
return 0; /* bad packet */
|
||||
}
|
||||
@@ -570,7 +639,7 @@ int extract_addresses(struct dns_header
|
||||
cache_start_insert();
|
||||
|
||||
/* find_soa is needed for dns_doctor side effects, so don't call it lazily if there are any. */
|
||||
- if (daemon->doctors || option_bool(OPT_DNSSEC_VALID))
|
||||
+ if (daemon->doctors || option_bool(OPT_DNSSEC_VALID) || ubus_dns_notify_prepare())
|
||||
{
|
||||
searched_soa = 1;
|
||||
ttl = find_soa(header, qlen, doctored);
|
||||
return done; /* bad packet */
|
||||
diff --git a/src/ubus.c b/src/ubus.c
|
||||
index a5758e7..f2a75a8 100644
|
||||
--- a/src/ubus.c
|
||||
+++ b/src/ubus.c
|
||||
@@ -72,6 +72,13 @@ static struct ubus_object ubus_object =
|
||||
@@ -72,6 +72,13 @@ static struct ubus_object ubus_object = {
|
||||
.subscribe_cb = ubus_subscribe_cb,
|
||||
};
|
||||
|
||||
@ -176,7 +192,7 @@
|
||||
static void ubus_subscribe_cb(struct ubus_context *ctx, struct ubus_object *obj)
|
||||
{
|
||||
(void)ctx;
|
||||
@@ -105,13 +112,21 @@ static void ubus_disconnect_cb(struct ub
|
||||
@@ -105,13 +112,21 @@ static void ubus_disconnect_cb(struct ubus_context *ubus)
|
||||
char *ubus_init()
|
||||
{
|
||||
struct ubus_context *ubus = NULL;
|
||||
@ -216,15 +232,18 @@
|
||||
static int ubus_handle_metrics(struct ubus_context *ctx, struct ubus_object *obj,
|
||||
struct ubus_request_data *req, const char *method,
|
||||
struct blob_attr *msg)
|
||||
@@ -328,6 +354,50 @@ fail:
|
||||
@@ -328,6 +354,53 @@ fail:
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
+int ubus_dns_notify_has_subscribers(void)
|
||||
+{
|
||||
+ return (daemon->ubus && ubus_dns_object.has_subscribers);
|
||||
+}
|
||||
+
|
||||
+struct blob_buf *ubus_dns_notify_prepare(void)
|
||||
+{
|
||||
+ struct ubus_context *ubus = (struct ubus_context *)daemon->ubus;
|
||||
+
|
||||
+ if (!ubus || !ubus_dns_object.has_subscribers)
|
||||
+ if (!ubus_dns_notify_has_subscribers())
|
||||
+ return NULL;
|
||||
+
|
||||
+ blob_buf_init(&b, 0);
|
||||
@ -267,16 +286,3 @@
|
||||
void ubus_event_bcast(const char *type, const char *mac, const char *ip, const char *name, const char *interface)
|
||||
{
|
||||
struct ubus_context *ubus = (struct ubus_context *)daemon->ubus;
|
||||
--- a/src/dnsmasq.c
|
||||
+++ b/src/dnsmasq.c
|
||||
@@ -2003,6 +2003,10 @@ static void check_dns_listeners(time_t n
|
||||
daemon->pipe_to_parent = pipefd[1];
|
||||
}
|
||||
|
||||
+#ifdef HAVE_UBUS
|
||||
+ drop_ubus_listeners();
|
||||
+#endif
|
||||
+
|
||||
/* start with no upstream connections. */
|
||||
for (s = daemon->servers; s; s = s->next)
|
||||
s->tcpfd = -1;
|
||||
|
@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=lldpd
|
||||
PKG_VERSION:=1.0.17
|
||||
PKG_RELEASE:=2
|
||||
PKG_RELEASE:=3
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=https://github.com/lldpd/lldpd/releases/download/$(PKG_VERSION)/
|
||||
@ -31,7 +31,7 @@ define Package/lldpd
|
||||
CATEGORY:=Network
|
||||
SUBMENU:=Routing and Redirection
|
||||
TITLE:=Link Layer Discovery Protocol daemon
|
||||
URL:=https://vincentbernat.github.io/lldpd/
|
||||
URL:=https://lldpd.github.io/
|
||||
DEPENDS:=+libcap +libevent2 +USE_GLIBC:libbsd +LLDPD_WITH_JSON:libjson-c +LLDPD_WITH_SNMP:libnetsnmp
|
||||
USERID:=lldp=121:lldp=129
|
||||
MENU:=1
|
||||
|
@ -7,7 +7,9 @@ config lldpd config
|
||||
option agentxsocket /var/run/agentx.sock
|
||||
|
||||
option lldp_class 4
|
||||
option lldp_location "2:FR:6:Commercial Rd:3:Roseville:19:4"
|
||||
# lldp_policy only needed for lldp_class 2-3
|
||||
# option lldp_policy 'application streaming-video unknown'
|
||||
option lldp_location "address country EU"
|
||||
|
||||
# if empty, the distribution description is sent
|
||||
#option lldp_description "OpenWrt System"
|
||||
|
@ -1,5 +1,6 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
# Copyright (C) 2008-2015 OpenWrt.org
|
||||
# shellcheck disable=1091,2034,3037,3043,3045
|
||||
|
||||
START=90
|
||||
STOP=01
|
||||
@ -39,43 +40,44 @@ get_config_restart_hash() {
|
||||
config_load 'lldpd'
|
||||
|
||||
config_get v 'config' 'lldp_class'; append _string "$v" ","
|
||||
if [ "$CONFIG_LLDPD_WITH_SNMP" == "y" ]; then
|
||||
if [ "$CONFIG_LLDPD_WITH_SNMP" = "y" ]; then
|
||||
config_get v 'config' 'agentxsocket'; append _string "$v" ","
|
||||
fi
|
||||
config_get v 'config' 'cid_interface'; append _string "$v" ","
|
||||
config_get v 'config' 'filter'; append _string "$v" ","
|
||||
config_get_bool v 'config' 'readonly_mode'; append _string "$v" ","
|
||||
config_get_bool v 'config' 'lldp_no_version'; append _string "$v" ","
|
||||
if [ "$CONFIG_LLDPD_WITH_LLDPMED" == "y" ]; then
|
||||
if [ "$CONFIG_LLDPD_WITH_LLDPMED" = "y" ]; then
|
||||
config_get_bool v 'config' 'lldpmed_no_inventory'; append _string "$v" ","
|
||||
fi
|
||||
config_get_bool v 'config' 'enable_lldp' 1; append _string "$v" ","
|
||||
config_get_bool v 'config' 'force_lldp'; append _string "$v" ","
|
||||
if [ "$CONFIG_LLDPD_WITH_CDP" == "y" ]; then
|
||||
if [ "$CONFIG_LLDPD_WITH_CDP" = "y" ]; then
|
||||
config_get_bool v 'config' 'enable_cdp'; append _string "$v" ","
|
||||
config_get v 'config' 'cdp_version'; append _string "$v" ","
|
||||
config_get_bool v 'config' 'force_cdp'; append _string "$v" ","
|
||||
config_get_bool v 'config' 'force_cdpv2'; append _string "$v" ","
|
||||
fi
|
||||
if [ "$CONFIG_LLDPD_WITH_EDP" == "y" ]; then
|
||||
if [ "$CONFIG_LLDPD_WITH_EDP" = "y" ]; then
|
||||
config_get_bool v 'config' 'enable_edp'; append _string "$v" ","
|
||||
config_get_bool v 'config' 'force_edp'; append _string "$v" ","
|
||||
fi
|
||||
if [ "$CONFIG_LLDPD_WITH_FDP" == "y" ]; then
|
||||
if [ "$CONFIG_LLDPD_WITH_FDP" = "y" ]; then
|
||||
config_get_bool v 'config' 'enable_fdp'; append _string "$v" ","
|
||||
config_get_bool v 'config' 'force_fdp'; append _string "$v" ","
|
||||
fi
|
||||
if [ "$CONFIG_LLDPD_WITH_SONMP" == "y" ]; then
|
||||
if [ "$CONFIG_LLDPD_WITH_SONMP" = "y" ]; then
|
||||
config_get_bool v 'config' 'enable_sonmp'; append _string "$v" ","
|
||||
config_get_bool v 'config' 'force_sonmp'; append _string "$v" ","
|
||||
fi
|
||||
|
||||
_hash=`echo -n "${_string}" | md5sum | awk '{ print \$1 }'`
|
||||
_hash=$(echo -n "${_string}" | md5sum | awk '{ print $1 }')
|
||||
export -n "$var=$_hash"
|
||||
}
|
||||
|
||||
get_config_cid_ifaces() {
|
||||
local _ifacesCONFIG_LLDPD_WITH_FDP
|
||||
local _ifaces
|
||||
config_get _ifaces 'config' "$2"
|
||||
|
||||
local _iface _ifnames=""
|
||||
for _iface in $_ifaces; do
|
||||
@ -98,16 +100,8 @@ write_lldpd_conf()
|
||||
local lldp_hostname
|
||||
config_get lldp_hostname 'config' 'lldp_hostname' "$(cat /proc/sys/kernel/hostname)"
|
||||
|
||||
local ifaces
|
||||
config_get ifaces 'config' 'interface'
|
||||
|
||||
local iface ifnames=""
|
||||
for iface in $ifaces; do
|
||||
local ifname=""
|
||||
if network_get_device ifname "$iface" || [ -e "/sys/class/net/$iface" ]; then
|
||||
append ifnames "${ifname:-$iface}" ","
|
||||
fi
|
||||
done
|
||||
local ifnames
|
||||
get_config_cid_ifaces ifnames "interface"
|
||||
|
||||
local lldp_mgmt_ip
|
||||
config_get lldp_mgmt_ip 'config' 'lldp_mgmt_ip'
|
||||
@ -115,12 +109,22 @@ write_lldpd_conf()
|
||||
local lldp_syscapabilities
|
||||
config_get lldp_syscapabilities 'config' 'lldp_syscapabilities'
|
||||
|
||||
if [ "$CONFIG_LLDPD_WITH_LLDPMED" == "y" ]; then
|
||||
if [ "$CONFIG_LLDPD_WITH_LLDPMED" = "y" ]; then
|
||||
local lldpmed_fast_start
|
||||
config_get_bool lldpmed_fast_start 'config' 'lldpmed_fast_start' 0
|
||||
|
||||
local lldpmed_fast_start_tx_interval
|
||||
config_get lldpmed_fast_start_tx_interval 'config' 'lldpmed_fast_start_tx_interval' 0
|
||||
|
||||
local lldp_location
|
||||
config_get lldp_location 'config' 'lldp_location'
|
||||
|
||||
local lldp_class
|
||||
config_get lldp_class 'config' 'lldp_class'
|
||||
|
||||
local lldp_policy
|
||||
config_get lldp_policy 'config' 'lldp_policy'
|
||||
|
||||
fi
|
||||
|
||||
local lldp_agenttype
|
||||
@ -140,26 +144,39 @@ write_lldpd_conf()
|
||||
|
||||
# Clear out the config file first
|
||||
echo -n > "$LLDPD_CONF"
|
||||
[ -n "$ifnames" ] && echo "configure system interface pattern" "$ifnames" >> "$LLDPD_CONF"
|
||||
[ -n "$ifnames" ] && echo "configure system interface pattern $ifnames" >> "$LLDPD_CONF"
|
||||
[ -n "$lldp_description" ] && echo "configure system description" "\"$lldp_description\"" >> "$LLDPD_CONF"
|
||||
[ -n "$lldp_hostname" ] && echo "configure system hostname" "\"$lldp_hostname\"" >> "$LLDPD_CONF"
|
||||
[ -n "$lldp_mgmt_ip" ] && echo "configure system ip management pattern" "\"$lldp_mgmt_ip\"" >> "$LLDPD_CONF"
|
||||
[ -n "$lldp_syscapabilities" ] && echo "configure system capabilities enabled" "\"$lldp_syscapabilities\"" >> "$LLDPD_CONF"
|
||||
if [ "$CONFIG_LLDPD_WITH_LLDPMED" == "y" ] && [ $lldpmed_fast_start -gt 0 ]; then
|
||||
if [ $lldpmed_fast_start_tx_interval -gt 0 ]; then
|
||||
echo "configure med fast-start tx-interval" "\"$lldpmed_fast_start_tx_interval\"" >> "$LLDPD_CONF"
|
||||
[ -n "$lldp_syscapabilities" ] && echo "configure system capabilities enabled $lldp_syscapabilities" >> "$LLDPD_CONF"
|
||||
if [ "$CONFIG_LLDPD_WITH_LLDPMED" = "y" ] && [ "$lldpmed_fast_start" -gt 0 ]; then
|
||||
if [ "$lldpmed_fast_start_tx_interval" -gt 0 ]; then
|
||||
echo "configure med fast-start tx-interval $lldpmed_fast_start_tx_interval" >> "$LLDPD_CONF"
|
||||
else
|
||||
echo "configure med fast-start" "enable" >> "$LLDPD_CONF"
|
||||
echo "configure med fast-start enable" >> "$LLDPD_CONF"
|
||||
fi
|
||||
fi
|
||||
if [ "$CONFIG_LLDPD_WITH_LLDPMED" = "y" ]; then
|
||||
# other 'configure med xxx' statements go here
|
||||
|
||||
[ -n "$lldp_location" ] && echo "configure med location" "$lldp_location" >> "$LLDPD_CONF"
|
||||
|
||||
# Manual states that if Class (-M) is 2 or 3, at least one network policy must be defined
|
||||
case "$lldp_class" in
|
||||
2 | 3 ) [ -n "$lldp_policy" ] && echo "configure med policy $lldp_policy" >> "$LLDPD_CONF"
|
||||
;;
|
||||
esac
|
||||
|
||||
fi
|
||||
|
||||
[ -n "$lldp_agenttype" ] && echo "configure lldp agent-type" "\"$lldp_agenttype\"" >> "$LLDPD_CONF"
|
||||
[ -n "$lldp_portidsubtype" ] && echo "configure lldp portidsubtype" "\"$lldp_portidsubtype\"" >> "$LLDPD_CONF"
|
||||
[ -n "$lldp_platform" ] && echo "configure system platform" "\"$lldp_platform\"" >> "$LLDPD_CONF"
|
||||
[ $lldp_tx_interval -gt 0 ] && echo "configure lldp tx-interval" "$lldp_tx_interval" >> "$LLDPD_CONF"
|
||||
[ $lldp_tx_hold -gt 0 ] && echo "configure lldp tx-hold" "$lldp_tx_hold" >> "$LLDPD_CONF"
|
||||
[ -n "$lldp_tx_interval" ] && echo "configure lldp tx-interval $lldp_tx_interval" >> "$LLDPD_CONF"
|
||||
[ "$lldp_tx_hold" -gt 0 ] && echo "configure lldp tx-hold $lldp_tx_hold" >> "$LLDPD_CONF"
|
||||
|
||||
# Since lldpd's sysconfdir is /tmp, we'll symlink /etc/lldpd.d to /tmp/$LLDPD_CONFS_DIR
|
||||
[ -e $LLDPD_CONFS_DIR ] || ln -s /etc/lldpd.d $LLDPD_CONFS_DIR
|
||||
[ -e "$LLDPD_CONFS_DIR" ] || ln -s /etc/lldpd.d "$LLDPD_CONFS_DIR"
|
||||
}
|
||||
|
||||
start_service() {
|
||||
@ -177,7 +194,6 @@ start_service() {
|
||||
local enable_edp
|
||||
local force_edp
|
||||
local lldp_class
|
||||
local lldp_location
|
||||
local lldp_no_version
|
||||
local lldpmed_no_inventory
|
||||
local readonly_mode
|
||||
@ -187,32 +203,31 @@ start_service() {
|
||||
config_load 'lldpd'
|
||||
config_get_bool enable_lldp 'config' 'enable_lldp' 1
|
||||
config_get_bool force_lldp 'config' 'force_lldp' 0
|
||||
if [ "$CONFIG_LLDPD_WITH_CDP" == "y" ]; then
|
||||
if [ "$CONFIG_LLDPD_WITH_CDP" = "y" ]; then
|
||||
config_get_bool enable_cdp 'config' 'enable_cdp' 0
|
||||
config_get cdp_version 'config' 'cdp_version' 'cdpv1v2'
|
||||
config_get_bool force_cdp 'config' 'force_cdp' 0
|
||||
config_get_bool force_cdpv2 'config' 'force_cdpv2' 0
|
||||
fi
|
||||
if [ "$CONFIG_LLDPD_WITH_FDP" == "y" ]; then
|
||||
if [ "$CONFIG_LLDPD_WITH_FDP" = "y" ]; then
|
||||
config_get_bool enable_fdp 'config' 'enable_fdp' 0
|
||||
config_get_bool force_fdp 'config' 'force_fdp' 0
|
||||
fi
|
||||
if [ "$CONFIG_LLDPD_WITH_SONMP" == "y" ]; then
|
||||
if [ "$CONFIG_LLDPD_WITH_SONMP" = "y" ]; then
|
||||
config_get_bool enable_sonmp 'config' 'enable_sonmp' 0
|
||||
config_get_bool force_sonmp 'config' 'force_sonmp' 0
|
||||
fi
|
||||
if [ "$CONFIG_LLDPD_WITH_EDP" == "y" ]; then
|
||||
if [ "$CONFIG_LLDPD_WITH_EDP" = "y" ]; then
|
||||
config_get_bool enable_edp 'config' 'enable_edp' 0
|
||||
config_get_bool force_edp 'config' 'force_edp' 0
|
||||
fi
|
||||
config_get lldp_class 'config' 'lldp_class'
|
||||
config_get lldp_location 'config' 'lldp_location'
|
||||
config_get_bool lldp_no_version 'config' 'lldp_no_version' 0
|
||||
if [ "$CONFIG_LLDPD_WITH_LLDPMED" == "y" ]; then
|
||||
if [ "$CONFIG_LLDPD_WITH_LLDPMED" = "y" ]; then
|
||||
config_get_bool lldpmed_no_inventory 'config' 'lldpmed_no_inventory' 0
|
||||
fi
|
||||
config_get_bool readonly_mode 'config' 'readonly_mode' 0
|
||||
if [ "$CONFIG_LLDPD_WITH_SNMP" == "y" ]; then
|
||||
if [ "$CONFIG_LLDPD_WITH_SNMP" = "y" ]; then
|
||||
config_get agentxsocket 'config' 'agentxsocket'
|
||||
fi
|
||||
config_get filter 'config' 'filter' 15
|
||||
@ -227,8 +242,8 @@ start_service() {
|
||||
procd_set_param command ${LLDPDBIN}
|
||||
procd_append_param command -d
|
||||
|
||||
if [ $enable_lldp -gt 0 ]; then
|
||||
if [ $force_lldp -gt 0 ]; then
|
||||
if [ "$enable_lldp" -gt 0 ]; then
|
||||
if [ "$force_lldp" -gt 0 ]; then
|
||||
procd_append_param command '-l'
|
||||
fi
|
||||
else
|
||||
@ -236,20 +251,20 @@ start_service() {
|
||||
procd_append_param command '-ll'
|
||||
fi
|
||||
|
||||
if [ "$CONFIG_LLDPD_WITH_CDP" == "y" ] && [ $enable_cdp -gt 0 ]; then
|
||||
if [ $cdp_version == "cdpv2" ]; then
|
||||
if [ $force_cdp -gt 0 ]; then
|
||||
if [ "$CONFIG_LLDPD_WITH_CDP" = "y" ] && [ "$enable_cdp" -gt 0 ]; then
|
||||
if [ "$cdp_version" = "cdpv2" ]; then
|
||||
if [ "$force_cdp" -gt 0 ]; then
|
||||
# CDPv1 disabled, CDPv2 forced
|
||||
procd_append_param command '-ccccc'
|
||||
else
|
||||
# CDPv1 disabled, CDPv2 enabled
|
||||
procd_append_param command '-cccc'
|
||||
fi
|
||||
elif [ $cdp_version == "cdpv1v2" ]; then
|
||||
if [ $force_cdp -gt 0 ] && [ $force_cdpv2 -gt 0 ]; then
|
||||
elif [ "$cdp_version" = "cdpv1v2" ]; then
|
||||
if [ "$force_cdp" -gt 0 ] && [ "$force_cdpv2" -gt 0 ]; then
|
||||
# CDPv1 enabled, CDPv2 forced
|
||||
procd_append_param command '-ccc'
|
||||
elif [ $force_cdp -gt 0 ]; then
|
||||
elif [ "$force_cdp" -gt 0 ]; then
|
||||
# CDPv1 forced, CDPv2 enabled
|
||||
procd_append_param command '-cc'
|
||||
else
|
||||
@ -259,9 +274,9 @@ start_service() {
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$CONFIG_LLDPD_WITH_FDP" == "y" ] && [ $enable_fdp -gt 0 ]; then
|
||||
if [ $force_fdp -gt 0 ]; then
|
||||
# FDP enbled and forced
|
||||
if [ "$CONFIG_LLDPD_WITH_FDP" = "y" ] && [ "$enable_fdp" -gt 0 ]; then
|
||||
if [ "$force_fdp" -gt 0 ]; then
|
||||
# FDP enabled and forced
|
||||
procd_append_param command '-ff'
|
||||
else
|
||||
# FDP enabled
|
||||
@ -269,8 +284,8 @@ start_service() {
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$CONFIG_LLDPD_WITH_SONMP" == "y" ] && [ $enable_sonmp -gt 0 ]; then
|
||||
if [ $force_sonmp -gt 0 ]; then
|
||||
if [ "$CONFIG_LLDPD_WITH_SONMP" = "y" ] && [ "$enable_sonmp" -gt 0 ]; then
|
||||
if [ "$force_sonmp" -gt 0 ]; then
|
||||
# SONMP enabled and forced
|
||||
procd_append_param command '-ss'
|
||||
else
|
||||
@ -279,26 +294,27 @@ start_service() {
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$CONFIG_LLDPD_WITH_EDP" == "y" ] && [ $enable_edp -gt 0 ]; then
|
||||
if [ $force_edp -gt 0 ]; then
|
||||
# EDP enbled and forced
|
||||
if [ "$CONFIG_LLDPD_WITH_EDP" = "y" ] && [ "$enable_edp" -gt 0 ]; then
|
||||
if [ "$force_edp" -gt 0 ]; then
|
||||
# EDP enabled and forced
|
||||
procd_append_param command '-ee'
|
||||
else
|
||||
# EDP enbled
|
||||
# EDP enabled
|
||||
procd_append_param command '-e'
|
||||
fi
|
||||
fi
|
||||
|
||||
[ $readonly_mode -gt 0 ] && procd_append_param command '-r'
|
||||
[ $lldp_no_version -gt 0 ] && procd_append_param commanpackage/network/services/lldpd/Makefile package/network/services/lldpd/files/lldpd.initd '-k'
|
||||
[ "$CONFIG_LLDPD_WITH_LLDPMED" == "y" ] && [ $lldpmed_no_inventory -gt 0 ] && procd_append_param command '-i'
|
||||
[ "$readonly_mode" -gt 0 ] && procd_append_param command '-r'
|
||||
[ "$lldp_no_version" -gt 0 ] && procd_append_param command '-k'
|
||||
[ "$CONFIG_LLDPD_WITH_LLDPMED" = "y" ] && [ "$lldpmed_no_inventory" -gt 0 ] && procd_append_param command '-i'
|
||||
[ -n "$lldp_class" ] && procd_append_param command -M "$lldp_class"
|
||||
[ "$CONFIG_LLDPD_WITH_SNMP" == "y" ] && [ -n "$agentxsocket" ] && procd_append_param command -x -X "$agentxsocket"
|
||||
[ "$CONFIG_LLDPD_WITH_SNMP" = "y" ] && [ -n "$agentxsocket" ] && procd_append_param command -x -X "$agentxsocket"
|
||||
[ -n "$filter" ] && procd_append_param command -H "$filter"
|
||||
|
||||
# ChassisID interfaces
|
||||
local ifnames
|
||||
get_config_cid_ifaces ifnames
|
||||
get_config_cid_ifaces ifnames "cid_interface"
|
||||
|
||||
[ -n "$ifnames" ] && procd_append_param command -C "$ifnames"
|
||||
|
||||
# Overwrite default configuration locations processed by lldpcli at start
|
||||
@ -306,7 +322,7 @@ start_service() {
|
||||
|
||||
local restart_hash
|
||||
get_config_restart_hash restart_hash
|
||||
echo -n "$restart_hash" > $LLDPD_RESTART_HASH
|
||||
echo -n "$restart_hash" > "$LLDPD_RESTART_HASH"
|
||||
|
||||
# set auto respawn behavior
|
||||
procd_set_param respawn
|
||||
@ -324,7 +340,7 @@ reload_service() {
|
||||
local config_hash=""
|
||||
|
||||
get_config_restart_hash config_hash
|
||||
if [ -f ${LLDPD_RESTART_HASH} ]; then running_hash=`cat $LLDPD_RESTART_HASH`; fi
|
||||
[ -f ${LLDPD_RESTART_HASH} ] && running_hash=$(cat "$LLDPD_RESTART_HASH")
|
||||
|
||||
if [ "x$running_hash" != "x$config_hash" ]; then
|
||||
# Restart LLDPd
|
||||
@ -333,7 +349,7 @@ reload_service() {
|
||||
return 0
|
||||
fi
|
||||
|
||||
$LLDPCLI -u $LLDPSOCKET &> /dev/null <<-EOF
|
||||
$LLDPCLI -u "$LLDPSOCKET" 2>&1 /dev/null <<-EOF
|
||||
pause
|
||||
unconfigure lldp custom-tlv
|
||||
unconfigure system interface pattern
|
||||
@ -342,8 +358,8 @@ reload_service() {
|
||||
unconfigure system ip management pattern
|
||||
unconfigure system platform
|
||||
EOF
|
||||
if [ "$CONFIG_LLDPD_WITH_LLDPMED" == "y" ]; then
|
||||
$LLDPCLI -u $LLDPSOCKET &> /dev/null <<-EOF
|
||||
if [ "$CONFIG_LLDPD_WITH_LLDPMED" = "y" ]; then
|
||||
$LLDPCLI -u "$LLDPSOCKET" 2>&1 /dev/null <<-EOF
|
||||
unconfigure med fast-start
|
||||
EOF
|
||||
|
||||
@ -351,9 +367,9 @@ reload_service() {
|
||||
# Rewrite lldpd.conf
|
||||
# If something changed it should be included by the lldpcli call
|
||||
write_lldpd_conf
|
||||
$LLDPCLI -u $LLDPSOCKET -c $LLDPD_CONF -c $LLDPD_CONFS_DIR &> /dev/null
|
||||
$LLDPCLI -u "$LLDPSOCKET" -c "$LLDPD_CONF" -c "$LLDPD_CONFS_DIR" 2>&1 /dev/null
|
||||
# Broadcast update over the wire
|
||||
$LLDPCLI -u $LLDPSOCKET &> /dev/null <<-EOF
|
||||
$LLDPCLI -u "$LLDPSOCKET" 2>&1 /dev/null <<-EOF
|
||||
resume
|
||||
update
|
||||
EOF
|
||||
@ -361,6 +377,6 @@ reload_service() {
|
||||
}
|
||||
|
||||
stop_service() {
|
||||
rm -rf ${LLDPD_RUN} $LLDPSOCKET 2>/dev/null
|
||||
rm -rf ${LLDPD_RUN} "$LLDPSOCKET" 2> /dev/null
|
||||
}
|
||||
|
||||
|
@ -16,7 +16,7 @@ define Package/fitblk
|
||||
SECTION:=base
|
||||
CATEGORY:=Base system
|
||||
TITLE:=fitblk firmware release tool
|
||||
DEPENDS:=@LINUX_6_1
|
||||
DEPENDS:=@!LINUX_5_15
|
||||
endef
|
||||
|
||||
define Package/fitblk/description
|
||||
|
225
scripts/kernel_bump.sh
Executable file
225
scripts/kernel_bump.sh
Executable file
@ -0,0 +1,225 @@
|
||||
#!/bin/sh
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
#
|
||||
# Copyright (C) 2024 Olliver Schinagl <oliver@schinagl.nl>
|
||||
|
||||
set -eu
|
||||
if [ -n "${DEBUG_TRACE_SH:-}" ] && \
|
||||
[ "${DEBUG_TRACE_SH:-}" != "${DEBUG_TRACE_SH#*"$(basename "${0}")"*}" ] || \
|
||||
[ "${DEBUG_TRACE_SH:-}" = 'all' ]; then
|
||||
set -x
|
||||
fi
|
||||
|
||||
REQUIRED_COMMANDS='
|
||||
[
|
||||
basename
|
||||
command
|
||||
echo
|
||||
exit
|
||||
git
|
||||
printf
|
||||
set
|
||||
shift
|
||||
'
|
||||
|
||||
_msg()
|
||||
{
|
||||
_level="${1:?Missing argument to function}"
|
||||
shift
|
||||
|
||||
if [ "${#}" -le 0 ]; then
|
||||
echo "${_level}: No content for this message ..."
|
||||
return
|
||||
fi
|
||||
|
||||
echo "${_level}: ${*}"
|
||||
}
|
||||
|
||||
e_err()
|
||||
{
|
||||
_msg 'err' "${*}" >&2
|
||||
}
|
||||
|
||||
e_warn()
|
||||
{
|
||||
_msg 'warning' "${*}"
|
||||
}
|
||||
|
||||
e_notice()
|
||||
{
|
||||
_msg 'notice' "${*}"
|
||||
}
|
||||
|
||||
usage()
|
||||
{
|
||||
echo "Usage: ${0}"
|
||||
echo 'Helper script to bump the target kernel version, whilst keeping history.'
|
||||
echo " -p Optional Platform name (e.g. 'ath79' [PLATFORM_NAME]"
|
||||
echo " -s Source version of kernel (e.g. 'v6.1' [SOURCE_VERSION])"
|
||||
echo " -t Target version of kernel (e.g. 'v6.6' [TARGET_VERSION]')"
|
||||
echo
|
||||
echo 'All options can also be passed in environment variables (listed between [BRACKETS]).'
|
||||
echo 'Example: scripts/kernel_bump.sh -p realtek -s v6.1 -t v6.6'
|
||||
}
|
||||
|
||||
cleanup()
|
||||
{
|
||||
trap - EXIT HUP INT QUIT ABRT ALRM TERM
|
||||
|
||||
if [ -n "${initial_branch:-}" ] && \
|
||||
[ "$(git rev-parse --abbrev-ref HEAD)" != "${initial_branch:-}" ]; then
|
||||
git switch "${initial_branch}"
|
||||
fi
|
||||
}
|
||||
|
||||
init()
|
||||
{
|
||||
initial_branch="$(git rev-parse --abbrev-ref HEAD)"
|
||||
initial_commitish="$(git rev-parse HEAD)"
|
||||
|
||||
trap cleanup EXIT HUP INT QUIT ABRT ALRM TERM
|
||||
}
|
||||
|
||||
do_source_target()
|
||||
{
|
||||
_target_dir="${1:?Missing argument to function}"
|
||||
_op="${2:?Missing argument to function}"
|
||||
|
||||
}
|
||||
|
||||
bump_kernel()
|
||||
{
|
||||
platform_name="${platform_name##*'/'}"
|
||||
|
||||
if [ -z "${platform_name:-}" ]; then
|
||||
platform_name="${PWD##*'/'}"
|
||||
fi
|
||||
|
||||
if [ "${PWD##*'/'}" = "${platform_name}" ]; then
|
||||
_target_dir='./'
|
||||
else
|
||||
_target_dir="target/linux/${platform_name}"
|
||||
fi
|
||||
|
||||
if [ ! -d "${_target_dir}/image" ]; then
|
||||
e_err 'Cannot find target linux directory.'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
git switch --force-create '__openwrt_kernel_files_mover'
|
||||
|
||||
for _path in "${_target_dir}/"*; do
|
||||
if [ ! -s "${_path}" ] || \
|
||||
[ "${_path}" = "${_path%%"-${source_version}"}" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
_target_path="${_path%%"-${source_version}"}-${target_version}"
|
||||
if [ -s "${_target_path}" ]; then
|
||||
e_err "Target '${_target_path}' already exists!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
git mv \
|
||||
"${_path}" \
|
||||
"${_target_path}"
|
||||
done
|
||||
|
||||
find "${_target_dir}" -iname "config-${source_version}" | while read -r _config; do
|
||||
_path="${_config%%"/config-${source_version}"}"
|
||||
git mv "${_config}" "${_path}/config-${target_version}"
|
||||
done
|
||||
|
||||
git commit \
|
||||
--signoff \
|
||||
--message "kernel/${platform_name}: Create kernel files for v${target_version} (from v${source_version})" \
|
||||
--message 'This is an automatically generated commit.' \
|
||||
--message 'During a `git bisect` session, `git bisect --skip` is recommended.'
|
||||
|
||||
git checkout 'HEAD~' "${_target_dir}"
|
||||
git commit \
|
||||
--signoff \
|
||||
--message "kernel/${platform_name}: Restore kernel files for v${source_version}" \
|
||||
--message "$(printf "This is an automatically generated commit which aids following Kernel patch history,\nas git will see the move and copy as a rename thus defeating the purpose.\n\nSee: https://lists.openwrt.org/pipermail/openwrt-devel/2023-October/041673.html\nfor the original discussion.")"
|
||||
git switch "${initial_branch:?Unable to switch back to original branch. Quitting.}"
|
||||
GIT_EDITOR=true git merge --no-ff '__openwrt_kernel_files_mover'
|
||||
git branch --delete '__openwrt_kernel_files_mover'
|
||||
|
||||
echo "Original commitish was '${initial_commitish}'."
|
||||
echo 'Kernel bump complete. Remember to use `git log --follow`.'
|
||||
}
|
||||
|
||||
check_requirements()
|
||||
{
|
||||
for _cmd in ${REQUIRED_COMMANDS}; do
|
||||
if ! _test_result="$(command -V "${_cmd}")"; then
|
||||
_test_result_fail="${_test_result_fail:-}${_test_result}\n"
|
||||
else
|
||||
_test_result_pass="${_test_result_pass:-}${_test_result}\n"
|
||||
fi
|
||||
done
|
||||
|
||||
echo 'Available commands:'
|
||||
# As the results contain \n, we expect these to be interpreted.
|
||||
# shellcheck disable=SC2059
|
||||
printf "${_test_result_pass:-none\n}"
|
||||
echo
|
||||
echo 'Missing commands:'
|
||||
# shellcheck disable=SC2059
|
||||
printf "${_test_result_fail:-none\n}"
|
||||
echo
|
||||
|
||||
if [ -n "${_test_result_fail:-}" ]; then
|
||||
echo 'Command test failed, missing programs.'
|
||||
test_failed=1
|
||||
fi
|
||||
}
|
||||
|
||||
main()
|
||||
{
|
||||
while getopts 'hp:s:t:' _options; do
|
||||
case "${_options}" in
|
||||
'h')
|
||||
usage
|
||||
exit 0
|
||||
;;
|
||||
'p')
|
||||
platform_name="${OPTARG}"
|
||||
;;
|
||||
's')
|
||||
source_version="${OPTARG#v}"
|
||||
;;
|
||||
't')
|
||||
target_version="${OPTARG#v}"
|
||||
;;
|
||||
':')
|
||||
e_err "Option -${OPTARG} requires an argument."
|
||||
exit 1
|
||||
;;
|
||||
*)
|
||||
e_err "Invalid option: -${OPTARG}"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
shift "$((OPTIND - 1))"
|
||||
|
||||
platform_name="${platform_name:-${PLATFORM_NAME:-}}"
|
||||
source_version="${source_version:-${SOURCE_VERSION:-}}"
|
||||
target_version="${target_version:-${TARGET_VERSION:-}}"
|
||||
|
||||
if [ -z "${source_version:-}" ] || [ -z "${target_version:-}" ]; then
|
||||
e_err "Source (${source_version}) and target (${target_version}) versions need to be defined."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
check_requirements
|
||||
|
||||
init
|
||||
bump_kernel
|
||||
cleanup
|
||||
}
|
||||
|
||||
main "${@}"
|
||||
|
||||
exit 0
|
@ -8,8 +8,7 @@ SUBTARGETS:=generic mikrotik nand tiny
|
||||
|
||||
FEATURES:=ramdisk squashfs usbgadget
|
||||
|
||||
KERNEL_PATCHVER:=5.15
|
||||
KERNEL_TESTING_PATCHVER:=6.1
|
||||
KERNEL_PATCHVER:=6.1
|
||||
|
||||
include $(INCLUDE_DIR)/target.mk
|
||||
|
||||
|
@ -1,200 +0,0 @@
|
||||
CONFIG_AG71XX=y
|
||||
# CONFIG_AG71XX_DEBUG is not set
|
||||
CONFIG_AG71XX_DEBUG_FS=y
|
||||
CONFIG_AR8216_PHY=y
|
||||
CONFIG_AR8216_PHY_LEDS=y
|
||||
CONFIG_ARCH_32BIT_OFF_T=y
|
||||
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
|
||||
CONFIG_ARCH_KEEP_MEMBLOCK=y
|
||||
CONFIG_ARCH_MMAP_RND_BITS_MAX=15
|
||||
CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=15
|
||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||
CONFIG_AT803X_PHY=y
|
||||
CONFIG_ATH79=y
|
||||
CONFIG_ATH79_WDT=y
|
||||
CONFIG_BLK_MQ_PCI=y
|
||||
CONFIG_CEVT_R4K=y
|
||||
CONFIG_CLONE_BACKWARDS=y
|
||||
CONFIG_CMDLINE="rootfstype=squashfs,jffs2"
|
||||
CONFIG_CMDLINE_BOOL=y
|
||||
# CONFIG_CMDLINE_OVERRIDE is not set
|
||||
CONFIG_COMMON_CLK=y
|
||||
CONFIG_COMPAT_32BIT_TIME=y
|
||||
CONFIG_CPU_BIG_ENDIAN=y
|
||||
CONFIG_CPU_GENERIC_DUMP_TLB=y
|
||||
CONFIG_CPU_HAS_DIEI=y
|
||||
CONFIG_CPU_HAS_PREFETCH=y
|
||||
CONFIG_CPU_HAS_RIXI=y
|
||||
CONFIG_CPU_HAS_SYNC=y
|
||||
CONFIG_CPU_MIPS32=y
|
||||
CONFIG_CPU_MIPS32_R2=y
|
||||
CONFIG_CPU_MIPSR2=y
|
||||
CONFIG_CPU_NEEDS_NO_SMARTMIPS_OR_MICROMIPS=y
|
||||
CONFIG_CPU_R4K_CACHE_TLB=y
|
||||
CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
|
||||
CONFIG_CPU_SUPPORTS_HIGHMEM=y
|
||||
CONFIG_CPU_SUPPORTS_MSA=y
|
||||
CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y
|
||||
CONFIG_CRYPTO_LIB_POLY1305_RSIZE=2
|
||||
CONFIG_CRYPTO_RNG2=y
|
||||
CONFIG_CSRC_R4K=y
|
||||
CONFIG_DMA_NONCOHERENT=y
|
||||
CONFIG_DTC=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_ETHERNET_PACKET_MANGLE=y
|
||||
CONFIG_FIXED_PHY=y
|
||||
CONFIG_FWNODE_MDIO=y
|
||||
CONFIG_FW_LOADER_PAGED_BUF=y
|
||||
CONFIG_GENERIC_ATOMIC64=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_CMOS_UPDATE=y
|
||||
CONFIG_GENERIC_CPU_AUTOPROBE=y
|
||||
CONFIG_GENERIC_FIND_FIRST_BIT=y
|
||||
CONFIG_GENERIC_GETTIMEOFDAY=y
|
||||
CONFIG_GENERIC_IOMAP=y
|
||||
CONFIG_GENERIC_IRQ_CHIP=y
|
||||
CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y
|
||||
CONFIG_GENERIC_IRQ_SHOW=y
|
||||
CONFIG_GENERIC_LIB_ASHLDI3=y
|
||||
CONFIG_GENERIC_LIB_ASHRDI3=y
|
||||
CONFIG_GENERIC_LIB_CMPDI2=y
|
||||
CONFIG_GENERIC_LIB_LSHRDI3=y
|
||||
CONFIG_GENERIC_LIB_UCMPDI2=y
|
||||
CONFIG_GENERIC_PCI_IOMAP=y
|
||||
CONFIG_GENERIC_PHY=y
|
||||
CONFIG_GENERIC_PINCONF=y
|
||||
CONFIG_GENERIC_PINCTRL_GROUPS=y
|
||||
CONFIG_GENERIC_PINMUX_FUNCTIONS=y
|
||||
CONFIG_GENERIC_SCHED_CLOCK=y
|
||||
CONFIG_GENERIC_SMP_IDLE_THREAD=y
|
||||
CONFIG_GENERIC_TIME_VSYSCALL=y
|
||||
CONFIG_GPIOLIB_IRQCHIP=y
|
||||
CONFIG_GPIO_74X164=y
|
||||
CONFIG_GPIO_ATH79=y
|
||||
CONFIG_GPIO_CDEV=y
|
||||
CONFIG_GPIO_GENERIC=y
|
||||
# CONFIG_GPIO_LATCH is not set
|
||||
# CONFIG_GPIO_RB91X_KEY is not set
|
||||
CONFIG_HANDLE_DOMAIN_IRQ=y
|
||||
CONFIG_HARDWARE_WATCHPOINTS=y
|
||||
CONFIG_HAS_DMA=y
|
||||
CONFIG_HAS_IOMEM=y
|
||||
CONFIG_HAS_IOPORT_MAP=y
|
||||
CONFIG_HZ_PERIODIC=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_IRQCHIP=y
|
||||
CONFIG_IRQ_DOMAIN=y
|
||||
CONFIG_IRQ_FORCED_THREADING=y
|
||||
CONFIG_IRQ_MIPS_CPU=y
|
||||
CONFIG_IRQ_WORK=y
|
||||
CONFIG_LEDS_GPIO=y
|
||||
# CONFIG_LEDS_RESET is not set
|
||||
CONFIG_LIBFDT=y
|
||||
CONFIG_LOCK_DEBUGGING_SUPPORT=y
|
||||
CONFIG_MDIO_BITBANG=y
|
||||
CONFIG_MDIO_BUS=y
|
||||
CONFIG_MDIO_DEVICE=y
|
||||
CONFIG_MDIO_DEVRES=y
|
||||
CONFIG_MDIO_GPIO=y
|
||||
CONFIG_MEMFD_CREATE=y
|
||||
# CONFIG_MFD_RB4XX_CPLD is not set
|
||||
CONFIG_MFD_SYSCON=y
|
||||
CONFIG_MIGRATION=y
|
||||
CONFIG_MIPS=y
|
||||
CONFIG_MIPS_ASID_BITS=8
|
||||
CONFIG_MIPS_ASID_SHIFT=0
|
||||
CONFIG_MIPS_CLOCK_VSYSCALL=y
|
||||
# CONFIG_MIPS_CMDLINE_BUILTIN_EXTEND is not set
|
||||
# CONFIG_MIPS_CMDLINE_FROM_BOOTLOADER is not set
|
||||
CONFIG_MIPS_CMDLINE_FROM_DTB=y
|
||||
CONFIG_MIPS_EBPF_JIT=y
|
||||
CONFIG_MIPS_L1_CACHE_SHIFT=5
|
||||
CONFIG_MIPS_LD_CAN_LINK_VDSO=y
|
||||
# CONFIG_MIPS_NO_APPENDED_DTB is not set
|
||||
CONFIG_MIPS_RAW_APPENDED_DTB=y
|
||||
CONFIG_MIPS_SPRAM=y
|
||||
CONFIG_MODULES_USE_ELF_REL=y
|
||||
CONFIG_MTD_CFI_ADV_OPTIONS=y
|
||||
CONFIG_MTD_CFI_GEOMETRY=y
|
||||
# CONFIG_MTD_CFI_I2 is not set
|
||||
# CONFIG_MTD_CFI_INTELEXT is not set
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
# CONFIG_MTD_MAP_BANK_WIDTH_1 is not set
|
||||
# CONFIG_MTD_MAP_BANK_WIDTH_4 is not set
|
||||
CONFIG_MTD_PARSER_CYBERTAN=y
|
||||
# CONFIG_MTD_PARSER_TPLINK_SAFELOADER is not set
|
||||
CONFIG_MTD_PHYSMAP=y
|
||||
CONFIG_MTD_SPI_NOR=y
|
||||
CONFIG_MTD_SPLIT_ELF_FW=y
|
||||
CONFIG_MTD_SPLIT_LZMA_FW=y
|
||||
CONFIG_MTD_SPLIT_SEAMA_FW=y
|
||||
CONFIG_MTD_SPLIT_TPLINK_FW=y
|
||||
CONFIG_MTD_SPLIT_UIMAGE_FW=y
|
||||
CONFIG_MTD_SPLIT_WRGG_FW=y
|
||||
CONFIG_MTD_VIRT_CONCAT=y
|
||||
CONFIG_NEED_DMA_MAP_STATE=y
|
||||
CONFIG_NEED_PER_CPU_KM=y
|
||||
CONFIG_NET_SELFTESTS=y
|
||||
CONFIG_NO_GENERIC_PCI_IOPORT_MAP=y
|
||||
CONFIG_NVMEM=y
|
||||
CONFIG_OF=y
|
||||
CONFIG_OF_ADDRESS=y
|
||||
CONFIG_OF_EARLY_FLATTREE=y
|
||||
CONFIG_OF_FLATTREE=y
|
||||
CONFIG_OF_GPIO=y
|
||||
CONFIG_OF_IRQ=y
|
||||
CONFIG_OF_KOBJ=y
|
||||
CONFIG_OF_MDIO=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_AR71XX=y
|
||||
CONFIG_PCI_AR724X=y
|
||||
CONFIG_PCI_DISABLE_COMMON_QUIRKS=y
|
||||
CONFIG_PCI_DOMAINS=y
|
||||
CONFIG_PCI_DRIVERS_LEGACY=y
|
||||
CONFIG_PERF_USE_VMALLOC=y
|
||||
CONFIG_PGTABLE_LEVELS=2
|
||||
CONFIG_PHYLIB=y
|
||||
# CONFIG_PHY_AR7100_USB is not set
|
||||
# CONFIG_PHY_AR7200_USB is not set
|
||||
# CONFIG_PHY_ATH79_USB is not set
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_PTP_1588_CLOCK_OPTIONAL=y
|
||||
CONFIG_RATIONAL=y
|
||||
CONFIG_REGMAP=y
|
||||
CONFIG_REGMAP_MMIO=y
|
||||
CONFIG_REGULATOR=y
|
||||
CONFIG_RESET_ATH79=y
|
||||
CONFIG_RESET_CONTROLLER=y
|
||||
CONFIG_SERIAL_8250_NR_UARTS=1
|
||||
CONFIG_SERIAL_8250_RUNTIME_UARTS=1
|
||||
CONFIG_SERIAL_AR933X=y
|
||||
CONFIG_SERIAL_AR933X_CONSOLE=y
|
||||
CONFIG_SERIAL_AR933X_NR_UARTS=2
|
||||
CONFIG_SERIAL_MCTRL_GPIO=y
|
||||
CONFIG_SERIAL_OF_PLATFORM=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_AR934X=y
|
||||
CONFIG_SPI_ATH79=y
|
||||
CONFIG_SPI_BITBANG=y
|
||||
CONFIG_SPI_GPIO=y
|
||||
CONFIG_SPI_MASTER=y
|
||||
CONFIG_SPI_MEM=y
|
||||
# CONFIG_SPI_RB4XX is not set
|
||||
CONFIG_SRCU=y
|
||||
CONFIG_SWCONFIG=y
|
||||
CONFIG_SWCONFIG_LEDS=y
|
||||
CONFIG_SWPHY=y
|
||||
CONFIG_SYSCTL_EXCEPTION_TRACE=y
|
||||
CONFIG_SYS_HAS_CPU_MIPS32_R2=y
|
||||
CONFIG_SYS_HAS_EARLY_PRINTK=y
|
||||
CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
|
||||
CONFIG_SYS_SUPPORTS_ARBIT_HZ=y
|
||||
CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y
|
||||
CONFIG_SYS_SUPPORTS_MIPS16=y
|
||||
CONFIG_SYS_SUPPORTS_ZBOOT=y
|
||||
CONFIG_SYS_SUPPORTS_ZBOOT_UART_PROM=y
|
||||
CONFIG_TARGET_ISA_REV=2
|
||||
CONFIG_TICK_CPU_ACCOUNTING=y
|
||||
CONFIG_TINY_SRCU=y
|
||||
CONFIG_USB_SUPPORT=y
|
||||
CONFIG_USE_OF=y
|
@ -54,6 +54,7 @@ CONFIG_FWNODE_MDIO=y
|
||||
CONFIG_FW_LOADER_PAGED_BUF=y
|
||||
CONFIG_FW_LOADER_SYSFS=y
|
||||
CONFIG_GCC11_NO_ARRAY_BOUNDS=y
|
||||
CONFIG_GCC_ASM_GOTO_OUTPUT_WORKAROUND=y
|
||||
CONFIG_GENERIC_ATOMIC64=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_CMOS_UPDATE=y
|
||||
@ -142,6 +143,7 @@ CONFIG_NEED_PER_CPU_KM=y
|
||||
CONFIG_NET_SELFTESTS=y
|
||||
CONFIG_NO_GENERIC_PCI_IOPORT_MAP=y
|
||||
CONFIG_NVMEM=y
|
||||
CONFIG_NVMEM_LAYOUTS=y
|
||||
CONFIG_OF=y
|
||||
CONFIG_OF_ADDRESS=y
|
||||
CONFIG_OF_EARLY_FLATTREE=y
|
||||
@ -162,12 +164,14 @@ CONFIG_PCI_DRIVERS_LEGACY=y
|
||||
CONFIG_PERF_USE_VMALLOC=y
|
||||
CONFIG_PGTABLE_LEVELS=2
|
||||
CONFIG_PHYLIB=y
|
||||
CONFIG_PHYLIB_LEDS=y
|
||||
# CONFIG_PHY_AR7100_USB is not set
|
||||
# CONFIG_PHY_AR7200_USB is not set
|
||||
# CONFIG_PHY_ATH79_USB is not set
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_PREEMPT_NONE_BUILD=y
|
||||
CONFIG_PTP_1588_CLOCK_OPTIONAL=y
|
||||
CONFIG_QCOM_NET_PHYLIB=y
|
||||
CONFIG_RANDSTRUCT_NONE=y
|
||||
CONFIG_RATIONAL=y
|
||||
CONFIG_REGMAP=y
|
||||
|
40
target/linux/ath79/dts/qca9563_dlink_covr-c1200-a1.dts
Normal file
40
target/linux/ath79/dts/qca9563_dlink_covr-c1200-a1.dts
Normal file
@ -0,0 +1,40 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
|
||||
|
||||
#include "qca9563_dlink_covr.dtsi"
|
||||
|
||||
/ {
|
||||
compatible = "dlink,covr-c1200-a1", "qca,qca9563";
|
||||
model = "D-Link COVR-C1200 A1";
|
||||
|
||||
aliases {
|
||||
led-boot = &led_power_orange;
|
||||
led-failsafe = &led_power_red;
|
||||
led-running = &led_power_white;
|
||||
led-upgrade = &led_power_red;
|
||||
};
|
||||
|
||||
leds {
|
||||
compatible = "gpio-leds";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&jtag_disable_pins>;
|
||||
|
||||
led_power_red: power_red {
|
||||
function = LED_FUNCTION_POWER;
|
||||
color = <LED_COLOR_ID_RED>;
|
||||
gpios = <&gpio 6 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
led_power_white: power_white {
|
||||
function = LED_FUNCTION_POWER;
|
||||
color = <LED_COLOR_ID_WHITE>;
|
||||
gpios = <&gpio 7 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
led_power_orange: power_orange {
|
||||
function = LED_FUNCTION_POWER;
|
||||
color = <LED_COLOR_ID_ORANGE>;
|
||||
gpios = <&gpio 8 GPIO_ACTIVE_HIGH>;
|
||||
default-state = "on";
|
||||
};
|
||||
};
|
||||
};
|
@ -1,11 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
|
||||
|
||||
#include "qca956x.dtsi"
|
||||
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/input/input.h>
|
||||
#include <dt-bindings/leds/common.h>
|
||||
#include <dt-bindings/mtd/partitions/uimage.h>
|
||||
#include "qca9563_dlink_covr.dtsi"
|
||||
|
||||
/ {
|
||||
compatible = "dlink,covr-p2500-a1", "qca,qca9563";
|
||||
@ -18,22 +13,6 @@
|
||||
led-upgrade = &led_power_red;
|
||||
};
|
||||
|
||||
keys {
|
||||
compatible = "gpio-keys";
|
||||
|
||||
wps {
|
||||
label = "wps";
|
||||
linux,code = <KEY_WPS_BUTTON>;
|
||||
gpios = <&gpio 1 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
reset {
|
||||
label = "reset";
|
||||
linux,code = <KEY_RESTART>;
|
||||
gpios = <&gpio 2 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
};
|
||||
|
||||
leds {
|
||||
compatible = "gpio-leds";
|
||||
pinctrl-names = "default";
|
||||
@ -70,144 +49,4 @@
|
||||
linux,default-trigger = "phy1radio";
|
||||
};
|
||||
};
|
||||
|
||||
virtual_flash {
|
||||
compatible = "mtd-concat";
|
||||
|
||||
devices = <&fwconcat0 &fwconcat1>;
|
||||
|
||||
partitions {
|
||||
compatible = "fixed-partitions";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
partition@0 {
|
||||
compatible = "openwrt,uimage", "denx,uimage";
|
||||
openwrt,ih-magic = <0x68737173>;
|
||||
label = "firmware";
|
||||
reg = <0x0 0x0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&spi {
|
||||
status = "okay";
|
||||
|
||||
flash@0 {
|
||||
compatible = "jedec,spi-nor";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <50000000>;
|
||||
|
||||
partitions {
|
||||
compatible = "fixed-partitions";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
partition@0 {
|
||||
label = "u-boot";
|
||||
reg = <0x0 0x40000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@40000 {
|
||||
label = "u-boot-env";
|
||||
reg = <0x40000 0x10000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
fwconcat0: partition@50000 {
|
||||
label = "fwconcat0";
|
||||
reg = <0x50000 0xe30000>;
|
||||
};
|
||||
|
||||
partition@e80000 {
|
||||
label = "loader";
|
||||
reg = <0xe80000 0x10000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
fwconcat1: partition@e90000 {
|
||||
label = "fwconcat1";
|
||||
reg = <0xe90000 0x160000>;
|
||||
};
|
||||
|
||||
art: partition@ff0000 {
|
||||
label = "art";
|
||||
reg = <0xff0000 0x10000>;
|
||||
read-only;
|
||||
|
||||
nvmem-layout {
|
||||
compatible = "fixed-layout";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
calibration_ath9k: calibration@1000 {
|
||||
reg = <0x1000 0x440>;
|
||||
};
|
||||
|
||||
precalibration_ath10k: pre-calibration@5000 {
|
||||
reg = <0x5000 0x2f20>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&pcie {
|
||||
status = "okay";
|
||||
|
||||
wifi@0,0 {
|
||||
compatible = "qcom,ath10k";
|
||||
reg = <0 0 0 0 0>;
|
||||
|
||||
nvmem-cells = <&precalibration_ath10k>;
|
||||
nvmem-cell-names = "pre-calibration";
|
||||
};
|
||||
};
|
||||
|
||||
&gpio {
|
||||
phy-reset {
|
||||
gpio-hog;
|
||||
gpios = <11 GPIO_ACTIVE_LOW>;
|
||||
output-low;
|
||||
line-name = "phy-reset";
|
||||
};
|
||||
};
|
||||
|
||||
&mdio0 {
|
||||
status = "okay";
|
||||
|
||||
phy0: ethernet-phy@0 {
|
||||
reg = <0>;
|
||||
phy-mode = "sgmii";
|
||||
qca,mib-poll-interval = <500>;
|
||||
|
||||
qca,ar8327-initvals = <
|
||||
0x04 0x00080080 /* PORT0 PAD MODE CTRL */
|
||||
0x10 0x81000080 /* POWER_ON_STRAP */
|
||||
0x50 0xcc35cc35 /* LED_CTRL0 */
|
||||
0x54 0xcb37cb37 /* LED_CTRL1 */
|
||||
0x58 0x00000000 /* LED_CTRL2 */
|
||||
0x5c 0x00f3cf00 /* LED_CTRL3 */
|
||||
0x7c 0x0000007e /* PORT0_STATUS */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
ð0 {
|
||||
status = "okay";
|
||||
|
||||
pll-data = <0x03000101 0x00000101 0x00001919>;
|
||||
|
||||
phy-mode = "sgmii";
|
||||
phy-handle = <&phy0>;
|
||||
};
|
||||
|
||||
&wmac {
|
||||
status = "okay";
|
||||
|
||||
nvmem-cells = <&calibration_ath9k>;
|
||||
nvmem-cell-names = "calibration";
|
||||
};
|
||||
|
168
target/linux/ath79/dts/qca9563_dlink_covr.dtsi
Normal file
168
target/linux/ath79/dts/qca9563_dlink_covr.dtsi
Normal file
@ -0,0 +1,168 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
|
||||
|
||||
#include "qca956x.dtsi"
|
||||
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/input/input.h>
|
||||
#include <dt-bindings/leds/common.h>
|
||||
#include <dt-bindings/mtd/partitions/uimage.h>
|
||||
|
||||
/ {
|
||||
keys {
|
||||
compatible = "gpio-keys";
|
||||
|
||||
wps {
|
||||
label = "wps";
|
||||
linux,code = <KEY_WPS_BUTTON>;
|
||||
gpios = <&gpio 1 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
reset {
|
||||
label = "reset";
|
||||
linux,code = <KEY_RESTART>;
|
||||
gpios = <&gpio 2 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
};
|
||||
|
||||
virtual_flash {
|
||||
compatible = "mtd-concat";
|
||||
|
||||
devices = <&fwconcat0 &fwconcat1>;
|
||||
|
||||
partitions {
|
||||
compatible = "fixed-partitions";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
partition@0 {
|
||||
compatible = "openwrt,uimage", "denx,uimage";
|
||||
openwrt,ih-magic = <0x68737173>;
|
||||
label = "firmware";
|
||||
reg = <0x0 0x0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&spi {
|
||||
status = "okay";
|
||||
|
||||
flash@0 {
|
||||
compatible = "jedec,spi-nor";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <50000000>;
|
||||
|
||||
partitions {
|
||||
compatible = "fixed-partitions";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
partition@0 {
|
||||
label = "u-boot";
|
||||
reg = <0x0 0x40000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@40000 {
|
||||
label = "u-boot-env";
|
||||
reg = <0x40000 0x10000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
fwconcat0: partition@50000 {
|
||||
label = "fwconcat0";
|
||||
reg = <0x50000 0xe30000>;
|
||||
};
|
||||
|
||||
partition@e80000 {
|
||||
label = "loader";
|
||||
reg = <0xe80000 0x10000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
fwconcat1: partition@e90000 {
|
||||
label = "fwconcat1";
|
||||
reg = <0xe90000 0x160000>;
|
||||
};
|
||||
|
||||
art: partition@ff0000 {
|
||||
label = "art";
|
||||
reg = <0xff0000 0x10000>;
|
||||
read-only;
|
||||
|
||||
compatible = "nvmem-cells";
|
||||
|
||||
nvmem-layout {
|
||||
compatible = "fixed-layout";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
calibration_ath9k: calibration@1000 {
|
||||
reg = <0x1000 0x440>;
|
||||
};
|
||||
|
||||
precalibration_ath10k: pre-calibration@5000 {
|
||||
reg = <0x5000 0x2f20>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&pcie {
|
||||
status = "okay";
|
||||
|
||||
wifi0: wifi@0,0 {
|
||||
compatible = "qcom,ath10k";
|
||||
reg = <0 0 0 0 0>;
|
||||
|
||||
nvmem-cells = <&precalibration_ath10k>;
|
||||
nvmem-cell-names = "pre-calibration";
|
||||
};
|
||||
};
|
||||
|
||||
&gpio {
|
||||
phy-reset {
|
||||
gpio-hog;
|
||||
gpios = <11 GPIO_ACTIVE_LOW>;
|
||||
output-low;
|
||||
line-name = "phy-reset";
|
||||
};
|
||||
};
|
||||
|
||||
&mdio0 {
|
||||
status = "okay";
|
||||
|
||||
phy0: ethernet-phy@0 {
|
||||
reg = <0>;
|
||||
phy-mode = "sgmii";
|
||||
qca,mib-poll-interval = <500>;
|
||||
|
||||
qca,ar8327-initvals = <
|
||||
0x04 0x00080080 /* PORT0 PAD MODE CTRL */
|
||||
0x10 0x81000080 /* POWER_ON_STRAP */
|
||||
0x50 0xcc35cc35 /* LED_CTRL0 */
|
||||
0x54 0xcb37cb37 /* LED_CTRL1 */
|
||||
0x58 0x00000000 /* LED_CTRL2 */
|
||||
0x5c 0x00f3cf00 /* LED_CTRL3 */
|
||||
0x7c 0x0000007e /* PORT0_STATUS */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
ð0 {
|
||||
status = "okay";
|
||||
|
||||
pll-data = <0x03000101 0x00000101 0x00001919>;
|
||||
|
||||
phy-mode = "sgmii";
|
||||
phy-handle = <&phy0>;
|
||||
};
|
||||
|
||||
&wmac {
|
||||
status = "okay";
|
||||
|
||||
nvmem-cells = <&calibration_ath9k>;
|
||||
nvmem-cell-names = "calibration";
|
||||
};
|
@ -80,15 +80,11 @@ static void ag71xx_ethtool_set_msglevel(struct net_device *dev, u32 msg_level)
|
||||
ag->msg_enable = msg_level;
|
||||
}
|
||||
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,17,0)
|
||||
static void ag71xx_ethtool_get_ringparam(struct net_device *dev,
|
||||
struct ethtool_ringparam *er,
|
||||
struct kernel_ethtool_ringparam *kernel_ring,
|
||||
struct netlink_ext_ack *extack)
|
||||
#else
|
||||
static void ag71xx_ethtool_get_ringparam(struct net_device *dev,
|
||||
struct ethtool_ringparam *er)
|
||||
#endif
|
||||
static void
|
||||
ag71xx_ethtool_get_ringparam(struct net_device *dev,
|
||||
struct ethtool_ringparam *er,
|
||||
struct kernel_ethtool_ringparam *kernel_ring,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct ag71xx *ag = netdev_priv(dev);
|
||||
|
||||
@ -106,15 +102,11 @@ static void ag71xx_ethtool_get_ringparam(struct net_device *dev,
|
||||
er->tx_pending /= AG71XX_TX_RING_DS_PER_PKT;
|
||||
}
|
||||
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,17,0)
|
||||
static int ag71xx_ethtool_set_ringparam(struct net_device *dev,
|
||||
struct ethtool_ringparam *er,
|
||||
struct kernel_ethtool_ringparam *kernel_ring,
|
||||
struct netlink_ext_ack *extack)
|
||||
#else
|
||||
static int ag71xx_ethtool_set_ringparam(struct net_device *dev,
|
||||
struct ethtool_ringparam *er)
|
||||
#endif
|
||||
static int
|
||||
ag71xx_ethtool_set_ringparam(struct net_device *dev,
|
||||
struct ethtool_ringparam *er,
|
||||
struct kernel_ethtool_ringparam *kernel_ring,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct ag71xx *ag = netdev_priv(dev);
|
||||
unsigned tx_size;
|
||||
|
@ -1698,11 +1698,7 @@ static int ag71xx_probe(struct platform_device *pdev)
|
||||
break;
|
||||
}
|
||||
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,19,0)
|
||||
netif_napi_add_weight(dev, &ag->napi, ag71xx_poll, AG71XX_NAPI_WEIGHT);
|
||||
#else
|
||||
netif_napi_add(dev, &ag->napi, ag71xx_poll, AG71XX_NAPI_WEIGHT);
|
||||
#endif
|
||||
|
||||
ag71xx_dump_regs(ag);
|
||||
|
||||
|
@ -292,6 +292,10 @@ ath79_setup_interfaces()
|
||||
ucidef_add_switch "switch0" \
|
||||
"0@eth0" "2:wan" "3:lan" "4:lan"
|
||||
;;
|
||||
dlink,covr-c1200-a1)
|
||||
ucidef_add_switch "switch0" \
|
||||
"0@eth0" "1:wan" "2:lan"
|
||||
;;
|
||||
dlink,covr-p2500-a1)
|
||||
ucidef_add_switch "switch0" \
|
||||
"0@eth0" "1:lan" "2:lan" "3:wan" "4:plc"
|
||||
@ -644,6 +648,11 @@ ath79_setup_macs()
|
||||
devolo,magic-2-wifi)
|
||||
label_mac=$(macaddr_add "$(mtd_get_mac_binary art 0x1002)" 3)
|
||||
;;
|
||||
dlink,covr-c1200-a1)
|
||||
lan_mac=$(mtd_get_mac_ascii art "protest_lan_mac")
|
||||
wan_mac=$(mtd_get_mac_ascii art "protest_wan_mac")
|
||||
label_mac=$lan_mac
|
||||
;;
|
||||
dlink,covr-p2500-a1)
|
||||
lan_mac=$(mtd_get_mac_ascii art "protest_lan_mac")
|
||||
wan_mac=$(mtd_get_mac_ascii art "protest_lan_mac")
|
||||
|
@ -17,6 +17,7 @@ case "$board" in
|
||||
adtran,bsap1840)
|
||||
macaddr_add "$(mtd_get_mac_binary 'Board data' 2)" $(($PHYNBR * 8 + 1)) > /sys${DEVPATH}/macaddress
|
||||
;;
|
||||
dlink,covr-c1200-a1|\
|
||||
dlink,covr-p2500-a1)
|
||||
[ "$PHYNBR" -eq 0 ] && \
|
||||
mtd_get_mac_ascii art "protest_ath1_mac" > /sys${DEVPATH}/macaddress
|
||||
|
@ -1007,21 +1007,35 @@ define Device/devolo_magic-2-wifi
|
||||
endef
|
||||
TARGET_DEVICES += devolo_magic-2-wifi
|
||||
|
||||
define Device/dlink_covr-p2500-a1
|
||||
define Device/dlink_covr
|
||||
$(Device/loader-okli-uimage)
|
||||
SOC := qca9563
|
||||
DEVICE_VENDOR := D-Link
|
||||
DEVICE_MODEL := COVR-P2500
|
||||
DEVICE_VARIANT := A1
|
||||
DEVICE_PACKAGES := kmod-ath10k-ct ath10k-firmware-qca9888-ct
|
||||
LOADER_FLASH_OFFS := 0x050000
|
||||
LOADER_KERNEL_MAGIC := 0x68737173
|
||||
KERNEL := kernel-bin | append-dtb | lzma | uImage lzma -M 0x68737173
|
||||
IMAGE_SIZE := 14528k
|
||||
IMAGES += factory.bin recovery.bin
|
||||
IMAGE/recovery.bin := append-kernel | pad-to $$$$(BLOCKSIZE) | \
|
||||
append-rootfs | pad-rootfs | check-size | pad-to 14528k | \
|
||||
append-loader-okli-uimage $(1) | pad-to 15616k
|
||||
endef
|
||||
|
||||
define Device/dlink_covr-c1200-a1
|
||||
$(Device/dlink_covr)
|
||||
DEVICE_MODEL := COVR-C1200
|
||||
DEVICE_VARIANT := A1
|
||||
IMAGES += factory.bin
|
||||
IMAGE/factory.bin := $$(IMAGE/recovery.bin) | \
|
||||
dlink-sge-signature COVR-C1200 | dlink-sge-image COVR-C1200
|
||||
endef
|
||||
TARGET_DEVICES += dlink_covr-c1200-a1
|
||||
|
||||
define Device/dlink_covr-p2500-a1
|
||||
$(Device/dlink_covr)
|
||||
DEVICE_MODEL := COVR-P2500
|
||||
DEVICE_VARIANT := A1
|
||||
IMAGES += factory.bin recovery.bin
|
||||
IMAGE/factory.bin := $$(IMAGE/recovery.bin) | \
|
||||
dlink-sge-image COVR-P2500 | dlink-sge-signature COVR-P2500
|
||||
endef
|
||||
|
@ -1,27 +0,0 @@
|
||||
From c70282457c380db7deb57c81a6894debc8f88efa Mon Sep 17 00:00:00 2001
|
||||
From: Oskari Lemmela <oskari@lemmela.net>
|
||||
Date: Wed, 22 Dec 2021 07:59:58 +0200
|
||||
Subject: [PATCH] spi: ar934x: fix transfer and word delays
|
||||
|
||||
Add missing delay between transferred messages and words.
|
||||
|
||||
Signed-off-by: Oskari Lemmela <oskari@lemmela.net>
|
||||
Link: https://lore.kernel.org/r/20211222055958.1383233-3-oskari@lemmela.net
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
---
|
||||
drivers/spi/spi-ar934x.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/drivers/spi/spi-ar934x.c
|
||||
+++ b/drivers/spi/spi-ar934x.c
|
||||
@@ -137,8 +137,10 @@ static int ar934x_spi_transfer_one_messa
|
||||
reg >>= 8;
|
||||
}
|
||||
}
|
||||
+ spi_delay_exec(&t->word_delay, t);
|
||||
}
|
||||
m->actual_length += t->len;
|
||||
+ spi_transfer_delay_exec(t);
|
||||
}
|
||||
|
||||
msg_done:
|
@ -1,62 +0,0 @@
|
||||
From ebe33e5a98dcf14a9630845f3f10c193584ac054 Mon Sep 17 00:00:00 2001
|
||||
From: Oskari Lemmela <oskari@lemmela.net>
|
||||
Date: Wed, 22 Dec 2021 07:59:57 +0200
|
||||
Subject: [PATCH] spi: ar934x: fix transfer size
|
||||
|
||||
If bits_per_word is configured, transfer only word amount
|
||||
of data per iteration.
|
||||
|
||||
Signed-off-by: Oskari Lemmela <oskari@lemmela.net>
|
||||
Link: https://lore.kernel.org/r/20211222055958.1383233-2-oskari@lemmela.net
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
---
|
||||
drivers/spi/spi-ar934x.c | 16 +++++++++++-----
|
||||
1 file changed, 11 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/spi/spi-ar934x.c
|
||||
+++ b/drivers/spi/spi-ar934x.c
|
||||
@@ -82,7 +82,7 @@ static int ar934x_spi_transfer_one_messa
|
||||
struct spi_device *spi = m->spi;
|
||||
unsigned long trx_done, trx_cur;
|
||||
int stat = 0;
|
||||
- u8 term = 0;
|
||||
+ u8 bpw, term = 0;
|
||||
int div, i;
|
||||
u32 reg;
|
||||
const u8 *tx_buf;
|
||||
@@ -90,6 +90,11 @@ static int ar934x_spi_transfer_one_messa
|
||||
|
||||
m->actual_length = 0;
|
||||
list_for_each_entry(t, &m->transfers, transfer_list) {
|
||||
+ if (t->bits_per_word >= 8 && t->bits_per_word < 32)
|
||||
+ bpw = t->bits_per_word >> 3;
|
||||
+ else
|
||||
+ bpw = 4;
|
||||
+
|
||||
if (t->speed_hz)
|
||||
div = ar934x_spi_clk_div(sp, t->speed_hz);
|
||||
else
|
||||
@@ -105,10 +110,10 @@ static int ar934x_spi_transfer_one_messa
|
||||
iowrite32(reg, sp->base + AR934X_SPI_REG_CTRL);
|
||||
iowrite32(0, sp->base + AR934X_SPI_DATAOUT);
|
||||
|
||||
- for (trx_done = 0; trx_done < t->len; trx_done += 4) {
|
||||
+ for (trx_done = 0; trx_done < t->len; trx_done += bpw) {
|
||||
trx_cur = t->len - trx_done;
|
||||
- if (trx_cur > 4)
|
||||
- trx_cur = 4;
|
||||
+ if (trx_cur > bpw)
|
||||
+ trx_cur = bpw;
|
||||
else if (list_is_last(&t->transfer_list, &m->transfers))
|
||||
term = 1;
|
||||
|
||||
@@ -193,7 +198,8 @@ static int ar934x_spi_probe(struct platf
|
||||
ctlr->mode_bits = SPI_LSB_FIRST;
|
||||
ctlr->setup = ar934x_spi_setup;
|
||||
ctlr->transfer_one_message = ar934x_spi_transfer_one_message;
|
||||
- ctlr->bits_per_word_mask = SPI_BPW_MASK(8);
|
||||
+ ctlr->bits_per_word_mask = SPI_BPW_MASK(32) | SPI_BPW_MASK(24) |
|
||||
+ SPI_BPW_MASK(16) | SPI_BPW_MASK(8);
|
||||
ctlr->dev.of_node = pdev->dev.of_node;
|
||||
ctlr->num_chipselect = 3;
|
||||
|
@ -1,68 +0,0 @@
|
||||
From 8d8cdb4a6ccee5b62cc0dc64651c3946364514dc Mon Sep 17 00:00:00 2001
|
||||
From: Luiz Angelo Daros de Luca <luizluca@gmail.com>
|
||||
Date: Mon, 10 Feb 2020 16:11:27 -0300
|
||||
Subject: [PATCH] spi: ath79: Implement the spi_mem interface
|
||||
|
||||
Signed-off-by: Luiz Angelo Daros de Luca <luizluca@gmail.com>
|
||||
---
|
||||
drivers/spi/spi-ath79.c | 35 +++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 35 insertions(+)
|
||||
|
||||
--- a/drivers/spi/spi-ath79.c
|
||||
+++ b/drivers/spi/spi-ath79.c
|
||||
@@ -15,6 +15,7 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/spi/spi.h>
|
||||
+#include <linux/spi/spi-mem.h>
|
||||
#include <linux/spi/spi_bitbang.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/clk.h>
|
||||
@@ -133,6 +134,39 @@ static u32 ath79_spi_txrx_mode0(struct s
|
||||
return ath79_spi_rr(sp, AR71XX_SPI_REG_RDS);
|
||||
}
|
||||
|
||||
+static int ath79_exec_mem_op(struct spi_mem *mem,
|
||||
+ const struct spi_mem_op *op)
|
||||
+{
|
||||
+ struct ath79_spi *sp = ath79_spidev_to_sp(mem->spi);
|
||||
+
|
||||
+ /* Ensures that reading is performed on device connected
|
||||
+ to hardware cs0 */
|
||||
+ if (mem->spi->chip_select || mem->spi->cs_gpiod)
|
||||
+ return -ENOTSUPP;
|
||||
+
|
||||
+ /* Only use for fast-read op. */
|
||||
+ if (op->cmd.opcode != 0x0b || op->data.dir != SPI_MEM_DATA_IN ||
|
||||
+ op->addr.nbytes != 3 || op->dummy.nbytes != 1)
|
||||
+ return -ENOTSUPP;
|
||||
+
|
||||
+ /* disable GPIO mode */
|
||||
+ ath79_spi_wr(sp, AR71XX_SPI_REG_FS, 0);
|
||||
+
|
||||
+ memcpy_fromio(op->data.buf.in, sp->base + op->addr.val, op->data.nbytes);
|
||||
+
|
||||
+ /* enable GPIO mode */
|
||||
+ ath79_spi_wr(sp, AR71XX_SPI_REG_FS, AR71XX_SPI_FS_GPIO);
|
||||
+
|
||||
+ /* restore IOC register */
|
||||
+ ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, sp->ioc_base);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct spi_controller_mem_ops ath79_mem_ops = {
|
||||
+ .exec_op = ath79_exec_mem_op,
|
||||
+};
|
||||
+
|
||||
static int ath79_spi_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct spi_master *master;
|
||||
@@ -165,6 +199,7 @@ static int ath79_spi_probe(struct platfo
|
||||
ret = PTR_ERR(sp->base);
|
||||
goto err_put_master;
|
||||
}
|
||||
+ master->mem_ops = &ath79_mem_ops;
|
||||
|
||||
sp->clk = devm_clk_get(&pdev->dev, "ahb");
|
||||
if (IS_ERR(sp->clk)) {
|
@ -1,48 +0,0 @@
|
||||
From: Wenli Looi <wlooi@ucalgary.ca>
|
||||
Date: Sun, 20 Jun 2021 23:32:28 -0700
|
||||
Subject: [PATCH] ath79: add support for booting QCN550x
|
||||
|
||||
Based on wikidevi, QCN550x is a "Dragonfly" like QCA9561 and QCA9563.
|
||||
Treating it as QCA956x seems to work.
|
||||
Tested on Netgear EX7300v2 which boots successfully with
|
||||
the same CPU clock as the stock firmware.
|
||||
|
||||
Link: https://wikidevi.wi-cat.ru/Qualcomm#bgn
|
||||
Link: https://wikidevi.wi-cat.ru/Qualcomm_Atheros#.28a.29bgn_2
|
||||
Signed-off-by: Wenli Looi <wlooi@ucalgary.ca>
|
||||
|
||||
--- a/arch/mips/ath79/early_printk.c
|
||||
+++ b/arch/mips/ath79/early_printk.c
|
||||
@@ -121,6 +121,7 @@ static void prom_putchar_init(void)
|
||||
case REV_ID_MAJOR_QCA9558:
|
||||
case REV_ID_MAJOR_TP9343:
|
||||
case REV_ID_MAJOR_QCA956X:
|
||||
+ case REV_ID_MAJOR_QCN550X:
|
||||
_prom_putchar = prom_putchar_ar71xx;
|
||||
break;
|
||||
|
||||
--- a/arch/mips/ath79/setup.c
|
||||
+++ b/arch/mips/ath79/setup.c
|
||||
@@ -168,6 +168,12 @@ static void __init ath79_detect_sys_type
|
||||
rev = id & QCA956X_REV_ID_REVISION_MASK;
|
||||
break;
|
||||
|
||||
+ case REV_ID_MAJOR_QCN550X:
|
||||
+ ath79_soc = ATH79_SOC_QCA956X;
|
||||
+ chip = "550X";
|
||||
+ rev = id & QCA956X_REV_ID_REVISION_MASK;
|
||||
+ break;
|
||||
+
|
||||
case REV_ID_MAJOR_TP9343:
|
||||
ath79_soc = ATH79_SOC_TP9343;
|
||||
chip = "9343";
|
||||
--- a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h
|
||||
+++ b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h
|
||||
@@ -862,6 +862,7 @@
|
||||
#define REV_ID_MAJOR_QCA9558 0x1130
|
||||
#define REV_ID_MAJOR_TP9343 0x0150
|
||||
#define REV_ID_MAJOR_QCA956X 0x1150
|
||||
+#define REV_ID_MAJOR_QCN550X 0x2170
|
||||
|
||||
#define AR71XX_REV_ID_MINOR_MASK 0x3
|
||||
#define AR71XX_REV_ID_MINOR_AR7130 0x0
|
@ -1,33 +0,0 @@
|
||||
From 661edfc3dab943a67c8821353b63cc23057f7ce9 Mon Sep 17 00:00:00 2001
|
||||
From: David Bauer <mail@david-bauer.net>
|
||||
Date: Tue, 9 Jan 2024 20:48:46 +0100
|
||||
Subject: [PATCH] reset: ath79: read back reset register
|
||||
|
||||
Read back the reset register in order to flush the cache. This fixes
|
||||
spurious reboot hangs on TP-Link TL-WDR3600 and TL-WDR4300 with Zentel
|
||||
DRAM chips.
|
||||
|
||||
This issue was fixed in the past, but switching to the reset-driver
|
||||
specific implementation removed the old fix.
|
||||
|
||||
Link: https://github.com/freifunk-gluon/gluon/issues/2904
|
||||
Link: https://github.com/openwrt/openwrt/issues/13043
|
||||
Link: https://dev.archive.openwrt.org/ticket/17839
|
||||
Link: f8a7bfe1cb2c ("MIPS: ath79: fix system restart")
|
||||
|
||||
Signed-off-by: David Bauer <mail@david-bauer.net>
|
||||
---
|
||||
drivers/reset/reset-ath79.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/drivers/reset/reset-ath79.c
|
||||
+++ b/drivers/reset/reset-ath79.c
|
||||
@@ -37,6 +37,8 @@ static int ath79_reset_update(struct res
|
||||
else
|
||||
val &= ~BIT(id);
|
||||
writel(val, ath79_reset->base);
|
||||
+ /* Flush cache */
|
||||
+ readl(ath79_reset->base);
|
||||
spin_unlock_irqrestore(&ath79_reset->lock, flags);
|
||||
|
||||
return 0;
|
@ -1,168 +0,0 @@
|
||||
From f3eacff2310a60348a755c50a8da6fc251fc8587 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Tue, 6 Mar 2018 09:55:13 +0100
|
||||
Subject: [PATCH 07/33] irqchip/irq-ath79-intc: add irq cascade driver for
|
||||
QCA9556 SoCs
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/irqchip/Makefile | 1 +
|
||||
drivers/irqchip/irq-ath79-intc.c | 142 +++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 143 insertions(+)
|
||||
create mode 100644 drivers/irqchip/irq-ath79-intc.c
|
||||
|
||||
--- a/drivers/irqchip/Makefile
|
||||
+++ b/drivers/irqchip/Makefile
|
||||
@@ -4,6 +4,7 @@ obj-$(CONFIG_IRQCHIP) += irqchip.o
|
||||
obj-$(CONFIG_AL_FIC) += irq-al-fic.o
|
||||
obj-$(CONFIG_ALPINE_MSI) += irq-alpine-msi.o
|
||||
obj-$(CONFIG_ATH79) += irq-ath79-cpu.o
|
||||
+obj-$(CONFIG_ATH79) += irq-ath79-intc.o
|
||||
obj-$(CONFIG_ATH79) += irq-ath79-misc.o
|
||||
obj-$(CONFIG_ARCH_BCM2835) += irq-bcm2835.o
|
||||
obj-$(CONFIG_ARCH_BCM2835) += irq-bcm2836.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/irqchip/irq-ath79-intc.c
|
||||
@@ -0,0 +1,142 @@
|
||||
+/*
|
||||
+ * Atheros AR71xx/AR724x/AR913x specific interrupt handling
|
||||
+ *
|
||||
+ * Copyright (C) 2018 John Crispin <john@phrozen.org>
|
||||
+ *
|
||||
+ * 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 published
|
||||
+ * by the Free Software Foundation.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/interrupt.h>
|
||||
+#include <linux/irqchip.h>
|
||||
+#include <linux/of.h>
|
||||
+#include <linux/of_irq.h>
|
||||
+#include <linux/irqdomain.h>
|
||||
+
|
||||
+#include <asm/irq_cpu.h>
|
||||
+#include <asm/mach-ath79/ath79.h>
|
||||
+#include <asm/mach-ath79/ar71xx_regs.h>
|
||||
+
|
||||
+#define ATH79_MAX_INTC_CASCADE 3
|
||||
+
|
||||
+struct ath79_intc {
|
||||
+ struct irq_chip chip;
|
||||
+ u32 irq;
|
||||
+ u32 pending_mask;
|
||||
+ u32 int_status;
|
||||
+ u32 irq_mask[ATH79_MAX_INTC_CASCADE];
|
||||
+ u32 irq_wb_chan[ATH79_MAX_INTC_CASCADE];
|
||||
+};
|
||||
+
|
||||
+static void ath79_intc_irq_handler(struct irq_desc *desc)
|
||||
+{
|
||||
+ struct irq_domain *domain = irq_desc_get_handler_data(desc);
|
||||
+ struct ath79_intc *intc = domain->host_data;
|
||||
+ u32 pending;
|
||||
+
|
||||
+ pending = ath79_reset_rr(intc->int_status);
|
||||
+ pending &= intc->pending_mask;
|
||||
+
|
||||
+ if (pending) {
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < domain->hwirq_max; i++)
|
||||
+ if (pending & intc->irq_mask[i]) {
|
||||
+ if (intc->irq_wb_chan[i] != 0xffffffff)
|
||||
+ ath79_ddr_wb_flush(intc->irq_wb_chan[i]);
|
||||
+ generic_handle_irq(irq_find_mapping(domain, i));
|
||||
+ }
|
||||
+ } else {
|
||||
+ spurious_interrupt();
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void ath79_intc_irq_enable(struct irq_data *d)
|
||||
+{
|
||||
+ struct ath79_intc *intc = d->domain->host_data;
|
||||
+ enable_irq(intc->irq);
|
||||
+}
|
||||
+
|
||||
+static void ath79_intc_irq_disable(struct irq_data *d)
|
||||
+{
|
||||
+ struct ath79_intc *intc = d->domain->host_data;
|
||||
+ disable_irq(intc->irq);
|
||||
+}
|
||||
+
|
||||
+static int ath79_intc_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hw)
|
||||
+{
|
||||
+ struct ath79_intc *intc = d->host_data;
|
||||
+
|
||||
+ irq_set_chip_and_handler(irq, &intc->chip, handle_level_irq);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct irq_domain_ops ath79_irq_domain_ops = {
|
||||
+ .xlate = irq_domain_xlate_onecell,
|
||||
+ .map = ath79_intc_map,
|
||||
+};
|
||||
+
|
||||
+static int __init ath79_intc_of_init(
|
||||
+ struct device_node *node, struct device_node *parent)
|
||||
+{
|
||||
+ struct irq_domain *domain;
|
||||
+ struct ath79_intc *intc;
|
||||
+ int cnt, cntwb, i, err;
|
||||
+
|
||||
+ cnt = of_property_count_u32_elems(node, "qca,pending-bits");
|
||||
+ if (cnt > ATH79_MAX_INTC_CASCADE)
|
||||
+ panic("Too many INTC pending bits\n");
|
||||
+
|
||||
+ intc = kzalloc(sizeof(*intc), GFP_KERNEL);
|
||||
+ if (!intc)
|
||||
+ panic("Failed to allocate INTC memory\n");
|
||||
+ intc->chip = dummy_irq_chip;
|
||||
+ intc->chip.name = "INTC";
|
||||
+ intc->chip.irq_disable = ath79_intc_irq_disable;
|
||||
+ intc->chip.irq_enable = ath79_intc_irq_enable;
|
||||
+
|
||||
+ if (of_property_read_u32(node, "qca,int-status-addr", &intc->int_status) < 0) {
|
||||
+ panic("Missing address of interrupt status register\n");
|
||||
+ }
|
||||
+
|
||||
+ of_property_read_u32_array(node, "qca,pending-bits", intc->irq_mask, cnt);
|
||||
+ for (i = 0; i < cnt; i++) {
|
||||
+ intc->pending_mask |= intc->irq_mask[i];
|
||||
+ intc->irq_wb_chan[i] = 0xffffffff;
|
||||
+ }
|
||||
+
|
||||
+ cntwb = of_count_phandle_with_args(
|
||||
+ node, "qca,ddr-wb-channels", "#qca,ddr-wb-channel-cells");
|
||||
+
|
||||
+ for (i = 0; i < cntwb; i++) {
|
||||
+ struct of_phandle_args args;
|
||||
+ u32 irq = i;
|
||||
+
|
||||
+ of_property_read_u32_index(
|
||||
+ node, "qca,ddr-wb-channel-interrupts", i, &irq);
|
||||
+ if (irq >= ATH79_MAX_INTC_CASCADE)
|
||||
+ continue;
|
||||
+
|
||||
+ err = of_parse_phandle_with_args(
|
||||
+ node, "qca,ddr-wb-channels",
|
||||
+ "#qca,ddr-wb-channel-cells",
|
||||
+ i, &args);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ intc->irq_wb_chan[irq] = args.args[0];
|
||||
+ }
|
||||
+
|
||||
+ intc->irq = irq_of_parse_and_map(node, 0);
|
||||
+ if (!intc->irq)
|
||||
+ panic("Failed to get INTC IRQ");
|
||||
+
|
||||
+ domain = irq_domain_add_linear(node, cnt, &ath79_irq_domain_ops, intc);
|
||||
+ irq_set_chained_handler_and_data(intc->irq, ath79_intc_irq_handler, domain);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+IRQCHIP_DECLARE(ath79_intc, "qca,ar9340-intc",
|
||||
+ ath79_intc_of_init);
|
@ -1,23 +0,0 @@
|
||||
From e029f998594f151008ecbfa024e2957edd2a5189 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Tue, 6 Mar 2018 09:58:19 +0100
|
||||
Subject: [PATCH 08/33] irqchip/irq-ath79-cpu: drop !OF init helper
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/irqchip/irq-ath79-cpu.c | 7 -------
|
||||
1 file changed, 7 deletions(-)
|
||||
|
||||
--- a/drivers/irqchip/irq-ath79-cpu.c
|
||||
+++ b/drivers/irqchip/irq-ath79-cpu.c
|
||||
@@ -85,10 +85,3 @@ static int __init ar79_cpu_intc_of_init(
|
||||
}
|
||||
IRQCHIP_DECLARE(ar79_cpu_intc, "qca,ar7100-cpu-intc",
|
||||
ar79_cpu_intc_of_init);
|
||||
-
|
||||
-void __init ath79_cpu_irq_init(unsigned irq_wb_chan2, unsigned irq_wb_chan3)
|
||||
-{
|
||||
- irq_wb_chan[2] = irq_wb_chan2;
|
||||
- irq_wb_chan[3] = irq_wb_chan3;
|
||||
- mips_cpu_irq_init();
|
||||
-}
|
@ -1,57 +0,0 @@
|
||||
From 4a4f869ec58ed8910b9b2e68d0eee50957e9bb20 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Mon, 25 Jun 2018 15:52:10 +0200
|
||||
Subject: [PATCH 17/33] dt-bindings: PCI: qcom,ar7100: adds binding doc
|
||||
|
||||
With the driver being converted from platform_data to pure OF, we need to
|
||||
also add some docs.
|
||||
|
||||
Cc: Rob Herring <robh+dt@kernel.org>
|
||||
Cc: devicetree@vger.kernel.org
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
.../devicetree/bindings/pci/qcom,ar7100-pci.txt | 38 ++++++++++++++++++++++
|
||||
1 file changed, 38 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/pci/qcom,ar7100-pci.txt
|
||||
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/pci/qcom,ar7100-pci.txt
|
||||
@@ -0,0 +1,38 @@
|
||||
+* Qualcomm Atheros AR7100 PCI express root complex
|
||||
+
|
||||
+Required properties:
|
||||
+- compatible: should contain "qcom,ar7100-pci" to identify the core.
|
||||
+- reg: Should contain the register ranges as listed in the reg-names property.
|
||||
+- reg-names: Definition: Must include the following entries
|
||||
+ - "cfg_base" IO Memory
|
||||
+- #address-cells: set to <3>
|
||||
+- #size-cells: set to <2>
|
||||
+- ranges: ranges for the PCI memory and I/O regions
|
||||
+- interrupt-map-mask and interrupt-map: standard PCI
|
||||
+ properties to define the mapping of the PCIe interface to interrupt
|
||||
+ numbers.
|
||||
+- #interrupt-cells: set to <1>
|
||||
+- interrupt-controller: define to enable the builtin IRQ cascade.
|
||||
+
|
||||
+Optional properties:
|
||||
+- interrupt-parent: phandle to the MIPS IRQ controller
|
||||
+
|
||||
+* Example for ar7100
|
||||
+ pcie@180c0000 {
|
||||
+ compatible = "qca,ar7100-pci";
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+ bus-range = <0x0 0x0>;
|
||||
+ reg = <0x17010000 0x100>;
|
||||
+ reg-names = "cfg_base";
|
||||
+ ranges = <0x2000000 0 0x10000000 0x10000000 0 0x07000000
|
||||
+ 0x1000000 0 0x00000000 0x00000000 0 0x00000001>;
|
||||
+ interrupt-parent = <&cpuintc>;
|
||||
+ interrupts = <2>;
|
||||
+
|
||||
+ interrupt-controller;
|
||||
+ #interrupt-cells = <1>;
|
||||
+
|
||||
+ interrupt-map-mask = <0 0 0 1>;
|
||||
+ interrupt-map = <0 0 0 0 &pcie0 0>;
|
||||
+ };
|
@ -1,206 +0,0 @@
|
||||
From 1855ab6b1d27f5b38a648baf57ff6a534afec26d Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Sat, 23 Jun 2018 15:07:23 +0200
|
||||
Subject: [PATCH 18/33] MIPS: pci-ar71xx: convert to OF
|
||||
|
||||
With the ath79 target getting converted to pure OF, we can drop all the
|
||||
platform data code and add the missing OF bits to the driver. We also add
|
||||
a irq domain for the PCI/e controllers cascade, thus making it usable from
|
||||
dts files.
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
arch/mips/pci/pci-ar71xx.c | 82 +++++++++++++++++++++++-----------------------
|
||||
1 file changed, 41 insertions(+), 41 deletions(-)
|
||||
|
||||
--- a/arch/mips/pci/pci-ar71xx.c
|
||||
+++ b/arch/mips/pci/pci-ar71xx.c
|
||||
@@ -15,8 +15,11 @@
|
||||
#include <linux/pci.h>
|
||||
#include <linux/pci_regs.h>
|
||||
#include <linux/interrupt.h>
|
||||
+#include <linux/irqchip/chained_irq.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
+#include <linux/of_irq.h>
|
||||
+#include <linux/of_pci.h>
|
||||
|
||||
#include <asm/mach-ath79/ar71xx_regs.h>
|
||||
#include <asm/mach-ath79/ath79.h>
|
||||
@@ -46,12 +49,13 @@
|
||||
#define AR71XX_PCI_IRQ_COUNT 5
|
||||
|
||||
struct ar71xx_pci_controller {
|
||||
+ struct device_node *np;
|
||||
void __iomem *cfg_base;
|
||||
int irq;
|
||||
- int irq_base;
|
||||
struct pci_controller pci_ctrl;
|
||||
struct resource io_res;
|
||||
struct resource mem_res;
|
||||
+ struct irq_domain *domain;
|
||||
};
|
||||
|
||||
/* Byte lane enable bits */
|
||||
@@ -225,29 +229,30 @@ static struct pci_ops ar71xx_pci_ops = {
|
||||
|
||||
static void ar71xx_pci_irq_handler(struct irq_desc *desc)
|
||||
{
|
||||
- struct ar71xx_pci_controller *apc;
|
||||
void __iomem *base = ath79_reset_base;
|
||||
+ struct irq_chip *chip = irq_desc_get_chip(desc);
|
||||
+ struct ar71xx_pci_controller *apc = irq_desc_get_handler_data(desc);
|
||||
u32 pending;
|
||||
|
||||
- apc = irq_desc_get_handler_data(desc);
|
||||
-
|
||||
+ chained_irq_enter(chip, desc);
|
||||
pending = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_STATUS) &
|
||||
__raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
||||
|
||||
if (pending & AR71XX_PCI_INT_DEV0)
|
||||
- generic_handle_irq(apc->irq_base + 0);
|
||||
+ generic_handle_irq(irq_linear_revmap(apc->domain, 1));
|
||||
|
||||
else if (pending & AR71XX_PCI_INT_DEV1)
|
||||
- generic_handle_irq(apc->irq_base + 1);
|
||||
+ generic_handle_irq(irq_linear_revmap(apc->domain, 2));
|
||||
|
||||
else if (pending & AR71XX_PCI_INT_DEV2)
|
||||
- generic_handle_irq(apc->irq_base + 2);
|
||||
+ generic_handle_irq(irq_linear_revmap(apc->domain, 3));
|
||||
|
||||
else if (pending & AR71XX_PCI_INT_CORE)
|
||||
- generic_handle_irq(apc->irq_base + 4);
|
||||
+ generic_handle_irq(irq_linear_revmap(apc->domain, 4));
|
||||
|
||||
else
|
||||
spurious_interrupt();
|
||||
+ chained_irq_exit(chip, desc);
|
||||
}
|
||||
|
||||
static void ar71xx_pci_irq_unmask(struct irq_data *d)
|
||||
@@ -258,7 +263,7 @@ static void ar71xx_pci_irq_unmask(struct
|
||||
u32 t;
|
||||
|
||||
apc = irq_data_get_irq_chip_data(d);
|
||||
- irq = d->irq - apc->irq_base;
|
||||
+ irq = irq_linear_revmap(apc->domain, d->irq);
|
||||
|
||||
t = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
||||
__raw_writel(t | (1 << irq), base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
||||
@@ -275,7 +280,7 @@ static void ar71xx_pci_irq_mask(struct i
|
||||
u32 t;
|
||||
|
||||
apc = irq_data_get_irq_chip_data(d);
|
||||
- irq = d->irq - apc->irq_base;
|
||||
+ irq = irq_linear_revmap(apc->domain, d->irq);
|
||||
|
||||
t = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
||||
__raw_writel(t & ~(1 << irq), base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
||||
@@ -291,24 +296,31 @@ static struct irq_chip ar71xx_pci_irq_ch
|
||||
.irq_mask_ack = ar71xx_pci_irq_mask,
|
||||
};
|
||||
|
||||
+static int ar71xx_pci_irq_map(struct irq_domain *d,
|
||||
+ unsigned int irq, irq_hw_number_t hw)
|
||||
+{
|
||||
+ struct ar71xx_pci_controller *apc = d->host_data;
|
||||
+
|
||||
+ irq_set_chip_and_handler(irq, &ar71xx_pci_irq_chip, handle_level_irq);
|
||||
+ irq_set_chip_data(irq, apc);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct irq_domain_ops ar71xx_pci_domain_ops = {
|
||||
+ .xlate = irq_domain_xlate_onecell,
|
||||
+ .map = ar71xx_pci_irq_map,
|
||||
+};
|
||||
+
|
||||
static void ar71xx_pci_irq_init(struct ar71xx_pci_controller *apc)
|
||||
{
|
||||
void __iomem *base = ath79_reset_base;
|
||||
- int i;
|
||||
|
||||
__raw_writel(0, base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
||||
__raw_writel(0, base + AR71XX_RESET_REG_PCI_INT_STATUS);
|
||||
|
||||
- BUILD_BUG_ON(ATH79_PCI_IRQ_COUNT < AR71XX_PCI_IRQ_COUNT);
|
||||
-
|
||||
- apc->irq_base = ATH79_PCI_IRQ_BASE;
|
||||
- for (i = apc->irq_base;
|
||||
- i < apc->irq_base + AR71XX_PCI_IRQ_COUNT; i++) {
|
||||
- irq_set_chip_and_handler(i, &ar71xx_pci_irq_chip,
|
||||
- handle_level_irq);
|
||||
- irq_set_chip_data(i, apc);
|
||||
- }
|
||||
-
|
||||
+ apc->domain = irq_domain_add_linear(apc->np, AR71XX_PCI_IRQ_COUNT,
|
||||
+ &ar71xx_pci_domain_ops, apc);
|
||||
irq_set_chained_handler_and_data(apc->irq, ar71xx_pci_irq_handler,
|
||||
apc);
|
||||
}
|
||||
@@ -325,10 +337,14 @@ static void ar71xx_pci_reset(void)
|
||||
mdelay(100);
|
||||
}
|
||||
|
||||
+static const struct of_device_id ar71xx_pci_ids[] = {
|
||||
+ { .compatible = "qca,ar7100-pci" },
|
||||
+ {},
|
||||
+};
|
||||
+
|
||||
static int ar71xx_pci_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct ar71xx_pci_controller *apc;
|
||||
- struct resource *res;
|
||||
u32 t;
|
||||
|
||||
apc = devm_kzalloc(&pdev->dev, sizeof(struct ar71xx_pci_controller),
|
||||
@@ -345,26 +361,6 @@ static int ar71xx_pci_probe(struct platf
|
||||
if (apc->irq < 0)
|
||||
return -EINVAL;
|
||||
|
||||
- res = platform_get_resource_byname(pdev, IORESOURCE_IO, "io_base");
|
||||
- if (!res)
|
||||
- return -EINVAL;
|
||||
-
|
||||
- apc->io_res.parent = res;
|
||||
- apc->io_res.name = "PCI IO space";
|
||||
- apc->io_res.start = res->start;
|
||||
- apc->io_res.end = res->end;
|
||||
- apc->io_res.flags = IORESOURCE_IO;
|
||||
-
|
||||
- res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mem_base");
|
||||
- if (!res)
|
||||
- return -EINVAL;
|
||||
-
|
||||
- apc->mem_res.parent = res;
|
||||
- apc->mem_res.name = "PCI memory space";
|
||||
- apc->mem_res.start = res->start;
|
||||
- apc->mem_res.end = res->end;
|
||||
- apc->mem_res.flags = IORESOURCE_MEM;
|
||||
-
|
||||
ar71xx_pci_reset();
|
||||
|
||||
/* setup COMMAND register */
|
||||
@@ -377,9 +373,11 @@ static int ar71xx_pci_probe(struct platf
|
||||
|
||||
ar71xx_pci_irq_init(apc);
|
||||
|
||||
+ apc->np = pdev->dev.of_node;
|
||||
apc->pci_ctrl.pci_ops = &ar71xx_pci_ops;
|
||||
apc->pci_ctrl.mem_resource = &apc->mem_res;
|
||||
apc->pci_ctrl.io_resource = &apc->io_res;
|
||||
+ pci_load_of_ranges(&apc->pci_ctrl, pdev->dev.of_node);
|
||||
|
||||
register_pci_controller(&apc->pci_ctrl);
|
||||
|
||||
@@ -390,6 +388,7 @@ static struct platform_driver ar71xx_pci
|
||||
.probe = ar71xx_pci_probe,
|
||||
.driver = {
|
||||
.name = "ar71xx-pci",
|
||||
+ .of_match_table = of_match_ptr(ar71xx_pci_ids),
|
||||
},
|
||||
};
|
||||
|
@ -1,61 +0,0 @@
|
||||
From ea27764bc3ef2a05decf3ae05edffc289cd0d93c Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Mon, 25 Jun 2018 15:52:02 +0200
|
||||
Subject: [PATCH 19/33] dt-bindings: PCI: qcom,ar7240: adds binding doc
|
||||
|
||||
With the driver being converted from platform_data to pure OF, we need to
|
||||
also add some docs.
|
||||
|
||||
Cc: Rob Herring <robh+dt@kernel.org>
|
||||
Cc: devicetree@vger.kernel.org
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
.../devicetree/bindings/pci/qcom,ar7240-pci.txt | 42 ++++++++++++++++++++++
|
||||
1 file changed, 42 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/pci/qcom,ar7240-pci.txt
|
||||
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/pci/qcom,ar7240-pci.txt
|
||||
@@ -0,0 +1,42 @@
|
||||
+* Qualcomm Atheros AR724X PCI express root complex
|
||||
+
|
||||
+Required properties:
|
||||
+- compatible: should contain "qcom,ar7240-pci" to identify the core.
|
||||
+- reg: Should contain the register ranges as listed in the reg-names property.
|
||||
+- reg-names: Definition: Must include the following entries
|
||||
+ - "crp_base" Configuration registers
|
||||
+ - "ctrl_base" Control registers
|
||||
+ - "cfg_base" IO Memory
|
||||
+- #address-cells: set to <3>
|
||||
+- #size-cells: set to <2>
|
||||
+- ranges: ranges for the PCI memory and I/O regions
|
||||
+- interrupt-map-mask and interrupt-map: standard PCI
|
||||
+ properties to define the mapping of the PCIe interface to interrupt
|
||||
+ numbers.
|
||||
+- #interrupt-cells: set to <1>
|
||||
+- interrupt-parent: phandle to the MIPS IRQ controller
|
||||
+
|
||||
+Optional properties:
|
||||
+- interrupt-controller: define to enable the builtin IRQ cascade.
|
||||
+
|
||||
+* Example for qca9557
|
||||
+ pcie@180c0000 {
|
||||
+ compatible = "qcom,ar7240-pci";
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+ bus-range = <0x0 0x0>;
|
||||
+ reg = <0x180c0000 0x1000>,
|
||||
+ <0x180f0000 0x100>,
|
||||
+ <0x14000000 0x1000>;
|
||||
+ reg-names = "crp_base", "ctrl_base", "cfg_base";
|
||||
+ ranges = <0x2000000 0 0x10000000 0x10000000 0 0x04000000
|
||||
+ 0x1000000 0 0x00000000 0x00000000 0 0x00000001>;
|
||||
+ interrupt-parent = <&intc2>;
|
||||
+ interrupts = <1>;
|
||||
+
|
||||
+ interrupt-controller;
|
||||
+ #interrupt-cells = <1>;
|
||||
+
|
||||
+ interrupt-map-mask = <0 0 0 1>;
|
||||
+ interrupt-map = <0 0 0 0 &pcie0 0>;
|
||||
+ };
|
@ -1,213 +0,0 @@
|
||||
From a522ee0199d5d3ea114ca2e211f6ac398d3e8e0b Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Sat, 23 Jun 2018 15:07:37 +0200
|
||||
Subject: [PATCH 20/33] MIPS: pci-ar724x: convert to OF
|
||||
|
||||
With the ath79 target getting converted to pure OF, we can drop all the
|
||||
platform data code and add the missing OF bits to the driver. We also add
|
||||
a irq domain for the PCI/e controllers cascade, thus making it usable from
|
||||
dts files.
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
arch/mips/pci/pci-ar724x.c | 88 ++++++++++++++++++++++------------------------
|
||||
1 file changed, 42 insertions(+), 46 deletions(-)
|
||||
|
||||
--- a/arch/mips/pci/pci-ar724x.c
|
||||
+++ b/arch/mips/pci/pci-ar724x.c
|
||||
@@ -11,8 +11,11 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/platform_device.h>
|
||||
+#include <linux/irqchip/chained_irq.h>
|
||||
#include <asm/mach-ath79/ath79.h>
|
||||
#include <asm/mach-ath79/ar71xx_regs.h>
|
||||
+#include <linux/of_irq.h>
|
||||
+#include <linux/of_pci.h>
|
||||
|
||||
#define AR724X_PCI_REG_APP 0x00
|
||||
#define AR724X_PCI_REG_RESET 0x18
|
||||
@@ -42,17 +45,20 @@ struct ar724x_pci_controller {
|
||||
void __iomem *crp_base;
|
||||
|
||||
int irq;
|
||||
- int irq_base;
|
||||
|
||||
bool link_up;
|
||||
bool bar0_is_cached;
|
||||
u32 bar0_value;
|
||||
|
||||
+ struct device_node *np;
|
||||
struct pci_controller pci_controller;
|
||||
+ struct irq_domain *domain;
|
||||
struct resource io_res;
|
||||
struct resource mem_res;
|
||||
};
|
||||
|
||||
+static struct irq_chip ar724x_pci_irq_chip;
|
||||
+
|
||||
static inline bool ar724x_pci_check_link(struct ar724x_pci_controller *apc)
|
||||
{
|
||||
u32 reset;
|
||||
@@ -228,35 +234,31 @@ static struct pci_ops ar724x_pci_ops = {
|
||||
|
||||
static void ar724x_pci_irq_handler(struct irq_desc *desc)
|
||||
{
|
||||
- struct ar724x_pci_controller *apc;
|
||||
- void __iomem *base;
|
||||
+ struct irq_chip *chip = irq_desc_get_chip(desc);
|
||||
+ struct ar724x_pci_controller *apc = irq_desc_get_handler_data(desc);
|
||||
u32 pending;
|
||||
|
||||
- apc = irq_desc_get_handler_data(desc);
|
||||
- base = apc->ctrl_base;
|
||||
-
|
||||
- pending = __raw_readl(base + AR724X_PCI_REG_INT_STATUS) &
|
||||
- __raw_readl(base + AR724X_PCI_REG_INT_MASK);
|
||||
+ chained_irq_enter(chip, desc);
|
||||
+ pending = __raw_readl(apc->ctrl_base + AR724X_PCI_REG_INT_STATUS) &
|
||||
+ __raw_readl(apc->ctrl_base + AR724X_PCI_REG_INT_MASK);
|
||||
|
||||
if (pending & AR724X_PCI_INT_DEV0)
|
||||
- generic_handle_irq(apc->irq_base + 0);
|
||||
-
|
||||
+ generic_handle_irq(irq_linear_revmap(apc->domain, 1));
|
||||
else
|
||||
spurious_interrupt();
|
||||
+ chained_irq_exit(chip, desc);
|
||||
}
|
||||
|
||||
static void ar724x_pci_irq_unmask(struct irq_data *d)
|
||||
{
|
||||
struct ar724x_pci_controller *apc;
|
||||
void __iomem *base;
|
||||
- int offset;
|
||||
u32 t;
|
||||
|
||||
apc = irq_data_get_irq_chip_data(d);
|
||||
base = apc->ctrl_base;
|
||||
- offset = apc->irq_base - d->irq;
|
||||
|
||||
- switch (offset) {
|
||||
+ switch (irq_linear_revmap(apc->domain, d->irq)) {
|
||||
case 0:
|
||||
t = __raw_readl(base + AR724X_PCI_REG_INT_MASK);
|
||||
__raw_writel(t | AR724X_PCI_INT_DEV0,
|
||||
@@ -270,14 +272,12 @@ static void ar724x_pci_irq_mask(struct i
|
||||
{
|
||||
struct ar724x_pci_controller *apc;
|
||||
void __iomem *base;
|
||||
- int offset;
|
||||
u32 t;
|
||||
|
||||
apc = irq_data_get_irq_chip_data(d);
|
||||
base = apc->ctrl_base;
|
||||
- offset = apc->irq_base - d->irq;
|
||||
|
||||
- switch (offset) {
|
||||
+ switch (irq_linear_revmap(apc->domain, d->irq)) {
|
||||
case 0:
|
||||
t = __raw_readl(base + AR724X_PCI_REG_INT_MASK);
|
||||
__raw_writel(t & ~AR724X_PCI_INT_DEV0,
|
||||
@@ -302,26 +302,34 @@ static struct irq_chip ar724x_pci_irq_ch
|
||||
.irq_mask_ack = ar724x_pci_irq_mask,
|
||||
};
|
||||
|
||||
+static int ar724x_pci_irq_map(struct irq_domain *d,
|
||||
+ unsigned int irq, irq_hw_number_t hw)
|
||||
+{
|
||||
+ struct ar724x_pci_controller *apc = d->host_data;
|
||||
+
|
||||
+ irq_set_chip_and_handler(irq, &ar724x_pci_irq_chip, handle_level_irq);
|
||||
+ irq_set_chip_data(irq, apc);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct irq_domain_ops ar724x_pci_domain_ops = {
|
||||
+ .xlate = irq_domain_xlate_onecell,
|
||||
+ .map = ar724x_pci_irq_map,
|
||||
+};
|
||||
+
|
||||
static void ar724x_pci_irq_init(struct ar724x_pci_controller *apc,
|
||||
int id)
|
||||
{
|
||||
void __iomem *base;
|
||||
- int i;
|
||||
|
||||
base = apc->ctrl_base;
|
||||
|
||||
__raw_writel(0, base + AR724X_PCI_REG_INT_MASK);
|
||||
__raw_writel(0, base + AR724X_PCI_REG_INT_STATUS);
|
||||
|
||||
- apc->irq_base = ATH79_PCI_IRQ_BASE + (id * AR724X_PCI_IRQ_COUNT);
|
||||
-
|
||||
- for (i = apc->irq_base;
|
||||
- i < apc->irq_base + AR724X_PCI_IRQ_COUNT; i++) {
|
||||
- irq_set_chip_and_handler(i, &ar724x_pci_irq_chip,
|
||||
- handle_level_irq);
|
||||
- irq_set_chip_data(i, apc);
|
||||
- }
|
||||
-
|
||||
+ apc->domain = irq_domain_add_linear(apc->np, 2,
|
||||
+ &ar724x_pci_domain_ops, apc);
|
||||
irq_set_chained_handler_and_data(apc->irq, ar724x_pci_irq_handler,
|
||||
apc);
|
||||
}
|
||||
@@ -360,7 +368,6 @@ static void ar724x_pci_hw_init(struct ar
|
||||
static int ar724x_pci_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct ar724x_pci_controller *apc;
|
||||
- struct resource *res;
|
||||
int id;
|
||||
|
||||
id = pdev->id;
|
||||
@@ -388,29 +395,11 @@ static int ar724x_pci_probe(struct platf
|
||||
if (apc->irq < 0)
|
||||
return -EINVAL;
|
||||
|
||||
- res = platform_get_resource_byname(pdev, IORESOURCE_IO, "io_base");
|
||||
- if (!res)
|
||||
- return -EINVAL;
|
||||
-
|
||||
- apc->io_res.parent = res;
|
||||
- apc->io_res.name = "PCI IO space";
|
||||
- apc->io_res.start = res->start;
|
||||
- apc->io_res.end = res->end;
|
||||
- apc->io_res.flags = IORESOURCE_IO;
|
||||
-
|
||||
- res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mem_base");
|
||||
- if (!res)
|
||||
- return -EINVAL;
|
||||
-
|
||||
- apc->mem_res.parent = res;
|
||||
- apc->mem_res.name = "PCI memory space";
|
||||
- apc->mem_res.start = res->start;
|
||||
- apc->mem_res.end = res->end;
|
||||
- apc->mem_res.flags = IORESOURCE_MEM;
|
||||
-
|
||||
+ apc->np = pdev->dev.of_node;
|
||||
apc->pci_controller.pci_ops = &ar724x_pci_ops;
|
||||
apc->pci_controller.io_resource = &apc->io_res;
|
||||
apc->pci_controller.mem_resource = &apc->mem_res;
|
||||
+ pci_load_of_ranges(&apc->pci_controller, pdev->dev.of_node);
|
||||
|
||||
/*
|
||||
* Do the full PCIE Root Complex Initialization Sequence if the PCIe
|
||||
@@ -432,10 +421,16 @@ static int ar724x_pci_probe(struct platf
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static const struct of_device_id ar724x_pci_ids[] = {
|
||||
+ { .compatible = "qcom,ar7240-pci" },
|
||||
+ {},
|
||||
+};
|
||||
+
|
||||
static struct platform_driver ar724x_pci_driver = {
|
||||
.probe = ar724x_pci_probe,
|
||||
.driver = {
|
||||
.name = "ar724x-pci",
|
||||
+ .of_match_table = of_match_ptr(ar724x_pci_ids),
|
||||
},
|
||||
};
|
||||
|
@ -1,149 +0,0 @@
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Subject: ath79: fix remove irq code from pci driver patch
|
||||
|
||||
This patch got mangled in the void while rebasing it.
|
||||
|
||||
Submitted-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
arch/mips/pci/pci-ar71xx.c | 107 ------------------
|
||||
1 file changed, 141 deletions(-)
|
||||
|
||||
--- a/arch/mips/pci/pci-ar71xx.c
|
||||
+++ b/arch/mips/pci/pci-ar71xx.c
|
||||
@@ -51,11 +51,9 @@
|
||||
struct ar71xx_pci_controller {
|
||||
struct device_node *np;
|
||||
void __iomem *cfg_base;
|
||||
- int irq;
|
||||
struct pci_controller pci_ctrl;
|
||||
struct resource io_res;
|
||||
struct resource mem_res;
|
||||
- struct irq_domain *domain;
|
||||
};
|
||||
|
||||
/* Byte lane enable bits */
|
||||
@@ -227,104 +225,6 @@ static struct pci_ops ar71xx_pci_ops = {
|
||||
.write = ar71xx_pci_write_config,
|
||||
};
|
||||
|
||||
-static void ar71xx_pci_irq_handler(struct irq_desc *desc)
|
||||
-{
|
||||
- void __iomem *base = ath79_reset_base;
|
||||
- struct irq_chip *chip = irq_desc_get_chip(desc);
|
||||
- struct ar71xx_pci_controller *apc = irq_desc_get_handler_data(desc);
|
||||
- u32 pending;
|
||||
-
|
||||
- chained_irq_enter(chip, desc);
|
||||
- pending = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_STATUS) &
|
||||
- __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
||||
-
|
||||
- if (pending & AR71XX_PCI_INT_DEV0)
|
||||
- generic_handle_irq(irq_linear_revmap(apc->domain, 1));
|
||||
-
|
||||
- else if (pending & AR71XX_PCI_INT_DEV1)
|
||||
- generic_handle_irq(irq_linear_revmap(apc->domain, 2));
|
||||
-
|
||||
- else if (pending & AR71XX_PCI_INT_DEV2)
|
||||
- generic_handle_irq(irq_linear_revmap(apc->domain, 3));
|
||||
-
|
||||
- else if (pending & AR71XX_PCI_INT_CORE)
|
||||
- generic_handle_irq(irq_linear_revmap(apc->domain, 4));
|
||||
-
|
||||
- else
|
||||
- spurious_interrupt();
|
||||
- chained_irq_exit(chip, desc);
|
||||
-}
|
||||
-
|
||||
-static void ar71xx_pci_irq_unmask(struct irq_data *d)
|
||||
-{
|
||||
- struct ar71xx_pci_controller *apc;
|
||||
- unsigned int irq;
|
||||
- void __iomem *base = ath79_reset_base;
|
||||
- u32 t;
|
||||
-
|
||||
- apc = irq_data_get_irq_chip_data(d);
|
||||
- irq = irq_linear_revmap(apc->domain, d->irq);
|
||||
-
|
||||
- t = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
||||
- __raw_writel(t | (1 << irq), base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
||||
-
|
||||
- /* flush write */
|
||||
- __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
||||
-}
|
||||
-
|
||||
-static void ar71xx_pci_irq_mask(struct irq_data *d)
|
||||
-{
|
||||
- struct ar71xx_pci_controller *apc;
|
||||
- unsigned int irq;
|
||||
- void __iomem *base = ath79_reset_base;
|
||||
- u32 t;
|
||||
-
|
||||
- apc = irq_data_get_irq_chip_data(d);
|
||||
- irq = irq_linear_revmap(apc->domain, d->irq);
|
||||
-
|
||||
- t = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
||||
- __raw_writel(t & ~(1 << irq), base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
||||
-
|
||||
- /* flush write */
|
||||
- __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
||||
-}
|
||||
-
|
||||
-static struct irq_chip ar71xx_pci_irq_chip = {
|
||||
- .name = "AR71XX PCI",
|
||||
- .irq_mask = ar71xx_pci_irq_mask,
|
||||
- .irq_unmask = ar71xx_pci_irq_unmask,
|
||||
- .irq_mask_ack = ar71xx_pci_irq_mask,
|
||||
-};
|
||||
-
|
||||
-static int ar71xx_pci_irq_map(struct irq_domain *d,
|
||||
- unsigned int irq, irq_hw_number_t hw)
|
||||
-{
|
||||
- struct ar71xx_pci_controller *apc = d->host_data;
|
||||
-
|
||||
- irq_set_chip_and_handler(irq, &ar71xx_pci_irq_chip, handle_level_irq);
|
||||
- irq_set_chip_data(irq, apc);
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static const struct irq_domain_ops ar71xx_pci_domain_ops = {
|
||||
- .xlate = irq_domain_xlate_onecell,
|
||||
- .map = ar71xx_pci_irq_map,
|
||||
-};
|
||||
-
|
||||
-static void ar71xx_pci_irq_init(struct ar71xx_pci_controller *apc)
|
||||
-{
|
||||
- void __iomem *base = ath79_reset_base;
|
||||
-
|
||||
- __raw_writel(0, base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
||||
- __raw_writel(0, base + AR71XX_RESET_REG_PCI_INT_STATUS);
|
||||
-
|
||||
- apc->domain = irq_domain_add_linear(apc->np, AR71XX_PCI_IRQ_COUNT,
|
||||
- &ar71xx_pci_domain_ops, apc);
|
||||
- irq_set_chained_handler_and_data(apc->irq, ar71xx_pci_irq_handler,
|
||||
- apc);
|
||||
-}
|
||||
-
|
||||
static void ar71xx_pci_reset(void)
|
||||
{
|
||||
ath79_device_reset_set(AR71XX_RESET_PCI_BUS | AR71XX_RESET_PCI_CORE);
|
||||
@@ -357,10 +257,6 @@ static int ar71xx_pci_probe(struct platf
|
||||
if (IS_ERR(apc->cfg_base))
|
||||
return PTR_ERR(apc->cfg_base);
|
||||
|
||||
- apc->irq = platform_get_irq(pdev, 0);
|
||||
- if (apc->irq < 0)
|
||||
- return -EINVAL;
|
||||
-
|
||||
ar71xx_pci_reset();
|
||||
|
||||
/* setup COMMAND register */
|
||||
@@ -371,8 +267,6 @@ static int ar71xx_pci_probe(struct platf
|
||||
/* clear bus errors */
|
||||
ar71xx_pci_check_error(apc, 1);
|
||||
|
||||
- ar71xx_pci_irq_init(apc);
|
||||
-
|
||||
apc->np = pdev->dev.of_node;
|
||||
apc->pci_ctrl.pci_ops = &ar71xx_pci_ops;
|
||||
apc->pci_ctrl.mem_resource = &apc->mem_res;
|
@ -1,130 +0,0 @@
|
||||
From: David Bauer <mail@david-bauer.net>
|
||||
Date: Sat, 11 Apr 2020 14:03:12 +0200
|
||||
Subject: MIPS: pci-ar724x: add QCA9550 reset sequence
|
||||
|
||||
The QCA9550 family of SoCs have a slightly different reset
|
||||
sequence compared to older chips.
|
||||
|
||||
Normally the bootloader performs this sequence, however
|
||||
some bootloader implementation expect the operating system
|
||||
to clear the reset.
|
||||
|
||||
Also get the resets from OF to support handling of the second
|
||||
PCIe root-complex on the QCA9558.
|
||||
|
||||
Signed-off-by: David Bauer <mail@david-bauer.net>
|
||||
|
||||
--- a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h
|
||||
+++ b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h
|
||||
@@ -390,6 +390,7 @@
|
||||
#define QCA955X_PLL_CPU_CONFIG_REG 0x00
|
||||
#define QCA955X_PLL_DDR_CONFIG_REG 0x04
|
||||
#define QCA955X_PLL_CLK_CTRL_REG 0x08
|
||||
+#define QCA955X_PLL_PCIE_CONFIG_REG 0x0c
|
||||
#define QCA955X_PLL_ETH_XMII_CONTROL_REG 0x28
|
||||
#define QCA955X_PLL_ETH_SGMII_CONTROL_REG 0x48
|
||||
#define QCA955X_PLL_ETH_SGMII_SERDES_REG 0x4c
|
||||
@@ -475,6 +476,9 @@
|
||||
#define QCA956X_PLL_CLK_CTRL_CPU_DDRCLK_FROM_CPUPLL BIT(21)
|
||||
#define QCA956X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL BIT(24)
|
||||
|
||||
+#define QCA955X_PLL_PCIE_CONFIG_PLL_PWD BIT(30)
|
||||
+#define QCA955X_PLL_PCIE_CONFIG_PLL_BYPASS BIT(16)
|
||||
+
|
||||
#define QCA956X_PLL_SWITCH_CLOCK_SPARE_I2C_CLK_SELB BIT(5)
|
||||
#define QCA956X_PLL_SWITCH_CLOCK_SPARE_MDIO_CLK_SEL0_1 BIT(6)
|
||||
#define QCA956X_PLL_SWITCH_CLOCK_SPARE_UART1_CLK_SEL BIT(7)
|
||||
--- a/arch/mips/pci/pci-ar724x.c
|
||||
+++ b/arch/mips/pci/pci-ar724x.c
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
#include <linux/irq.h>
|
||||
#include <linux/pci.h>
|
||||
+#include <linux/reset.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/platform_device.h>
|
||||
@@ -55,6 +56,9 @@ struct ar724x_pci_controller {
|
||||
struct irq_domain *domain;
|
||||
struct resource io_res;
|
||||
struct resource mem_res;
|
||||
+
|
||||
+ struct reset_control *hc_reset;
|
||||
+ struct reset_control *phy_reset;
|
||||
};
|
||||
|
||||
static struct irq_chip ar724x_pci_irq_chip;
|
||||
@@ -340,18 +344,30 @@ static void ar724x_pci_hw_init(struct ar
|
||||
int wait = 0;
|
||||
|
||||
/* deassert PCIe host controller and PCIe PHY reset */
|
||||
- ath79_device_reset_clear(AR724X_RESET_PCIE);
|
||||
- ath79_device_reset_clear(AR724X_RESET_PCIE_PHY);
|
||||
+ reset_control_deassert(apc->hc_reset);
|
||||
+ reset_control_deassert(apc->phy_reset);
|
||||
|
||||
- /* remove the reset of the PCIE PLL */
|
||||
- ppl = ath79_pll_rr(AR724X_PLL_REG_PCIE_CONFIG);
|
||||
- ppl &= ~AR724X_PLL_REG_PCIE_CONFIG_PPL_RESET;
|
||||
- ath79_pll_wr(AR724X_PLL_REG_PCIE_CONFIG, ppl);
|
||||
-
|
||||
- /* deassert bypass for the PCIE PLL */
|
||||
- ppl = ath79_pll_rr(AR724X_PLL_REG_PCIE_CONFIG);
|
||||
- ppl &= ~AR724X_PLL_REG_PCIE_CONFIG_PPL_BYPASS;
|
||||
- ath79_pll_wr(AR724X_PLL_REG_PCIE_CONFIG, ppl);
|
||||
+ if (of_device_is_compatible(apc->np, "qcom,qca9550-pci")) {
|
||||
+ /* remove the reset of the PCIE PLL */
|
||||
+ ppl = ath79_pll_rr(QCA955X_PLL_PCIE_CONFIG_REG);
|
||||
+ ppl &= ~QCA955X_PLL_PCIE_CONFIG_PLL_PWD;
|
||||
+ ath79_pll_wr(QCA955X_PLL_PCIE_CONFIG_REG, ppl);
|
||||
+
|
||||
+ /* deassert bypass for the PCIE PLL */
|
||||
+ ppl = ath79_pll_rr(QCA955X_PLL_PCIE_CONFIG_REG);
|
||||
+ ppl &= ~QCA955X_PLL_PCIE_CONFIG_PLL_BYPASS;
|
||||
+ ath79_pll_wr(QCA955X_PLL_PCIE_CONFIG_REG, ppl);
|
||||
+ } else {
|
||||
+ /* remove the reset of the PCIE PLL */
|
||||
+ ppl = ath79_pll_rr(AR724X_PLL_REG_PCIE_CONFIG);
|
||||
+ ppl &= ~AR724X_PLL_REG_PCIE_CONFIG_PPL_RESET;
|
||||
+ ath79_pll_wr(AR724X_PLL_REG_PCIE_CONFIG, ppl);
|
||||
+
|
||||
+ /* deassert bypass for the PCIE PLL */
|
||||
+ ppl = ath79_pll_rr(AR724X_PLL_REG_PCIE_CONFIG);
|
||||
+ ppl &= ~AR724X_PLL_REG_PCIE_CONFIG_PPL_BYPASS;
|
||||
+ ath79_pll_wr(AR724X_PLL_REG_PCIE_CONFIG, ppl);
|
||||
+ }
|
||||
|
||||
/* set PCIE Application Control to ready */
|
||||
app = __raw_readl(apc->ctrl_base + AR724X_PCI_REG_APP);
|
||||
@@ -395,6 +411,14 @@ static int ar724x_pci_probe(struct platf
|
||||
if (apc->irq < 0)
|
||||
return -EINVAL;
|
||||
|
||||
+ apc->hc_reset = devm_reset_control_get_exclusive(&pdev->dev, "hc");
|
||||
+ if (IS_ERR(apc->hc_reset))
|
||||
+ return PTR_ERR(apc->hc_reset);
|
||||
+
|
||||
+ apc->phy_reset = devm_reset_control_get_exclusive(&pdev->dev, "phy");
|
||||
+ if (IS_ERR(apc->phy_reset))
|
||||
+ return PTR_ERR(apc->phy_reset);
|
||||
+
|
||||
apc->np = pdev->dev.of_node;
|
||||
apc->pci_controller.pci_ops = &ar724x_pci_ops;
|
||||
apc->pci_controller.io_resource = &apc->io_res;
|
||||
@@ -405,7 +429,7 @@ static int ar724x_pci_probe(struct platf
|
||||
* Do the full PCIE Root Complex Initialization Sequence if the PCIe
|
||||
* host controller is in reset.
|
||||
*/
|
||||
- if (ath79_reset_rr(AR724X_RESET_REG_RESET_MODULE) & AR724X_RESET_PCIE)
|
||||
+ if (reset_control_status(apc->hc_reset))
|
||||
ar724x_pci_hw_init(apc);
|
||||
|
||||
apc->link_up = ar724x_pci_check_link(apc);
|
||||
@@ -423,6 +447,7 @@ static int ar724x_pci_probe(struct platf
|
||||
|
||||
static const struct of_device_id ar724x_pci_ids[] = {
|
||||
{ .compatible = "qcom,ar7240-pci" },
|
||||
+ { .compatible = "qcom,qca9550-pci" },
|
||||
{},
|
||||
};
|
||||
|
@ -1,109 +0,0 @@
|
||||
From: Gabor Juhos <juhosg@openwrt.org>
|
||||
Subject: [PATCH] ar71xx: swizzle address for PCI byte/word access on AR71xx
|
||||
|
||||
Closes #11683.
|
||||
|
||||
SVN-Revision: 32639
|
||||
---
|
||||
.../mips/include/asm/mach-ath79/mangle-port.h | 111 ++++++++++++++++++
|
||||
1 file changed, 111 insertions(+)
|
||||
create mode 100644 arch/mips/include/asm/mach-ath79/mangle-port.h
|
||||
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/include/asm/mach-ath79/mangle-port.h
|
||||
@@ -0,0 +1,37 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2012 Gabor Juhos <juhosg@openwrt.org>
|
||||
+ *
|
||||
+ * This file was derived from: inlude/asm-mips/mach-generic/mangle-port.h
|
||||
+ * Copyright (C) 2003, 2004 Ralf Baechle
|
||||
+ *
|
||||
+ * 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 published
|
||||
+ * by the Free Software Foundation.
|
||||
+ */
|
||||
+
|
||||
+#ifndef __ASM_MACH_ATH79_MANGLE_PORT_H
|
||||
+#define __ASM_MACH_ATH79_MANGLE_PORT_H
|
||||
+
|
||||
+#ifdef CONFIG_PCI_AR71XX
|
||||
+extern unsigned long (ath79_pci_swizzle_b)(unsigned long port);
|
||||
+extern unsigned long (ath79_pci_swizzle_w)(unsigned long port);
|
||||
+#else
|
||||
+#define ath79_pci_swizzle_b(port) (port)
|
||||
+#define ath79_pci_swizzle_w(port) (port)
|
||||
+#endif
|
||||
+
|
||||
+#define __swizzle_addr_b(port) ath79_pci_swizzle_b(port)
|
||||
+#define __swizzle_addr_w(port) ath79_pci_swizzle_w(port)
|
||||
+#define __swizzle_addr_l(port) (port)
|
||||
+#define __swizzle_addr_q(port) (port)
|
||||
+
|
||||
+# define ioswabb(a, x) (x)
|
||||
+# define __mem_ioswabb(a, x) (x)
|
||||
+# define ioswabw(a, x) (x)
|
||||
+# define __mem_ioswabw(a, x) cpu_to_le16(x)
|
||||
+# define ioswabl(a, x) (x)
|
||||
+# define __mem_ioswabl(a, x) cpu_to_le32(x)
|
||||
+# define ioswabq(a, x) (x)
|
||||
+# define __mem_ioswabq(a, x) cpu_to_le64(x)
|
||||
+
|
||||
+#endif /* __ASM_MACH_ATH79_MANGLE_PORT_H */
|
||||
--- a/arch/mips/pci/pci-ar71xx.c
|
||||
+++ b/arch/mips/pci/pci-ar71xx.c
|
||||
@@ -68,6 +68,45 @@ static const u32 ar71xx_pci_read_mask[8]
|
||||
0, 0xff, 0xffff, 0, 0xffffffff, 0, 0, 0
|
||||
};
|
||||
|
||||
+static unsigned long (*__ath79_pci_swizzle_b)(unsigned long port);
|
||||
+static unsigned long (*__ath79_pci_swizzle_w)(unsigned long port);
|
||||
+
|
||||
+static inline bool ar71xx_is_pci_addr(unsigned long port)
|
||||
+{
|
||||
+ unsigned long phys = CPHYSADDR(port);
|
||||
+
|
||||
+ return (phys >= AR71XX_PCI_MEM_BASE &&
|
||||
+ phys < AR71XX_PCI_MEM_BASE + AR71XX_PCI_MEM_SIZE);
|
||||
+}
|
||||
+
|
||||
+static unsigned long ar71xx_pci_swizzle_b(unsigned long port)
|
||||
+{
|
||||
+ return ar71xx_is_pci_addr(port) ? port ^ 3 : port;
|
||||
+}
|
||||
+
|
||||
+static unsigned long ar71xx_pci_swizzle_w(unsigned long port)
|
||||
+{
|
||||
+ return ar71xx_is_pci_addr(port) ? port ^ 2 : port;
|
||||
+}
|
||||
+
|
||||
+unsigned long ath79_pci_swizzle_b(unsigned long port)
|
||||
+{
|
||||
+ if (__ath79_pci_swizzle_b)
|
||||
+ return __ath79_pci_swizzle_b(port);
|
||||
+
|
||||
+ return port;
|
||||
+}
|
||||
+EXPORT_SYMBOL(ath79_pci_swizzle_b);
|
||||
+
|
||||
+unsigned long ath79_pci_swizzle_w(unsigned long port)
|
||||
+{
|
||||
+ if (__ath79_pci_swizzle_w)
|
||||
+ return __ath79_pci_swizzle_w(port);
|
||||
+
|
||||
+ return port;
|
||||
+}
|
||||
+EXPORT_SYMBOL(ath79_pci_swizzle_w);
|
||||
+
|
||||
static inline u32 ar71xx_pci_get_ble(int where, int size, int local)
|
||||
{
|
||||
u32 t;
|
||||
@@ -275,6 +314,9 @@ static int ar71xx_pci_probe(struct platf
|
||||
|
||||
register_pci_controller(&apc->pci_ctrl);
|
||||
|
||||
+ __ath79_pci_swizzle_b = ar71xx_pci_swizzle_b;
|
||||
+ __ath79_pci_swizzle_w = ar71xx_pci_swizzle_w;
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,20 +0,0 @@
|
||||
From: Christian Lamparter <chunkeey@gmail.com>
|
||||
Subject: [PATCH] ath79: gmac: add parsers for rxd(v)- and tx(d|en)-delay for
|
||||
|
||||
ath79: gmac: add parsers for rxd(v)- and tx(d|en)-delay for AR9344
|
||||
|
||||
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
||||
|
||||
--- a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h
|
||||
+++ b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h
|
||||
@@ -1231,6 +1231,10 @@
|
||||
#define AR934X_ETH_CFG_RDV_DELAY BIT(16)
|
||||
#define AR934X_ETH_CFG_RDV_DELAY_MASK 0x3
|
||||
#define AR934X_ETH_CFG_RDV_DELAY_SHIFT 16
|
||||
+#define AR934X_ETH_CFG_TXD_DELAY_MASK 0x3
|
||||
+#define AR934X_ETH_CFG_TXD_DELAY_SHIFT 18
|
||||
+#define AR934X_ETH_CFG_TXE_DELAY_MASK 0x3
|
||||
+#define AR934X_ETH_CFG_TXE_DELAY_SHIFT 20
|
||||
|
||||
/*
|
||||
* QCA953X GMAC Interface
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user