This is nearly identical to what landed in ath-next for v7.1, aside from resolving a couple conflicts. A separate patch has been added to replace CONFIG_THERMAL with CPTCFG_ATH12K_THERMAL so the setting may be enabled via menuconfig (as is done with ath10k and ath11k). Note that at this stage, throttling has not been implemented upstream, hence the slight change in wording versus existing options. Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.6-01243-QCAHKSWPL_SILICONZ-1 Link: https://patch.msgid.link/20260223132622.43464-1-maharaja.kennadyrajan@oss.qualcomm.com Signed-off-by: Matt Merhar <mattmerhar@protonmail.com> Link: https://github.com/openwrt/openwrt/pull/22280 Signed-off-by: Robert Marko <robimarko@gmail.com>
226 lines
6.5 KiB
Diff
226 lines
6.5 KiB
Diff
From 1046fc9e98936991aeb0b0656c84833d96a63c0f Mon Sep 17 00:00:00 2001
|
|
From: Christian Marangi <ansuelsmth@gmail.com>
|
|
Date: Sun, 15 Oct 2023 14:22:49 +0200
|
|
Subject: [PATCH 1/5] wifi: rt2x00: Add support for loading EEPROM from
|
|
userspace
|
|
|
|
Add support for loading EEPROM from userspace.
|
|
|
|
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|
---
|
|
drivers/net/wireless/ralink/rt2x00/Kconfig | 5 ++
|
|
drivers/net/wireless/ralink/rt2x00/Makefile | 1 +
|
|
.../net/wireless/ralink/rt2x00/rt2800soc.c | 15 +---
|
|
drivers/net/wireless/ralink/rt2x00/rt2x00.h | 1 +
|
|
.../net/wireless/ralink/rt2x00/rt2x00dev.c | 9 +++
|
|
.../net/wireless/ralink/rt2x00/rt2x00eeprom.c | 75 +++++++++++++++++++
|
|
.../net/wireless/ralink/rt2x00/rt2800soc.c | 1 +
|
|
.../net/wireless/ralink/rt2x00/rt2800soc.h | 9 +++
|
|
8 files changed, 102 insertions(+), 14 deletions(-)
|
|
create mode 100644 drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
|
|
|
|
--- a/local-symbols
|
|
+++ b/local-symbols
|
|
@@ -337,6 +337,7 @@ RT2X00_LIB_FIRMWARE=
|
|
RT2X00_LIB_CRYPTO=
|
|
RT2X00_LIB_LEDS=
|
|
RT2X00_LIB_DEBUGFS=
|
|
+RT2X00_LIB_EEPROM=
|
|
RT2X00_DEBUG=
|
|
WLAN_VENDOR_REALTEK=
|
|
RTL8180=
|
|
--- a/drivers/net/wireless/ralink/rt2x00/Kconfig
|
|
+++ b/drivers/net/wireless/ralink/rt2x00/Kconfig
|
|
@@ -70,6 +70,7 @@ config RT2800PCI
|
|
select RT2X00_LIB_MMIO
|
|
select RT2X00_LIB_PCI
|
|
select RT2X00_LIB_FIRMWARE
|
|
+ select RT2X00_LIB_EEPROM
|
|
select RT2X00_LIB_CRYPTO
|
|
depends on EEPROM_93CX6
|
|
help
|
|
@@ -213,6 +214,7 @@ config RT2800SOC
|
|
select RT2X00_LIB_MMIO
|
|
select RT2X00_LIB_CRYPTO
|
|
select RT2X00_LIB_FIRMWARE
|
|
+ select RT2X00_LIB_EEPROM
|
|
select RT2800_LIB
|
|
select RT2800_LIB_MMIO
|
|
help
|
|
@@ -259,6 +261,9 @@ config RT2X00_LIB_FIRMWARE
|
|
config RT2X00_LIB_CRYPTO
|
|
bool
|
|
|
|
+config RT2X00_LIB_EEPROM
|
|
+ bool
|
|
+
|
|
config RT2X00_LIB_LEDS
|
|
bool
|
|
default y if (RT2X00_LIB=y && LEDS_CLASS=y) || (RT2X00_LIB=m && LEDS_CLASS!=n)
|
|
--- a/drivers/net/wireless/ralink/rt2x00/Makefile
|
|
+++ b/drivers/net/wireless/ralink/rt2x00/Makefile
|
|
@@ -8,6 +8,7 @@ rt2x00lib-$(CPTCFG_RT2X00_LIB_DEBUGFS) +
|
|
rt2x00lib-$(CPTCFG_RT2X00_LIB_CRYPTO) += rt2x00crypto.o
|
|
rt2x00lib-$(CPTCFG_RT2X00_LIB_FIRMWARE) += rt2x00firmware.o
|
|
rt2x00lib-$(CPTCFG_RT2X00_LIB_LEDS) += rt2x00leds.o
|
|
+rt2x00lib-$(CPTCFG_RT2X00_LIB_EEPROM) += rt2x00eeprom.o
|
|
|
|
obj-$(CPTCFG_RT2X00_LIB) += rt2x00lib.o
|
|
obj-$(CPTCFG_RT2X00_LIB_MMIO) += rt2x00mmio.o
|
|
--- a/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
|
|
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
|
|
@@ -90,19 +90,6 @@ static int rt2800soc_set_device_state(st
|
|
return retval;
|
|
}
|
|
|
|
-static int rt2800soc_read_eeprom(struct rt2x00_dev *rt2x00dev)
|
|
-{
|
|
- void __iomem *base_addr = ioremap(0x1F040000, EEPROM_SIZE);
|
|
-
|
|
- if (!base_addr)
|
|
- return -ENOMEM;
|
|
-
|
|
- memcpy_fromio(rt2x00dev->eeprom, base_addr, EEPROM_SIZE);
|
|
-
|
|
- iounmap(base_addr);
|
|
- return 0;
|
|
-}
|
|
-
|
|
/* Firmware functions */
|
|
static char *rt2800soc_get_firmware_name(struct rt2x00_dev *rt2x00dev)
|
|
{
|
|
@@ -190,7 +177,7 @@ static const struct rt2800_ops rt2800soc
|
|
.register_multiread = rt2x00mmio_register_multiread,
|
|
.register_multiwrite = rt2x00mmio_register_multiwrite,
|
|
.regbusy_read = rt2x00mmio_regbusy_read,
|
|
- .read_eeprom = rt2800soc_read_eeprom,
|
|
+ .read_eeprom = rt2x00lib_read_eeprom,
|
|
.hwcrypt_disabled = rt2800soc_hwcrypt_disabled,
|
|
.drv_write_firmware = rt2800soc_write_firmware,
|
|
.drv_init_registers = rt2800mmio_init_registers,
|
|
@@ -304,6 +291,7 @@ static int rt2x00soc_probe(struct platfo
|
|
rt2x00dev->name = pdev->dev.driver->name;
|
|
rt2x00dev->csr.base = mem;
|
|
|
|
+ set_bit(REQUIRE_EEPROM_FILE, &rt2x00dev->cap_flags);
|
|
rt2x00_set_chip_intf(rt2x00dev, RT2X00_CHIP_INTF_SOC);
|
|
|
|
retval = rt2x00lib_probe_dev(rt2x00dev);
|
|
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
|
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
|
@@ -692,6 +692,7 @@ enum rt2x00_capability_flags {
|
|
REQUIRE_HT_TX_DESC,
|
|
REQUIRE_PS_AUTOWAKE,
|
|
REQUIRE_DELAYED_RFKILL,
|
|
+ REQUIRE_EEPROM_FILE,
|
|
|
|
/*
|
|
* Capabilities
|
|
@@ -1506,4 +1507,13 @@ void rt2x00lib_remove_dev(struct rt2x00_
|
|
int rt2x00lib_suspend(struct rt2x00_dev *rt2x00dev);
|
|
int rt2x00lib_resume(struct rt2x00_dev *rt2x00dev);
|
|
|
|
+/*
|
|
+ * EEPROM file handlers.
|
|
+ */
|
|
+#ifdef CPTCFG_RT2X00_LIB_EEPROM
|
|
+int rt2x00lib_read_eeprom(struct rt2x00_dev *rt2x00dev);
|
|
+#else
|
|
+#define rt2x00lib_read_eeprom NULL
|
|
+#endif /* CPTCFG_RT2X00_LIB_EEPROM */
|
|
+
|
|
#endif /* RT2X00_H */
|
|
--- /dev/null
|
|
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
|
|
@@ -0,0 +1,78 @@
|
|
+// SPDX-License-Identifier: GPL-2.0-or-later
|
|
+/* Copyright (C) 2004 - 2009 Ivo van Doorn <IvDoorn@gmail.com>
|
|
+ * Copyright (C) 2004 - 2009 Gertjan van Wingerde <gwingerde@gmail.com>
|
|
+ * <http://rt2x00.serialmonkey.com>
|
|
+ */
|
|
+
|
|
+/* Module: rt2x00lib
|
|
+ * Abstract: rt2x00 eeprom file loading routines.
|
|
+ */
|
|
+
|
|
+#include <linux/kernel.h>
|
|
+#include <linux/module.h>
|
|
+#include <linux/of.h>
|
|
+
|
|
+#include "rt2x00.h"
|
|
+
|
|
+static const char *
|
|
+rt2x00lib_get_eeprom_file_name(struct rt2x00_dev *rt2x00dev)
|
|
+{
|
|
+ struct device_node *np = rt2x00dev->dev->of_node;
|
|
+ const char *eep;
|
|
+
|
|
+ if (np && !of_property_read_string(np, "ralink,eeprom", &eep))
|
|
+ return eep;
|
|
+
|
|
+ return NULL;
|
|
+}
|
|
+
|
|
+static int rt2x00lib_read_eeprom_file(struct rt2x00_dev *rt2x00dev)
|
|
+{
|
|
+ const struct firmware *ee;
|
|
+ const char *ee_name;
|
|
+ int retval;
|
|
+
|
|
+ ee_name = rt2x00lib_get_eeprom_file_name(rt2x00dev);
|
|
+ if (!ee_name && test_bit(REQUIRE_EEPROM_FILE, &rt2x00dev->cap_flags)) {
|
|
+ rt2x00_err(rt2x00dev, "Required EEPROM name is missing.");
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
+ if (!ee_name)
|
|
+ return -ENOENT;
|
|
+
|
|
+ rt2x00_info(rt2x00dev, "Loading EEPROM data from '%s'.\n", ee_name);
|
|
+
|
|
+ retval = request_firmware(&ee, ee_name, rt2x00dev->dev);
|
|
+ if (retval) {
|
|
+ rt2x00_err(rt2x00dev, "Failed to request EEPROM.\n");
|
|
+ return retval;
|
|
+ }
|
|
+
|
|
+ if (!ee || !ee->size || !ee->data) {
|
|
+ rt2x00_err(rt2x00dev, "Failed to read EEPROM file.\n");
|
|
+ retval = -ENOENT;
|
|
+ goto err_exit;
|
|
+ }
|
|
+
|
|
+ if (ee->size != rt2x00dev->ops->eeprom_size) {
|
|
+ rt2x00_err(rt2x00dev,
|
|
+ "EEPROM file size is invalid, it should be %d bytes\n",
|
|
+ rt2x00dev->ops->eeprom_size);
|
|
+ retval = -EINVAL;
|
|
+ goto err_release_ee;
|
|
+ }
|
|
+
|
|
+ memcpy(rt2x00dev->eeprom, ee->data, rt2x00dev->ops->eeprom_size);
|
|
+
|
|
+err_release_ee:
|
|
+ release_firmware(ee);
|
|
+err_exit:
|
|
+ return retval;
|
|
+}
|
|
+
|
|
+int rt2x00lib_read_eeprom(struct rt2x00_dev *rt2x00dev)
|
|
+{
|
|
+ return rt2x00lib_read_eeprom_file(rt2x00dev);
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(rt2x00lib_read_eeprom);
|
|
--- a/drivers/net/wireless/ralink/rt2x00/rt2800pci.c
|
|
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800pci.c
|
|
@@ -278,6 +278,9 @@ static int rt2800pci_read_eeprom(struct
|
|
{
|
|
int retval;
|
|
|
|
+ if (!rt2x00lib_read_eeprom(rt2x00dev))
|
|
+ return 0;
|
|
+
|
|
if (rt2800pci_efuse_detect(rt2x00dev))
|
|
retval = rt2800pci_read_eeprom_efuse(rt2x00dev);
|
|
else
|