openwrt/target/linux
Shane Synan 9f0575a130 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-05 18:49:14 +01:00
..
apm821xx kernel: bump 5.4 to 5.4.161 2021-11-28 16:32:45 +01:00
arc770 kernel: move two symbols to the generic kconfigs 2021-08-29 17:07:19 +02:00
archs38 archs38: update kernel version to 5.10 2021-11-07 17:12:10 +01:00
armvirt armvirt: enable MMIO_CMDLINE_DEVICES for firecracker support 2021-10-12 19:22:08 -10:00
at91 kernel: Set some options in generic configuration 2021-11-02 23:37:19 +01:00
ath25 kernel: bump 5.4 to 5.4.154 2021-10-21 00:17:36 +02:00
ath79 ath79: add Embedded Wireless Balin Platform 2021-12-03 12:30:08 +01:00
bcm27xx kernel: bump 5.10 to 5.10.80 2021-11-19 09:40:29 +00:00
bcm47xx bcm47xx: switch to kernel 5.10 2021-11-08 15:56:39 +01:00
bcm53xx bcm53xx: sysupgrade: refactor handling different firmware formats 2021-12-02 09:15:18 +01:00
bcm63xx kernel: bump 5.4 to 5.4.162 2021-11-28 16:32:45 +01:00
bcm4908 bcm4908: sysupgrade: refactor handling different firmware formats 2021-12-02 09:17:43 +01:00
bmips kernel: Deactivate B53 symbols in generic configuration 2021-11-29 22:37:58 +01:00
gemini gemini: only provide squashfs image for storlink-derivates 2021-12-04 00:36:47 +01:00
generic kernel: Deactivate B53 symbols in generic configuration 2021-11-29 22:37:58 +01:00
imx imx: remove obsolete Kernel 5.4 2021-11-03 12:45:40 +01:00
ipq40xx ipq40xx: nvmem cells for EZVIZ CS-W3-WD1200G EUP 2021-12-04 00:36:47 +01:00
ipq806x ipq806x: revert SDC clock changes for NBG6817 MMC 2021-12-05 18:49:14 +01:00
ipq807x kernel: Set CONFIG_RCU_CPU_STALL_TIMEOUT=21 2021-09-09 20:24:12 +02:00
kirkwood kirkwood: add support for Ctera C200 V1 NAS 2021-12-04 09:39:11 +09:00
lantiq lantiq: xway_legacy: disable unused switches 2021-11-30 22:29:24 +01:00
layerscape kernel: bump 5.4 to 5.4.162 2021-11-28 16:32:45 +01:00
malta malta: remove obsolete Kernel 5.4 2021-10-02 18:13:46 +02:00
mediatek mediatek: enable bmt on mt7622-rfb1 2021-12-04 22:47:17 +01:00
mpc85xx mpc85xx: Fix HiveAP-330 nvmem mac loader 2021-11-30 22:29:24 +01:00
mvebu mvebu: next backport mvnet MQPrio offload 2021-12-03 12:35:23 +01:00
mxs mxs: drop kernel 5.4 support 2021-11-14 23:32:51 +01:00
octeon octeon: add USB3 support (for Ubiquiti EdgeRouter 6P) 2021-11-20 20:54:26 +01:00
octeontx kernel: bump 5.4 to 5.4.161 2021-11-28 16:32:45 +01:00
omap uboot-omap: Remove omap3_overo configuration 2021-11-28 22:26:27 +01:00
oxnas kernel: bump 5.10 to 5.10.81 2021-11-27 19:19:11 +01:00
pistachio pistachio: drop Kernel 5.4 support 2021-11-07 18:32:21 +01:00
ramips ramips: add support for ipTIME A3004NS-dual 2021-12-04 09:39:11 +09:00
realtek realtek: netgear-gigabit: Add gpio-restart node 2021-11-28 22:43:08 +01:00
rockchip rockchip: move r8152 related patches to generic 2021-10-30 21:17:20 +02:00
sunxi sunxi: update nanopi neo air that use brcmfmac43430a0 2021-12-02 10:58:36 +00:00
tegra tegra: switch to kernel 5.10 2021-10-18 21:32:36 +02:00
uml uml: add Kernel 5.10 support via testing 2021-11-02 10:04:50 -10:00
x86 x86: sort alphabetically default packages 2021-11-06 23:36:32 +01:00
zynq kernel: Set some options in generic configuration 2021-11-02 23:37:19 +01:00
Makefile target: use SPDX license identifiers on Makefiles 2021-02-10 15:47:18 +01:00