When EEPROM is loaded from mtd, removing the rt2x00 module triggers a
kernel oops. The reason for the oops is that release_firmware() is
always called from rt2x00lib_free_eeprom_file(). release_firmware()
frees the memory allocated by request_firmware(), which is called when
EEPROM is loaded from file. However, when loaded from mtd, no memory is
allocated for the EEPROM (and the firwmware subsystem is not used
either).

The best indication I could think of for if EEPROM is loaded from file
or mtd, is to check for the "ralink,mtd-eeprom" property. At least on
the devices I have access to and where this property is set, EEPROM is
only available from mtd.

Signed-off-by: Kristian Evensen <kristian.even...@gmail.com>
---
 ...om-on-SoC-from-a-mtd-device-defines-.patch | 34 ++++++++++++++++---
 1 file changed, 29 insertions(+), 5 deletions(-)

diff --git 
a/package/kernel/mac80211/patches/rt2x00/604-rt2x00-load-eeprom-on-SoC-from-a-mtd-device-defines-.patch
 
b/package/kernel/mac80211/patches/rt2x00/604-rt2x00-load-eeprom-on-SoC-from-a-mtd-device-defines-.patch
index a98b49c541..0362dd10f5 100644
--- 
a/package/kernel/mac80211/patches/rt2x00/604-rt2x00-load-eeprom-on-SoC-from-a-mtd-device-defines-.patch
+++ 
b/package/kernel/mac80211/patches/rt2x00/604-rt2x00-load-eeprom-on-SoC-from-a-mtd-device-defines-.patch
@@ -1,4 +1,4 @@
-From 339fe73f340161a624cc08e738d2244814852c3e Mon Sep 17 00:00:00 2001
+From b5e9327001bf4a859d2645442640c5f8ab77be07 Mon Sep 17 00:00:00 2001
 From: John Crispin <blo...@openwrt.org>
 Date: Sun, 17 Mar 2013 00:55:04 +0100
 Subject: [PATCH] rt2x00: load eeprom on SoC from a mtd device defines inside
@@ -6,10 +6,12 @@ Subject: [PATCH] rt2x00: load eeprom on SoC from a mtd device 
defines inside
 
 Signed-off-by: John Crispin <blo...@openwrt.org>
 ---
- 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 | 75 +++++++++++++++++++
+ 2 files changed, 76 insertions(+)
 
+diff --git a/drivers/net/wireless/ralink/rt2x00/Kconfig 
b/drivers/net/wireless/ralink/rt2x00/Kconfig
+index 39fdaaf..2e836d8 100644
 --- a/drivers/net/wireless/ralink/rt2x00/Kconfig
 +++ b/drivers/net/wireless/ralink/rt2x00/Kconfig
 @@ -219,6 +219,7 @@ config RT2800SOC
@@ -20,6 +22,8 @@ Signed-off-by: John Crispin <blo...@openwrt.org>
        ---help---
          This adds support for Ralink WiSoC devices.
          Supported chips: RT2880, RT3050, RT3052, RT3350, RT3352.
+diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c 
b/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
+index 1a30f9c..404a1f7 100644
 --- a/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
 +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
 @@ -26,11 +26,73 @@
@@ -96,7 +100,7 @@ Signed-off-by: John Crispin <blo...@openwrt.org>
  static const char *
  rt2x00lib_get_eeprom_file_name(struct rt2x00_dev *rt2x00dev)
  {
-@@ -58,6 +120,9 @@ static int rt2x00lib_request_eeprom_file
+@@ -58,6 +120,9 @@ static int rt2x00lib_request_eeprom_file(struct rt2x00_dev 
*rt2x00dev)
        const char *ee_name;
        int retval;
  
@@ -106,3 +110,23 @@ Signed-off-by: John Crispin <blo...@openwrt.org>
        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.");
+@@ -111,6 +176,16 @@ int rt2x00lib_load_eeprom_file(struct rt2x00_dev 
*rt2x00dev)
+ 
+ void rt2x00lib_free_eeprom_file(struct rt2x00_dev *rt2x00dev)
+ {
++#ifdef CONFIG_OF
++      struct device_node *np = rt2x00dev->dev->of_node;
++      int size;
++
++      if (np && of_get_property(np, "ralink,mtd-eeprom", &size)) {
++              rt2x00dev->eeprom_file = NULL;
++              return;
++      }
++#endif
++
+       release_firmware(rt2x00dev->eeprom_file);
+       rt2x00dev->eeprom_file = NULL;
+ }
+-- 
+2.19.1
+
-- 
2.19.1


_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to