diff --git a/patches/openwrt/0010-mt76-import-MT7915-recovery-fixes.patch b/patches/openwrt/0008-mt76-import-MT7915-recovery-fixes.patch similarity index 100% rename from patches/openwrt/0010-mt76-import-MT7915-recovery-fixes.patch rename to patches/openwrt/0008-mt76-import-MT7915-recovery-fixes.patch diff --git a/patches/openwrt/0009-add-patch-for-flash-debugging.patch b/patches/openwrt/0009-add-patch-for-flash-debugging.patch new file mode 100644 index 0000000000000000000000000000000000000000..7d1f3e786232abee662b6c22c5079d7864e4df54 --- /dev/null +++ b/patches/openwrt/0009-add-patch-for-flash-debugging.patch @@ -0,0 +1,151 @@ +From: Nico <github@nicoboehr.de> +Date: Sun, 9 Mar 2025 11:05:38 +0000 +Subject: add patch for flash debugging + +diff --git a/target/linux/ath79/patches-6.6/910-flashdebug.patch b/target/linux/ath79/patches-6.6/910-flashdebug.patch +new file mode 100644 +index 0000000000000000000000000000000000000000..239cc92b973a8989ac65aa8ebd7447823b01ee6a +--- /dev/null ++++ b/target/linux/ath79/patches-6.6/910-flashdebug.patch +@@ -0,0 +1,141 @@ ++--- a/drivers/mtd/mtdcore.c +++++ b/drivers/mtd/mtdcore.c ++@@ -6,6 +6,7 @@ ++ * Copyright © 1999-2010 David Woodhouse <dwmw2@infradead.org> ++ * Copyright © 2006 Red Hat UK Limited ++ */ +++#define DEBUG ++ ++ #include <linux/module.h> ++ #include <linux/kernel.h> ++@@ -2299,20 +2300,29 @@ EXPORT_SYMBOL_GPL(mtd_lock); ++ int mtd_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len) ++ { ++ struct mtd_info *master = mtd_get_master(mtd); +++ int r; ++ ++- if (!master->_unlock) +++ if (!master->_unlock) { +++ printk("mtd: no unlock operation for %s\n", mtd->name); ++ return -EOPNOTSUPP; ++- if (ofs < 0 || ofs >= mtd->size || len > mtd->size - ofs) +++ } +++ if (ofs < 0 || ofs >= mtd->size || len > mtd->size - ofs) { +++ printk("mtd: unlock out of band for %s\n", mtd->name); ++ return -EINVAL; ++- if (!len) +++ } +++ if (!len) { +++ printk("mtd: zero length %s\n", mtd->name); ++ return 0; +++ } ++ ++ if (mtd->flags & MTD_SLC_ON_MLC_EMULATION) { ++ ofs = (loff_t)mtd_div_by_eb(ofs, mtd) * master->erasesize; ++ len = (u64)mtd_div_by_eb(len, mtd) * master->erasesize; ++ } ++ ++- return master->_unlock(master, mtd_get_master_ofs(mtd, ofs), len); +++ r = master->_unlock(master, mtd_get_master_ofs(mtd, ofs), len); +++ printk("mtd_unlock: %s return %d\n", mtd->name, r); +++ return r; ++ } ++ EXPORT_SYMBOL_GPL(mtd_unlock); ++ ++--- a/drivers/mtd/spi-nor/core.c +++++ b/drivers/mtd/spi-nor/core.c ++@@ -6,6 +6,7 @@ ++ * Copyright (C) 2005, Intec Automation Inc. ++ * Copyright (C) 2014, Freescale Semiconductor, Inc. ++ */ +++#define DEBUG ++ ++ #include <linux/err.h> ++ #include <linux/errno.h> ++--- a/fs/jffs2/build.c +++++ b/fs/jffs2/build.c ++@@ -119,12 +119,12 @@ static int jffs2_build_filesystem(struct ++ ++ if (c->flags & (1 << 7)) { ++ printk("%s(): unlocking the mtd device... ", __func__); ++- mtd_unlock(c->mtd, 0, c->mtd->size); ++- printk("done.\n"); +++ ret = mtd_unlock(c->mtd, 0, c->mtd->size); +++ printk("unlock done with ret=%d.\n", ret); ++ ++ printk("%s(): erasing all blocks after the end marker... ", __func__); ++- jffs2_erase_pending_blocks(c, -1); ++- printk("done.\n"); +++ ret = jffs2_erase_pending_blocks(c, -1); +++ printk("erase done with ret=%d.\n", ret); ++ } ++ ++ dbg_fsbuild("pass 1 starting\n"); ++--- a/drivers/mtd/spi-nor/swp.c +++++ b/drivers/mtd/spi-nor/swp.c ++@@ -253,15 +253,21 @@ static int spi_nor_sr_unlock(struct spi_ ++ bool can_be_top = true, can_be_bottom = nor->flags & SNOR_F_HAS_SR_TB; ++ bool use_top; ++ +++ printk("nor->flags = %x\n", nor->flags); +++ ++ ret = spi_nor_read_sr(nor, nor->bouncebuf); ++- if (ret) +++ if (ret) { +++ printk("spi_nor_sr_unlock: spi_no_read_sr() failed with %d\n", ret); ++ return ret; +++ } ++ ++ status_old = nor->bouncebuf[0]; ++ ++ /* If nothing in our range is locked, we don't need to do anything */ ++- if (spi_nor_is_unlocked_sr(nor, ofs, len, status_old)) +++ if (spi_nor_is_unlocked_sr(nor, ofs, len, status_old)) { +++ printk("spi_nor_sr_unlock: already unlocked"); ++ return 0; +++ } ++ ++ /* If anything below us is locked, we can't use 'top' protection */ ++ if (!spi_nor_is_unlocked_sr(nor, 0, ofs, status_old)) ++@@ -272,8 +278,10 @@ static int spi_nor_sr_unlock(struct spi_ ++ status_old)) ++ can_be_bottom = false; ++ ++- if (!can_be_bottom && !can_be_top) +++ if (!can_be_bottom && !can_be_top) { +++ printk("spi_nor_sr_unlock: ofs=%lld len=%llu mtd->size=%llu\n", ofs, len, mtd->size); ++ return -EINVAL; +++ } ++ ++ /* Prefer top, if both are valid */ ++ use_top = can_be_top; ++@@ -295,8 +303,10 @@ static int spi_nor_sr_unlock(struct spi_ ++ val = (val & ~SR_BP3) | SR_BP3_BIT6; ++ ++ /* Some power-of-two sizes are not supported */ ++- if (val & ~mask) +++ if (val & ~mask) { +++ printk("spi_nor_sr_unlock: unsupported power of two: val=%x mask=%x\n", val, mask); ++ return -EINVAL; +++ } ++ } ++ ++ status_new = (status_old & ~mask & ~tb_mask) | val; ++@@ -313,10 +323,15 @@ static int spi_nor_sr_unlock(struct spi_ ++ return 0; ++ ++ /* Only modify protection if it will not lock other areas */ ++- if ((status_new & mask) > (status_old & mask)) +++ if ((status_new & mask) > (status_old & mask)) { +++ printk("spi_nor_sr_unlock: status_new=%x status_old=%x\n", status_new, status_old); ++ return -EINVAL; +++ } ++ ++- return spi_nor_write_sr_and_check(nor, status_new); +++ ret = spi_nor_write_sr_and_check(nor, status_new); +++ if (ret) +++ printk("spi_nor_sr_unlock: spi_nor_write_sr_and_check failed with %d\n", ret); +++ return ret; ++ } ++ ++ /*