]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
mac80211: rt2x00: improve EEPROM load patches
authorChristian Marangi <ansuelsmth@gmail.com>
Sun, 15 Oct 2023 14:07:22 +0000 (16:07 +0200)
committerChristian Marangi <ansuelsmth@gmail.com>
Mon, 16 Oct 2023 12:16:55 +0000 (14:16 +0200)
Improve EEPROME load patches. Reorganize and rework them.

The current patch are bugged and with the case of MTD loading, leaks and
never free the EEPROM read values.

Also add support for loading EEPROM using NVMEM cells.

As a cleanup, change the binding to swap EEPROM read from mtd to
ralink,eeprom-swap and generilize it.

Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
package/kernel/mac80211/patches/rt2x00/602-01-wifi-rt2x00-Add-support-for-loading-EEPROM-from-user.patch [moved from package/kernel/mac80211/patches/rt2x00/602-rt2x00-introduce-rt2x00eeprom.patch with 54% similarity]
package/kernel/mac80211/patches/rt2x00/602-02-wifi-rt2x00-Add-option-to-pass-EEPROM-file-name-from.patch [new file with mode: 0644]
package/kernel/mac80211/patches/rt2x00/602-03-wifi-rt2x00-Add-support-for-loading-EEPROM-from-MTD.patch [moved from package/kernel/mac80211/patches/rt2x00/604-rt2x00-load-eeprom-on-SoC-from-a-mtd-device-defines-.patch with 63% similarity]
package/kernel/mac80211/patches/rt2x00/602-04-wifi-rt2x00-Support-EEPROM-swap-binding.patch [new file with mode: 0644]
package/kernel/mac80211/patches/rt2x00/602-05-wifi-rt2x00-support-loading-eeprom-from-NVMEM-cells.patch [new file with mode: 0644]
package/kernel/mac80211/patches/rt2x00/603-rt2x00-of_load_eeprom_filename.patch [deleted file]
package/kernel/mac80211/patches/rt2x00/609-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch
package/kernel/mac80211/patches/rt2x00/994-rt2x00-import-support-for-external-LNA-on-MT7620.patch
package/kernel/mac80211/patches/rt2x00/995-rt2x00-mt7620-introduce-accessors-for-CHIP_VER-register.patch
package/kernel/mac80211/patches/rt2x00/998-wifi-rt2x00-rework-MT7620-PA-LNA-RF-calibration.patch

similarity index 54%
rename from package/kernel/mac80211/patches/rt2x00/602-rt2x00-introduce-rt2x00eeprom.patch
rename to package/kernel/mac80211/patches/rt2x00/602-01-wifi-rt2x00-Add-support-for-loading-EEPROM-from-user.patch
index 6ef356516fb03fed7a7e221d4d4cf04f6cd2d82e..5040b5af621ea10a15616775e0657725199f08c9 100644 (file)
@@ -1,3 +1,24 @@
+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/rt2x00soc.c    |  1 +
+ .../net/wireless/ralink/rt2x00/rt2x00soc.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
 @@ -350,6 +350,7 @@ RT2X00_LIB_FIRMWARE=
  
  obj-$(CPTCFG_RT2X00_LIB)              += rt2x00lib.o
  obj-$(CPTCFG_RT2X00_LIB_MMIO)         += rt2x00mmio.o
