immortalwrt/target/linux
Shane Synan dce4054e34 ipq806x: revert SDC clock changes for NBG6817 MMC
Revert the SDC "CLK_SET_RATE_GATE" changes to the SDC clock regulator
structures.

See https://elinux.org/images/b/b8/Elc2013_Clement.pdf
> if ((clk->flags & CLK_SET_RATE_GATE) && clk->prepare_count) {
>
> For this particular clock, setting its rate is possible only if the
> clock is ungated (not yet prepared)

This fixes the MMC failing to initialize on newer ZyXEL NBG6817
hardware revisions with Kingston MMC.  Older revisions should
hopefully be unaffected.

Check MMC hardware details with:
cd /sys/block/mmcblk0/device/ && \
  tail -v cid date name manfid fwrev hwrev oemid rev

Known problematic MMC names (broken before this commit):
* M62704 (dated 12/2018) via myself
* M62704 (dated 11/2018) via Drake Stefani

Known unaffected MMC names (already working without this commit):
* S10004 (dated 12/2015) via slh

Without enabling dynamic debugging, this error manifests in the kernel
hardware serial console as the following:

[    2.746605] mmc0: error -110 whilst initialising MMC card
[…trimmed other messages…]
[    2.877832] Waiting for root device /dev/mmcblk0p5...

Enabling Linux dynamic kernel debugging provides additional messages.
For guidance, see the Linux kernel documentation:
https://www.kernel.org/doc/html/latest/admin-guide/dynamic-debug-howto.html

First, enable dynamic debugging in OpenWRT's configuration:

1.  Run "make menuconfig"

2.  Select "Global build settings --->"

3.  Select "Kernel build options --->"

4.  Enable "Compile the kernel with dynamic printk" via spacebar

5.  Save and exit (arrow key to "Exit" until prompted to save, save)

Alternatively, set "CONFIG_KERNEL_DYNAMIC_DEBUG=y" in your .config.

Then, turn on dynamic debugging at boot:

Modify bootargs in
target/linux/ipq806x/files/arch/arm/boot/dts/qcom-ipq8065-nbg6817.dts
to add…

bootargs = "[…existing bootargs…] dyndbg=\"file drivers/mmc/* +p\" dynamic_debug.verbose=1 loglevel=8";

For example:
 	chosen {
-		bootargs = "rootfstype=squashfs,ext4 rootwait noinitrd fstools_ignore_partname=1";
+		bootargs = "rootfstype=squashfs,ext4 rootwait noinitrd fstools_ignore_partname=1 dyndbg=\"file drivers/mmc/* +p\" dynamic_debug.verbose=1 loglevel=8";
 		append-rootblock = "root=/dev/mmcblk0p";

Then, compile and flash the resulting build.  If you are testing
before this commit on newer MMC hardware, be prepared to recover!

NOTE: If you have hardware serial console access, you don't need to
use TFTP recovery to change the active boot partition.

Reboot to working alternative partition via serial console:

1.  Connect to hardware serial console
    * See https://openwrt.org/toh/zyxel/nbg6817#serial

2.  Interrupt boot at "Hit any key to stop autoboot:"

3.  Run "ATSE NBG6817"

4.  Copy the result (e.g. "001976FE4B04")
    * Changes with **every boot** - can't reuse this

5.  On your local system, run
    "./zyxel-uboot-password-tool.sh <copied value here>"
    * Example: "./zyxel-uboot-password-tool.sh 001976FE4B04"

6.  Run the command provided by the password tool
    * Example: "ATEN 1,910F129B"
    * Changes with **every boot** - can't reuse this

7.  Run "ATGU"
    * You now have full u-boot shell until next boot - unlocking is
       not remembered

8.  Run either "run boot_mmc" (for booting partition set "FF") or
    "run boot_mmc_1" (for booting partition set "01")
    * These commands are not affected by dual-boot partition flags

NOTE: This will NOT set the dual-boot partition flag.  You'll need to
fix that manually.  The "nbg6817-dualboot" script may help:
https://github.com/pkgadd/nbg6817/blob/master/nbg6817-dualboot

zyxel-uboot-password-tool.sh - sourced from
commit 459c8c9ef8:

ror32() {
  echo $(( ($1 >> $2) | (($1 << (32 - $2) & (2**32-1)) ) ))
}

v="0x$1"
a="0x${v:2:6}"
b=$(( a + 0x10F0A563))
c=$(( 0x${v:12:14} & 7 ))
p=$(( $(ror32 $b $c) ^ a ))
printf "ATEN 1,%X\n" $p

Kernel serial console log BEFORE commit with dynamic debug enabled:
[…trimmed…]
[    3.171343] mmci-pl18x 12400000.sdcc: designer ID = 0x51
[    3.171397] mmci-pl18x 12400000.sdcc: revision = 0x0
[    3.175811] mmci-pl18x 12400000.sdcc: clocking block at 96000000 Hz
[    3.181134] mmci-pl18x 12400000.sdcc: No vqmmc regulator found
[    3.186788] mmci-pl18x 12400000.sdcc: mmc0: PL180 manf 51 rev0 at 0x12400000 irq 41,0 (pio)
[    3.192902] mmci-pl18x 12400000.sdcc: DMA channels RX dma1chan1, TX dma1chan2
[    3.215609] mmc0: clock 0Hz busmode 2 powermode 1 cs 0 Vdd 21 width 1 timing 0
[    3.227532] mmci-pl18x 12400000.sdcc: Initial signal voltage of 3.3v
[    3.247518] mmc0: clock 52000000Hz busmode 2 powermode 2 cs 0 Vdd 21 width 1 timing 0
[…trimmed…]
[    3.997725] mmc0: req done (CMD2): -110: 00000000 00000000 00000000 00000000
[    4.003631] mmci-pl18x 12400000.sdcc: irq0 (data+cmd) 00000000
[    4.003659] mmc0: error -110 whilst initialising MMC card
[    4.016481] mmc0: clock 0Hz busmode 2 powermode 0 cs 0 Vdd 0 width 1 timing 0

Notice how the initial clock is 52 MHz, which is incorrect - MMC
requires negotiation to enable higher speeds.

Kernel serial console log AFTER commit with dynamic debug enabled:
[…trimmed…]
[    3.168996] mmci-pl18x 12400000.sdcc: designer ID = 0x51
[    3.169051] mmci-pl18x 12400000.sdcc: revision = 0x0
[    3.173492] mmci-pl18x 12400000.sdcc: clocking block at 96000000 Hz
[    3.178808] mmci-pl18x 12400000.sdcc: No vqmmc regulator found
[    3.184702] mmci-pl18x 12400000.sdcc: mmc0: PL180 manf 51 rev0 at 0x12400000 irq 41,0 (pio)
[    3.190573] mmci-pl18x 12400000.sdcc: DMA channels RX dma1chan1, TX dma1chan2
[    3.217873] mmc0: clock 0Hz busmode 2 powermode 1 cs 0 Vdd 21 width 1 timing 0
[    3.229250] mmci-pl18x 12400000.sdcc: Initial signal voltage of 3.3v
[    3.249111] mmc0: clock 400000Hz busmode 2 powermode 2 cs 0 Vdd 21 width 1 timing 0
[…trimmed…]
[    4.392652] mmci-pl18x 12400000.sdcc: irq0 (data+cmd) 00000000
[    4.392785] mmc0: clock 52000000Hz busmode 2 powermode 2 cs 0 Vdd 21 width 1 timing 1
[    4.406554] mmc0: starting CMD6 arg 03b70201 flags 0000049d
[…trimmed…]

Now, the MMC properly initializes and later switches to high speed.

Thanks to:
* Ansuel for maintaining/help with the IPQ806x platform, kernel code
* slh for additional debugging and suggestions
* dwfreed for confirming newer MMC details, clock frequency
* robimarko for device driver debug printing help, clock debugging
* Drake for testing and confirmation with their own newer NBG6817
...and anyone else I missed!

Signed-off-by: Shane Synan <digitalcircuit36939@gmail.com>
Tested-by: Shane Synan <digitalcircuit36939@gmail.com>
2021-12-06 23:56:41 +08:00
..
apm821xx kernel: bump 5.10 to 5.10.76 2021-11-01 23:54:04 +08:00
arc770 arc770: drop target 2021-09-14 03:17:29 +08:00
archs38 archs38: update kernel version to 5.10 2021-11-10 23:59:07 +08:00
armvirt armvirt: enable MMIO_CMDLINE_DEVICES for firecracker support 2021-10-14 23:56:43 +08:00
at91 kernel: Set some options in generic configuration 2021-11-12 00:06:18 +08:00
ath25 kernel: bump 5.4 to 5.4.154 2021-10-22 23:56:43 +08:00
ath79 ath79: add support for Dongwon T&I DW02-412H 2021-11-20 00:10:22 +08:00
bcm27xx kernel: Set some options in generic configuration 2021-11-12 00:06:18 +08:00
bcm47xx bcm47xx: fix bgmac regression present in 5.10 kernel 2021-11-14 23:56:20 +08:00
bcm53xx kernel: Deactivate B53 symbols in generic configuration 2021-12-03 00:03:50 +08:00
bcm63xx kernel: bump 5.10 to 5.10.74 2021-10-22 23:58:19 +08:00
bcm4908 bcm4908: Deactivate pci feature 2021-12-03 00:04:02 +08:00
bmips kernel: Deactivate B53 symbols in generic configuration 2021-12-03 00:03:50 +08:00
gemini gemini: splash banner on framebuffer console 2021-10-11 23:55:36 +08:00
generic kernel: Deactivate B53 symbols in generic configuration 2021-12-03 00:03:50 +08:00
imx6 kernel: Set some options in generic configuration 2021-11-12 00:06:18 +08:00
ipq40xx Merge Mainline 2021-10-27 12:18:41 +08:00
ipq806x ipq806x: revert SDC clock changes for NBG6817 MMC 2021-12-06 23:56:41 +08:00
ipq807x kernel: Set CONFIG_RCU_CPU_STALL_TIMEOUT=21 2021-09-10 12:26:08 +08:00
kirkwood kirkwood: refresh kernel config 2021-10-06 23:56:13 +08:00
lantiq lantiq: xway_legacy: disable unused switches 2021-12-03 00:05:41 +08:00
layerscape layerscape: mkits-multiple-config: fail on invalid arguments 2021-11-14 23:57:59 +08:00
malta kernel: move two symbols to the generic kconfigs 2021-08-30 12:13:54 +08:00
mediatek mediatek: enable bmt on mt7622-rfb1 2021-12-06 23:56:07 +08:00
mpc85xx mpc85xx: Fix HiveAP-330 nvmem mac loader 2021-12-03 00:05:26 +08:00
mvebu kernel: bump 5.10 to 5.10.76 2021-11-01 23:54:04 +08:00
mxs kernel: Set some options in generic configuration 2021-11-12 00:06:18 +08:00
octeon kernel: move two symbols to the generic kconfigs 2021-08-30 12:13:54 +08:00
octeontx kernel: Deactivate some ARM64 errata workarounds 2021-10-07 00:04:20 +08:00
omap uboot-omap: Remove omap3_overo configuration 2021-12-01 23:48:09 +08:00
oxnas kernel: bump 5.10 to 5.10.76 2021-11-01 23:54:04 +08:00
pistachio pistachio: Take bootargs from device tree 2021-11-12 00:07:55 +08:00
ramips ramips: add support for ipTIME A3004NS-dual 2021-12-05 23:58:53 +08:00
realtek kernel: bump 5.10 to 5.10.76 2021-11-01 23:54:04 +08:00
rockchip rockchip: 5.10: NanoPi R2S: fixes vcc-rtl8153-regulator 2021-11-29 23:43:22 +08:00
sunxi sunxi: update nanopi neo air that use brcmfmac43430a0 2021-12-03 00:05:55 +08:00
tegra kernel: Set CONFIG_RCU_CPU_STALL_TIMEOUT=21 2021-09-10 12:26:08 +08:00
uml uml: add Kernel 5.10 support via testing 2021-11-05 00:03:04 +08:00
x86 x86: drop wireless util by default 2021-10-18 17:45:02 +08:00
zynq kernel: Set some options in generic configuration 2021-11-12 00:06:18 +08:00
Makefile