---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
-+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
-@@ -47,6 +47,8 @@ struct rt2800_drv_data {
-       struct ieee80211_sta *wcid_to_sta[STA_IDS_SIZE];
- };
-+#include "rt2800.h"
-+
- struct rt2800_ops {
-       u32 (*register_read)(struct rt2x00_dev *rt2x00dev,
-                             const unsigned int offset);
-@@ -145,6 +147,15 @@ static inline int rt2800_read_eeprom(str
- {
-       const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
-+      if (rt2x00dev->eeprom_file) {
-+              memcpy(rt2x00dev->eeprom, rt2x00dev->eeprom_file->data,
-+                     EEPROM_SIZE);
-+              return 0;
-+      }
-+
-+      if (!rt2800ops->read_eeprom)
-+              return -EINVAL;
-+
-       return rt2800ops->read_eeprom(rt2x00dev);
- }
 --- 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
  /* Firmware functions */
  static char *rt2800soc_get_firmware_name(struct rt2x00_dev *rt2x00dev)
  {
-@@ -168,7 +155,6 @@ static const struct rt2800_ops rt2800soc
+@@ -168,7 +155,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,
  
        /*
         * Capabilities
-@@ -980,6 +981,11 @@ struct rt2x00_dev {
-       const struct firmware *fw;
-       /*
-+       * EEPROM image.
-+       */
-+      const struct firmware *eeprom_file;
-+
-+      /*
-        * FIFO for storing tx status reports between isr and tasklet.
-        */
-       DECLARE_KFIFO_PTR(txstatus_fifo, u32);
---- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
-+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
-@@ -1420,6 +1420,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de
-       INIT_DELAYED_WORK(&rt2x00dev->autowakeup_work, rt2x00lib_autowakeup);
-       INIT_WORK(&rt2x00dev->sleep_work, rt2x00lib_sleep);
-+      retval = rt2x00lib_load_eeprom_file(rt2x00dev);
-+      if (retval)
-+              goto exit;
-+
-       /*
-        * Let the driver probe the device to detect the capabilities.
-        */
-@@ -1560,6 +1564,11 @@ void rt2x00lib_remove_dev(struct rt2x00_
-        * Free the driver data.
-        */
-       kfree(rt2x00dev->drv_data);
-+
-+      /*
-+       * Free EEPROM image.
-+       */
-+      rt2x00lib_free_eeprom_file(rt2x00dev);
- }
- EXPORT_SYMBOL_GPL(rt2x00lib_remove_dev);
 --- /dev/null
 +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
-@@ -0,0 +1,106 @@
-+/*
-+      Copyright (C) 2004 - 2009 Ivo van Doorn <IvDoorn@gmail.com>
-+      Copyright (C) 2004 - 2009 Gertjan van Wingerde <gwingerde@gmail.com>
-+      <http://rt2x00.serialmonkey.com>
-+
-+      This program is free software; you can redistribute it and/or modify
-+      it under the terms of the GNU General Public License as published by
-+      the Free Software Foundation; either version 2 of the License, or
-+      (at your option) any later version.
-+
-+      This program is distributed in the hope that it will be useful,
-+      but WITHOUT ANY WARRANTY; without even the implied warranty of
-+      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+      GNU General Public License for more details.
-+
-+      You should have received a copy of the GNU General Public License
-+      along with this program; if not, write to the
-+      Free Software Foundation, Inc.,
-+      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+@@ -0,0 +1,77 @@
++// 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.
++/*    Module: rt2x00lib
++ *    Abstract: rt2x00 eeprom file loading routines.
 + */
 +
 +#include <linux/kernel.h>
 +#include <linux/module.h>
 +
 +#include "rt2x00.h"
-+#include "rt2x00lib.h"
++#include "rt2x00soc.h"
 +
 +static const char *
 +rt2x00lib_get_eeprom_file_name(struct rt2x00_dev *rt2x00dev)
 +      return NULL;
 +}
 +
-+static int rt2x00lib_request_eeprom_file(struct rt2x00_dev *rt2x00dev)
++static int rt2x00lib_read_eeprom_file(struct rt2x00_dev *rt2x00dev)
 +{
 +      const struct firmware *ee;
 +      const char *ee_name;
 +              goto err_release_ee;
 +      }
 +
-+      rt2x00dev->eeprom_file = ee;
-+      return 0;
++      memcpy(rt2x00dev->eeprom, ee->data, rt2x00dev->ops->eeprom_size);
 +
 +err_release_ee:
 +      release_firmware(ee);
 +      return retval;
 +}
 +
-+int rt2x00lib_load_eeprom_file(struct rt2x00_dev *rt2x00dev)
-+{
-+      int retval;
-+
-+      retval = rt2x00lib_request_eeprom_file(rt2x00dev);
-+      if (retval)
-+              return retval;
-+
-+      return 0;
-+}
-+
-+void rt2x00lib_free_eeprom_file(struct rt2x00_dev *rt2x00dev)
-+{
-+      if (rt2x00dev->eeprom_file && rt2x00dev->eeprom_file->size)
-+              release_firmware(rt2x00dev->eeprom_file);
-+      rt2x00dev->eeprom_file = NULL;
-+}
---- a/drivers/net/wireless/ralink/rt2x00/rt2x00lib.h
-+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00lib.h
-@@ -286,6 +286,22 @@ static inline void rt2x00lib_free_firmwa
- #endif /* CPTCFG_RT2X00_LIB_FIRMWARE */
- /*
-+ * EEPROM file handlers.
-+ */
-+#ifdef CPTCFG_RT2X00_LIB_EEPROM
-+int rt2x00lib_load_eeprom_file(struct rt2x00_dev *rt2x00dev);
-+void rt2x00lib_free_eeprom_file(struct rt2x00_dev *rt2x00dev);
-+#else
-+static inline int rt2x00lib_load_eeprom_file(struct rt2x00_dev *rt2x00dev)
++int rt2x00lib_read_eeprom(struct rt2x00_dev *rt2x00dev)
 +{
-+      return 0;
++      return rt2x00lib_read_eeprom_file(rt2x00dev);
 +}
-+static inline void rt2x00lib_free_eeprom_file(struct rt2x00_dev *rt2x00dev)
-+{
-+}
-+#endif /* CPTCFG_RT2X00_LIB_EEPROM */
-+
-+/*
-  * Debugfs handlers.
-  */
- #ifdef CPTCFG_RT2X00_LIB_DEBUGFS
++EXPORT_SYMBOL_GPL(rt2x00lib_read_eeprom);
 --- a/drivers/net/wireless/ralink/rt2x00/rt2x00soc.c
 +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00soc.c
 @@ -86,6 +86,7 @@ int rt2x00soc_probe(struct platform_devi
        rt2x00_set_chip_intf(rt2x00dev, RT2X00_CHIP_INTF_SOC);
  
        retval = rt2x00soc_alloc_reg(rt2x00dev);
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00soc.h
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00soc.h
+@@ -26,4 +26,13 @@ int rt2x00soc_resume(struct platform_dev
+ #define rt2x00soc_resume      NULL
+ #endif /* CONFIG_PM */
++/*
++ * 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 /* RT2X00SOC_H */
diff --git a/package/kernel/mac80211/patches/rt2x00/602-02-wifi-rt2x00-Add-option-to-pass-EEPROM-file-name-from.patch b/package/kernel/mac80211/patches/rt2x00/602-02-wifi-rt2x00-Add-option-to-pass-EEPROM-file-name-from.patch
new file mode 100644 (file)
index 0000000..90055b9
--- /dev/null
@@ -0,0 +1,43 @@
+From 15329d8b206d9c04ffad49aecd37f5d0bfb85768 Mon Sep 17 00:00:00 2001
+From: Christian Marangi <ansuelsmth@gmail.com>
+Date: Sun, 15 Oct 2023 14:23:19 +0200
+Subject: [PATCH 2/5] wifi: rt2x00: Add option to pass EEPROM file name from DT
+
+Add option to pass EEPROM file name from DT using ralink,eeprom binding.
+
+Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
+---
+ drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
+@@ -10,6 +10,7 @@
+ #include <linux/kernel.h>
+ #include <linux/module.h>
++#include <linux/of.h>
+ #include "rt2x00.h"
+ #include "rt2x00soc.h"
+@@ -18,10 +19,20 @@ static const char *
+ rt2x00lib_get_eeprom_file_name(struct rt2x00_dev *rt2x00dev)
+ {
+       struct rt2x00_platform_data *pdata = rt2x00dev->dev->platform_data;
++#ifdef CONFIG_OF
++      struct device_node *np;
++      const char *eep;
++#endif
+       if (pdata && pdata->eeprom_file_name)
+               return pdata->eeprom_file_name;
++#ifdef CONFIG_OF
++      np = rt2x00dev->dev->of_node;
++      if (np && !of_property_read_string(np, "ralink,eeprom", &eep))
++              return eep;
++#endif
++
+       return NULL;
+ }
similarity index 63%
rename from package/kernel/mac80211/patches/rt2x00/604-rt2x00-load-eeprom-on-SoC-from-a-mtd-device-defines-.patch
rename to package/kernel/mac80211/patches/rt2x00/602-03-wifi-rt2x00-Add-support-for-loading-EEPROM-from-MTD.patch
index 7338eb15b20e91893b4778195728b9e6d57e7cd6..6a343db9c728d7922749d8903f6b722894403d03 100644 (file)
@@ -1,14 +1,16 @@
-From 339fe73f340161a624cc08e738d2244814852c3e Mon Sep 17 00:00:00 2001
+From 71261ca81b491a4c3b08690347c12e96a75ad0d0 Mon Sep 17 00:00:00 2001
 From: John Crispin <blogic@openwrt.org>
 Date: Sun, 17 Mar 2013 00:55:04 +0100
-Subject: [PATCH] rt2x00: load eeprom on SoC from a mtd device defines inside
- OF
+Subject: [PATCH 3/5] wifi: rt2x00: Add support for loading EEPROM from MTD
+
+Add support for loading EEPROM from MTD.
 
 Signed-off-by: John Crispin <blogic@openwrt.org>
+Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
 ---
- drivers/net/wireless/ralink/rt2x00/Kconfig        |  1 +
drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c | 65 +++++++++++++++++++++++
- 2 files changed, 66 insertions(+)
+ drivers/net/wireless/ralink/rt2x00/Kconfig    |  1 +
.../net/wireless/ralink/rt2x00/rt2x00eeprom.c | 66 +++++++++++++++++++
+ 2 files changed, 67 insertions(+)
 
 --- a/drivers/net/wireless/ralink/rt2x00/Kconfig
 +++ b/drivers/net/wireless/ralink/rt2x00/Kconfig
@@ -22,7 +24,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
          Supported chips: RT2880, RT3050, RT3052, RT3350, RT3352.
 --- a/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
 +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
-@@ -26,11 +26,76 @@
+@@ -10,11 +10,69 @@
  
  #include <linux/kernel.h>
  #include <linux/module.h>
@@ -33,21 +35,20 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
  #include <linux/of.h>
  
  #include "rt2x00.h"
- #include "rt2x00lib.h"
+ #include "rt2x00soc.h"
  
 +#if IS_ENABLED(CONFIG_MTD)
 +static int rt2800lib_read_eeprom_mtd(struct rt2x00_dev *rt2x00dev)
 +{
 +      int ret = -EINVAL;
 +#ifdef CONFIG_OF
-+      static struct firmware mtd_fw;
 +      struct device_node *np = rt2x00dev->dev->of_node, *mtd_np = NULL;
-+      size_t retlen, len = rt2x00dev->ops->eeprom_size;
-+      int i, size, offset = 0;
++      int size, offset = 0;
 +      struct mtd_info *mtd;
 +      const char *part;
 +      const __be32 *list;
 +      phandle phandle;
++      size_t retlen;
 +
 +      list = of_get_property(np, "ralink,mtd-eeprom", &size);
 +      if (!list)
@@ -74,21 +75,15 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
 +      if (size > sizeof(*list))
 +              offset = be32_to_cpup(list);
 +
-+      ret = mtd_read(mtd, offset, len, &retlen, (u_char *) rt2x00dev->eeprom);
++      ret = mtd_read(mtd, offset, rt2x00dev->ops->eeprom_size,
++                     &retlen, (u_char *)rt2x00dev->eeprom);
 +      put_mtd_device(mtd);
 +
-+      if ((retlen != rt2x00dev->ops->eeprom_size) || ret) {
++      if (retlen != rt2x00dev->ops->eeprom_size || ret) {
 +              dev_err(rt2x00dev->dev, "failed to load eeprom from device \"%s\"\n", part);
 +              return ret;
 +      }
 +
-+      if (of_find_property(np, "ralink,mtd-eeprom-swap", NULL))
-+              for (i = 0; i < len/sizeof(u16); i++)
-+                      rt2x00dev->eeprom[i] = swab16(rt2x00dev->eeprom[i]);
-+
-+      rt2x00dev->eeprom_file = &mtd_fw;
-+      mtd_fw.data = (const u8 *) rt2x00dev->eeprom;
-+
 +      dev_info(rt2x00dev->dev, "loaded eeprom from mtd device \"%s\"\n", part);
 +#endif
 +
@@ -99,15 +94,17 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
  static const char *
  rt2x00lib_get_eeprom_file_name(struct rt2x00_dev *rt2x00dev)
  {
-@@ -58,6 +123,11 @@ static int rt2x00lib_request_eeprom_file
-       const char *ee_name;
-       int retval;
+@@ -83,5 +141,13 @@ err_exit:
  
+ int rt2x00lib_read_eeprom(struct rt2x00_dev *rt2x00dev)
+ {
++      int ret;
++
 +#if IS_ENABLED(CONFIG_MTD)
-+      if (!rt2800lib_read_eeprom_mtd(rt2x00dev))
++      ret = rt2800lib_read_eeprom_mtd(rt2x00dev);
++      if (!ret)
 +              return 0;
 +#endif
 +
-       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 rt2x00lib_read_eeprom_file(rt2x00dev);
+ }
diff --git a/package/kernel/mac80211/patches/rt2x00/602-04-wifi-rt2x00-Support-EEPROM-swap-binding.patch b/package/kernel/mac80211/patches/rt2x00/602-04-wifi-rt2x00-Support-EEPROM-swap-binding.patch
new file mode 100644 (file)
index 0000000..392910d
--- /dev/null
@@ -0,0 +1,44 @@
+From 9c9a3c27b96e057f3c3f47151d7a170d84e3bb5f Mon Sep 17 00:00:00 2001
+From: Christian Marangi <ansuelsmth@gmail.com>
+Date: Sun, 15 Oct 2023 15:31:47 +0200
+Subject: [PATCH 4/5] wifi: rt2x00: Support EEPROM swap binding
+
+Add binding "ralink,eeprom-swap" to swap bytes of EEPROM before using
+it.
+
+Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
+---
+ drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c | 15 +++++++++++++++
+ 1 file changed, 15 insertions(+)
+
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
+@@ -20,6 +20,19 @@
+ #include "rt2x00soc.h"
+ #if IS_ENABLED(CONFIG_MTD)
++static void rt2800lib_eeprom_swap(struct rt2x00_dev *rt2x00dev)
++{
++      struct device_node *np = rt2x00dev->dev->of_node;
++      size_t len = rt2x00dev->ops->eeprom_size;
++      int i;
++
++      if (!of_find_property(np, "ralink,eeprom-swap", NULL))
++              return;
++
++      for (i = 0; i < len / sizeof(u16); i++)
++              rt2x00dev->eeprom[i] = swab16(rt2x00dev->eeprom[i]);
++}
++
+ static int rt2800lib_read_eeprom_mtd(struct rt2x00_dev *rt2x00dev)
+ {
+       int ret = -EINVAL;
+@@ -66,6 +79,8 @@ static int rt2800lib_read_eeprom_mtd(str
+               return ret;
+       }
++      rt2800lib_eeprom_swap(rt2x00dev);
++
+       dev_info(rt2x00dev->dev, "loaded eeprom from mtd device \"%s\"\n", part);
+ #endif
diff --git a/package/kernel/mac80211/patches/rt2x00/602-05-wifi-rt2x00-support-loading-eeprom-from-NVMEM-cells.patch b/package/kernel/mac80211/patches/rt2x00/602-05-wifi-rt2x00-support-loading-eeprom-from-NVMEM-cells.patch
new file mode 100644 (file)
index 0000000..efe6e52
--- /dev/null
@@ -0,0 +1,96 @@
+From 9008cdacdc41f8233f4444b86cf3a17201686e2d Mon Sep 17 00:00:00 2001
+From: Shiji Yang <yangshiji66@outlook.com>
+Date: Tue, 18 Jul 2023 20:18:16 +0800
+Subject: [PATCH 5/5] wifi: rt2x00: support loading eeprom from NVMEM cells
+
+This patch allows rt2x00 to load eeprom from "eeprom" NVMEM cell.
+
+Example:
+
+/* load eeprom from NVMEM provider 'eep' */
+&wmac {
+       nvmem-cells = <&eep>;
+       nvmem-cell-names = "eeprom";
+};
+
+Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
+Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
+---
+ .../net/wireless/ralink/rt2x00/rt2x00eeprom.c | 41 ++++++++++++++++++-
+ 1 file changed, 40 insertions(+), 1 deletion(-)
+
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
+@@ -14,12 +14,12 @@
+ #include <linux/mtd/mtd.h>
+ #include <linux/mtd/partitions.h>
+ #endif
++#include <linux/nvmem-consumer.h>
+ #include <linux/of.h>
+ #include "rt2x00.h"
+ #include "rt2x00soc.h"
+-#if IS_ENABLED(CONFIG_MTD)
+ static void rt2800lib_eeprom_swap(struct rt2x00_dev *rt2x00dev)
+ {
+       struct device_node *np = rt2x00dev->dev->of_node;
+@@ -33,6 +33,7 @@ static void rt2800lib_eeprom_swap(struct
+               rt2x00dev->eeprom[i] = swab16(rt2x00dev->eeprom[i]);
+ }
++#if IS_ENABLED(CONFIG_MTD)
+ static int rt2800lib_read_eeprom_mtd(struct rt2x00_dev *rt2x00dev)
+ {
+       int ret = -EINVAL;
+@@ -88,6 +89,40 @@ static int rt2800lib_read_eeprom_mtd(str
+ }
+ #endif
++static int rt2800lib_read_eeprom_nvmem(struct rt2x00_dev *rt2x00dev)
++{
++      struct device_node *np = rt2x00dev->dev->of_node;
++      unsigned int len = rt2x00dev->ops->eeprom_size;
++      struct nvmem_cell *cell;
++      const void *data;
++      size_t retlen;
++      int ret = 0;
++
++      cell = of_nvmem_cell_get(np, "eeprom");
++      if (IS_ERR(cell))
++              return PTR_ERR(cell);
++
++      data = nvmem_cell_read(cell, &retlen);
++      nvmem_cell_put(cell);
++
++      if (IS_ERR(data))
++              return PTR_ERR(data);
++
++      if (retlen != len) {
++              dev_err(rt2x00dev->dev, "invalid eeprom size, required: 0x%04x\n", len);
++              ret = -EINVAL;
++              goto exit;
++      }
++
++      memcpy(rt2x00dev->eeprom, data, len);
++
++      rt2800lib_eeprom_swap(rt2x00dev);
++
++exit:
++      kfree(data);
++      return ret;
++}
++
+ static const char *
+ rt2x00lib_get_eeprom_file_name(struct rt2x00_dev *rt2x00dev)
+ {
+@@ -164,5 +199,9 @@ int rt2x00lib_read_eeprom(struct rt2x00_
+               return 0;
+ #endif
++      ret = rt2800lib_read_eeprom_nvmem(rt2x00dev);
++      if (!ret)
++              return 0;
++
+       return rt2x00lib_read_eeprom_file(rt2x00dev);
+ }
diff --git a/package/kernel/mac80211/patches/rt2x00/603-rt2x00-of_load_eeprom_filename.patch b/package/kernel/mac80211/patches/rt2x00/603-rt2x00-of_load_eeprom_filename.patch
deleted file mode 100644 (file)
index 431e090..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
---- a/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
-+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
-@@ -26,6 +26,7 @@
- #include <linux/kernel.h>
- #include <linux/module.h>
-+#include <linux/of.h>
- #include "rt2x00.h"
- #include "rt2x00lib.h"
-@@ -34,10 +35,20 @@ static const char *
- rt2x00lib_get_eeprom_file_name(struct rt2x00_dev *rt2x00dev)
- {
-       struct rt2x00_platform_data *pdata = rt2x00dev->dev->platform_data;
-+#ifdef CONFIG_OF
-+      struct device_node *np;
-+      const char *eep;
-+#endif
-       if (pdata && pdata->eeprom_file_name)
-               return pdata->eeprom_file_name;
-+#ifdef CONFIG_OF
-+      np = rt2x00dev->dev->of_node;
-+      if (np && of_property_read_string(np, "ralink,eeprom", &eep) == 0)
-+          return eep;
-+#endif
-+
-       return NULL;
- }
index 8964f8bf1057b6bca96c6e458d998147e9b85956..c06ed07030e753b4cfb212914f29690d324018df 100644 (file)
@@ -13,7 +13,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
 
 --- a/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
 +++ b/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
-@@ -225,10 +225,17 @@ static int rt2800soc_probe(struct platfo
+@@ -226,10 +226,17 @@ static int rt2800soc_probe(struct platfo
        return rt2x00soc_probe(pdev, &rt2800soc_ops);
  }
  
index 4bb1cf424829aa446d20c8a895d47f95f9ef83b7..634b677722f82fbe473634b877955777dd4ef93d 100644 (file)
@@ -123,7 +123,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
  #include <linux/rt2x00_platform.h>
  
  #include <net/mac80211.h>
-@@ -1029,6 +1030,11 @@ struct rt2x00_dev {
+@@ -1024,6 +1025,11 @@ struct rt2x00_dev {
  
        /* Clock for System On Chip devices. */
        struct clk *clk;
index 97a56de2b3d844b3799174d63aa56613085a0128..19f1edc928bce94e7f5352a0d8bac80b32341edb 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
 +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
-@@ -78,6 +78,9 @@ struct rt2800_ops {
+@@ -76,6 +76,9 @@ struct rt2800_ops {
        int (*drv_init_registers)(struct rt2x00_dev *rt2x00dev);
        __le32 *(*drv_get_txwi)(struct queue_entry *entry);
        unsigned int (*drv_get_dma_done)(struct data_queue *queue);
@@ -10,7 +10,7 @@
  };
  
  static inline u32 rt2800_register_read(struct rt2x00_dev *rt2x00dev,
-@@ -195,6 +198,27 @@ static inline unsigned int rt2800_drv_ge
+@@ -184,6 +187,27 @@ static inline unsigned int rt2800_drv_ge
        return rt2800ops->drv_get_dma_done(queue);
  }
  
  static const struct ieee80211_ops rt2800soc_mac80211_ops = {
        .tx                     = rt2x00mac_tx,
        .wake_tx_queue          = ieee80211_handle_wake_tx_queue,
-@@ -160,6 +187,9 @@ static const struct rt2800_ops rt2800soc
+@@ -161,6 +188,9 @@ static const struct rt2800_ops rt2800soc
        .drv_init_registers     = rt2800mmio_init_registers,
        .drv_get_txwi           = rt2800mmio_get_txwi,
        .drv_get_dma_done       = rt2800mmio_get_dma_done,
index ca1da8a8d28b1635877dc4d65389b8128fa95ed1..1eb5ee8aa0fad1e7efb071030836deb17db5ab32 100644 (file)
@@ -398,7 +398,7 @@ Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
             rt2x00_rt(rt2x00dev, RT3071) ||
 --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
-@@ -1277,6 +1277,12 @@ rt2x00_has_cap_external_lna_bg(struct rt
+@@ -1272,6 +1272,12 @@ rt2x00_has_cap_external_lna_bg(struct rt
  }
  
  static inline bool