OpenWrt Forum Archive

Topic: TP Link WDR 4300 No Wireless

The content of this topic has been archived on 7 May 2018. There are no obvious gaps in this topic, but there may still be some posts missing at the end.

Hello everyone.

Firstly to apologize to my bad English.

I need help.

After the firmware update router tp link WDR 4300 router is bricked.
I did a recovery https://www.youtube.com/watch?v=t35Pei_eb6o

Now I have a problem.

Wireless does not exist anymore? - I did upgrade the various firmware and dovngrade and did not help.
I also returned to the factory stock firmware even that did not help.
Wireless Switch is On.
Is there any solution to my problem.

root@OpenWrt:/# dmesg
[    0.000000] Linux version 3.10.49 (bb@builder1) (gcc version 4.8.3 (OpenWrt/Linaro GCC 4.8-2014.04 r42625) ) #3 Wed Oct 1 14:00:51 CEST 2014
[    0.000000] MyLoader: sysp=d41aa8a5, boardp=3bb52003, parts=bd952718
[    0.000000] bootconsole [early0] enabled
[    0.000000] CPU revision is: 0001974c (MIPS 74Kc)
[    0.000000] SoC: Atheros AR9344 rev 2
[    0.000000] Clocks: CPU:560.000MHz, DDR:450.000MHz, AHB:225.000MHz, Ref:40.000MHz
[    0.000000] Determined physical RAM map:
[    0.000000]  memory: 08000000 @ 00000000 (usable)
[    0.000000] Initrd not found or empty - disabling initrd
[    0.000000] Zone ranges:
[    0.000000]   Normal   [mem 0x00000000-0x07ffffff]
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x00000000-0x07ffffff]
[    0.000000] On node 0 totalpages: 32768
[    0.000000] free_area_init_node: node 0, pgdat 80334b60, node_mem_map 81000000
[    0.000000]   Normal zone: 256 pages used for memmap
[    0.000000]   Normal zone: 0 pages reserved
[    0.000000]   Normal zone: 32768 pages, LIFO batch:7
[    0.000000] Primary instruction cache 64kB, VIPT, 4-way, linesize 32 bytes.
[    0.000000] Primary data cache 32kB, 4-way, VIPT, cache aliases, linesize 32 bytes
[    0.000000] pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768
[    0.000000] pcpu-alloc: [0] 0
[    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 32512
[    0.000000] Kernel command line:  board=TL-WDR4300 console=ttyS0,115200 rootfstype=squashfs,jffs2 noinitrd
[    0.000000] PID hash table entries: 512 (order: -1, 2048 bytes)
[    0.000000] Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
[    0.000000] Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
[    0.000000] Writing ErrCtl register=00000000
[    0.000000] Readback ErrCtl register=00000000
[    0.000000] Memory: 126052k/131072k available (2369k kernel code, 5020k reserved, 621k data, 272k init, 0k highmem)
[    0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[    0.000000] NR_IRQS:51
[    0.060000] Calibrating delay loop... 278.93 BogoMIPS (lpj=1394688)
[    0.070000] pid_max: default: 32768 minimum: 301
[    0.070000] Mount-cache hash table entries: 512
[    0.080000] NET: Registered protocol family 16
[    0.080000] MIPS: machine is TP-LINK TL-WDR3600/4300/4310
[    0.090000] registering PCI controller with io_map_base unset
[    0.310000] bio: create slab <bio-0> at 0
[    0.310000] PCI host bridge to bus 0000:00
[    0.320000] pci_bus 0000:00: root bus resource [mem 0x10000000-0x13ffffff]
[    0.320000] pci_bus 0000:00: root bus resource [io  0x0000]
[    0.330000] pci_bus 0000:00: No busn resource found for root bus, will use [bus 00-ff]
[    0.330000] pci 0000:00:00.0: [168c:0033] type 00 class 0x028000
[    0.330000] pci 0000:00:00.0: invalid calibration data
[    0.340000] pci 0000:00:00.0: reg 10: [mem 0x00000000-0x0001ffff 64bit]
[    0.340000] pci 0000:00:00.0: reg 30: [mem 0x00000000-0x0000ffff pref]
[    0.340000] pci 0000:00:00.0: supports D1
[    0.340000] pci 0000:00:00.0: PME# supported from D0 D1 D3hot
[    0.340000] pci_bus 0000:00: busn_res: [bus 00-ff] end is updated to 00
[    0.340000] pci 0000:00:00.0: BAR 0: assigned [mem 0x10000000-0x1001ffff 64bit]
[    0.340000] pci 0000:00:00.0: BAR 6: assigned [mem 0x10020000-0x1002ffff pref]
[    0.350000] pci 0000:00:00.0: using irq 40 for pin 1
[    0.350000] Switching to clocksource MIPS
[    0.360000] NET: Registered protocol family 2
[    0.360000] TCP established hash table entries: 1024 (order: 1, 8192 bytes)
[    0.360000] TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
[    0.370000] TCP: Hash tables configured (established 1024 bind 1024)
[    0.370000] TCP: reno registered
[    0.370000] UDP hash table entries: 256 (order: 0, 4096 bytes)
[    0.380000] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
[    0.390000] NET: Registered protocol family 1
[    0.390000] PCI: CLS 0 bytes, default 32
[    0.410000] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[    0.410000] jffs2: version 2.2 (NAND) (SUMMARY) (LZMA) (RTIME) (CMODE_PRIORITY) (c) 2001-2006 Red Hat, Inc.
[    0.420000] msgmni has been set to 246
[    0.430000] io scheduler noop registered
[    0.430000] io scheduler deadline registered (default)
[    0.440000] Serial: 8250/16550 driver, 16 ports, IRQ sharing enabled
[    0.470000] serial8250.0: ttyS0 at MMIO 0x18020000 (irq = 11) is a 16550A
[    0.470000] console [ttyS0] enabled, bootconsole disabled
[    0.490000] ath79-spi ath79-spi: master is unqueued, this is deprecated
[    0.500000] m25p80 spi0.0: found s25fl064k, expected m25p80
[    0.500000] m25p80 spi0.0: s25fl064k (8192 Kbytes)
[    0.510000] 5 tp-link partitions found on MTD device spi0.0
[    0.510000] Creating 5 MTD partitions on "spi0.0":
[    0.520000] 0x000000000000-0x000000020000 : "u-boot"
[    0.520000] 0x000000020000-0x00000012e5fc : "kernel"
[    0.530000] mtd: partition "kernel" must either start or end on erase block boundary or be smaller than an erase block -- forcing read-only
[    0.540000] 0x00000012e5fc-0x0000007f0000 : "rootfs"
[    0.550000] mtd: partition "rootfs" must either start or end on erase block boundary or be smaller than an erase block -- forcing read-only
[    0.560000] mtd: device 2 (rootfs) set to be root filesystem
[    0.570000] 1 squashfs-split partitions found on MTD device rootfs
[    0.570000] 0x000000350000-0x0000007f0000 : "rootfs_data"
[    0.580000] 0x0000007f0000-0x000000800000 : "art"
[    0.590000] 0x000000020000-0x0000007f0000 : "firmware"
[    0.620000] switch0: Atheros AR8327 rev. 2 switch registered on ag71xx-mdio.0
[    1.850000] libphy: ag71xx_mdio: probed
[    2.400000] ag71xx ag71xx.0: connected to PHY at ag71xx-mdio.0:00 [uid=004dd033, driver=Atheros AR8216/AR8236/AR8316]
[    2.410000] eth0: Atheros AG71xx at 0xb9000000, irq 4, mode:RGMII
[    2.420000] TCP: cubic registered
[    2.420000] NET: Registered protocol family 17
[    2.430000] Bridge firewalling registered
[    2.430000] 8021q: 802.1Q VLAN Support v1.8
[    2.450000] VFS: Mounted root (squashfs filesystem) readonly on device 31:2.
[    2.450000] Freeing unused kernel memory: 272K (8034c000 - 80390000)
[    4.630000] usbcore: registered new interface driver usbfs
[    4.630000] usbcore: registered new interface driver hub
[    4.640000] usbcore: registered new device driver usb
[    4.650000] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    4.660000] ehci-platform: EHCI generic platform driver
[    4.660000] ehci-platform ehci-platform: EHCI Host Controller
[    4.670000] ehci-platform ehci-platform: new USB bus registered, assigned bus number 1
[    4.680000] ehci-platform ehci-platform: irq 3, io mem 0x1b000000
[    4.710000] ehci-platform ehci-platform: USB 2.0 started, EHCI 1.00
[    4.710000] hub 1-0:1.0: USB hub found
[    4.720000] hub 1-0:1.0: 1 port detected
[    5.040000] usb 1-1: new high-speed USB device number 2 using ehci-platform
[    5.190000] hub 1-1:1.0: USB hub found
[    5.190000] hub 1-1:1.0: 4 ports detected
[    6.430000] eth0: link up (1000Mbps/Full duplex)
[    8.340000] eth0: link down
[    9.730000] NET: Registered protocol family 10
[    9.750000] nf_conntrack version 0.5.0 (1973 buckets, 7892 max)
[    9.760000] ip6_tables: (C) 2000-2006 Netfilter Core Team
[    9.770000] Loading modules backported from Linux version master-2014-05-22-0-gf2032ea
[    9.780000] Backport generated by backports.git backports-20140320-37-g5c33da0
[    9.790000] ip_tables: (C) 2000-2006 Netfilter Core Team
[    9.830000] xt_time: kernel timezone is -0000
[    9.860000] cfg80211: Calling CRDA to update world regulatory domain
[    9.860000] cfg80211: World regulatory domain updated:
[    9.870000] cfg80211:  DFS Master region: unset
[    9.870000] cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp), (dfs_cac_time)
[    9.880000] cfg80211:   (2402000 KHz - 2472000 KHz @ 40000 KHz), (N/A, 2000 mBm), (N/A)
[    9.890000] cfg80211:   (2457000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm), (N/A)
[    9.900000] cfg80211:   (2474000 KHz - 2494000 KHz @ 20000 KHz), (N/A, 2000 mBm), (N/A)
[    9.910000] cfg80211:   (5170000 KHz - 5250000 KHz @ 160000 KHz), (N/A, 2000 mBm), (N/A)
[    9.910000] cfg80211:   (5250000 KHz - 5330000 KHz @ 160000 KHz), (N/A, 2000 mBm), (0 s)
[    9.920000] cfg80211:   (5490000 KHz - 5730000 KHz @ 160000 KHz), (N/A, 2000 mBm), (0 s)
[    9.930000] cfg80211:   (5735000 KHz - 5835000 KHz @ 80000 KHz), (N/A, 2000 mBm), (N/A)
[    9.940000] cfg80211:   (57240000 KHz - 63720000 KHz @ 2160000 KHz), (N/A, 0 mBm), (N/A)
[    9.980000] PPP generic driver version 2.4.2
[   10.000000] NET: Registered protocol family 24
[   10.060000] ath: phy0: Unable to initialize hardware; initialization status: -5
[   10.070000] ath9k ar934x_wmac: failed to initialize device
[   10.070000] ath9k: probe of ar934x_wmac failed with error -5
[   10.080000] PCI: Enabling device 0000:00:00.0 (0000 -> 0002)
[   10.090000] ath: phy1: Unable to initialize hardware; initialization status: -5
[   10.100000] ath9k 0000:00:00.0: Failed to initialize device
[   10.100000] ath9k: probe of 0000:00:00.0 failed with error -5
[   17.380000] jffs2_scan_eraseblock(): End of filesystem marker found at 0x0
[   17.390000] jffs2_build_filesystem(): unlocking the mtd device... done.
[   20.130000] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
[   20.160000] IPv6: ADDRCONF(NETDEV_UP): eth0.1: link is not ready
[   20.160000] device eth0.1 entered promiscuous mode
[   20.170000] device eth0 entered promiscuous mode
[   20.200000] IPv6: ADDRCONF(NETDEV_UP): br-lan: link is not ready
[   20.210000] IPv6: ADDRCONF(NETDEV_UP): eth0.2: link is not ready
[   21.680000] eth0: link up (1000Mbps/Full duplex)
[   21.680000] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[   21.730000] br-lan: port 1(eth0.1) entered forwarding state
[   21.730000] br-lan: port 1(eth0.1) entered forwarding state
[   21.740000] IPv6: ADDRCONF(NETDEV_CHANGE): eth0.1: link becomes ready
[   21.740000] IPv6: ADDRCONF(NETDEV_CHANGE): eth0.2: link becomes ready
[   21.750000] IPv6: ADDRCONF(NETDEV_CHANGE): br-lan: link becomes ready
[   23.730000] br-lan: port 1(eth0.1) entered forwarding state
[   17.400000] jffs2_build_filesystem(): erasing all blocks after the end marker... done.
[   30.190000] jffs2: notice: (934) jffs2_build_xattr_subsystem: complete building xattr subsystem, 0 of xdatum (0 unchecked, 0 orphan) and 0 of xref (0 dead, 0 orphan) found.
root@OpenWrt:/#

Try flipping the wireless on/off switch - it was backward in some cases and/or some versions of OpenWrt I believe.

I tried but it did not help.
Is there a solution?

mxpdsa wrote:

I tried but it did not help.
Is there a solution?

I guess you already double checked your config, so how did you brick it - could that have damaged the "art" - partition? (Which is bad because its device specific and could cause such a problem). https://wiki.openwrt.org/doc/howto/rest … _partition

root@ap1:~# cat /proc/mtd 
dev:    size   erasesize  name
...
mtd4: 00010000 00010000 "art"
...

Try to dump it (dd if=/dev/mtd4 of=/tmp/art), check if its empty or contains something what should not be there ("strings /tmp/art" should not return any real strings like from config files or whatever). One of mine starts like this:

0:02:03:04:05:06
&&&&&&&&&&$ &&$ &&$ $$$" 
$$$" 
$$$" 
""" 
""" 
""" 
ABEG12

Hello I did

root @ OpenWrt: / # cat / proc / mtd
dev: size erasesize name
mtd0: 00020000 00010000 "u-boot"
MTD1: 00010000 0010e5fc "kernel"
mtd2: 00010000 006c1a04 "rootfs"
mtd3: 004a0000 00010000 "rootfs_data"
mtd4: 00010000 00010000 "art"
mtd5: 00010000 007d0000 "firmware"

I also create  the dump file
art.backup but hex editor did not fare sad

Is my art.backup file
http://www.filedropper.com/art_2

mxpdsa wrote:

Hello I did

root @ OpenWrt: / # cat / proc / mtd
...
mtd4: 00010000 00010000 "art"


Is my art.backup file
http://www.filedropper.com/art_2

This looks like a backup of /dev/mtd5 (includes only kernel/firmware/data), it doesnt include the art partition or the bootloader:
http://wiki.openwrt.org/toh/tp-link/tl- … ash_layout

Can you just dump /dev/mtd4?

Edit:
Just to clearify: the "how to restore art" link mentions mtd5 - for wdr4300 mtd4 is correct, just rely on what /proc/mtd shows for your router

(Last edited by ninno on 30 Mar 2015, 06:31)

I think it MTD4 empty
http://www.filedropper.com/mtd4


There is a possibility of copying from another router and that you may have you?

root@OpenWrt:/# cat  /proc/mtd
dev:    size   erasesize  name
mtd0: 00020000 00010000 "u-boot"
mtd1: 0010e5fc 00010000 "kernel"
mtd2: 006c1a04 00010000 "rootfs"
mtd3: 004a0000 00010000 "rootfs_data"
mtd4: 00010000 00010000 "art"
mtd5: 007d0000 00010000 "firmware"

mxpdsa wrote:

I think it MTD4 empty
http://www.filedropper.com/mtd4

There is a possibility of copying from another router and that you may have you?

Yes, this file looks bad indeed.

Here is the only one i have for that model, its from a wdr4300 v1.1 (if i remember correctly, can check tomorrow):
http://wikisend.com/download/514202/mtd4

Hopefully you can get your router to work again using that, good luck. If it doesnt work you might have to search for another one.

Hello friend I had no luck with flash!

I tried following the instructions on the following link

https://wiki.openwrt.org/doc/howto/rest … _partition

Where is making a mistake?

root@OpenWrt:/# ls /tmp
TZ                lock              mtd4              state
dhcp.leases       log               overlay           sysinfo
dnsmasq.d         luci-indexcache   resolv.conf
etc               luci-modulecache  resolv.conf.auto
hosts             luci-sessions     run

root@OpenWrt:/# mtd -r write /tmp/mtd4 art
Could not open mtd device: art
Can't open device for writing!
root@OpenWrt:/#



db12x> tftpboot 0x80000000 mtd4
Using eth0 device
TFTP from server 192.168.1.100; our IP address is 192.168.1.111
Filename 'mtd4'.
Load address: 0x80000000
Loading: #############
done
Bytes transferred = 65536 (10000 hex)


db12x> erase 0xbf7f0000 +0x10000
Error: end address (0xbf7fffff) not in flash!
Bad address format
db12x>

mxpdsa wrote:

Hello friend I had no luck with flash!

db12x> erase 0xbf7f0000 +0x10000
Error: end address (0xbf7fffff) not in flash!
Bad address format
db12x>

Your address should be different. This is for a wr1043nd:

ar7100> printenv
bootargs=console=ttyS0,115200 root=31:02 rootfstype=jffs2 init=/sbin/init mtdparts=ar9100-nor0:128k(u-boot),1024k(kernel),4096k(rootfs),64k(art)
bootcmd=bootm 0xbf020000

...so this router would map the flash to 0xbfxxxxxx, and for it the address you used would be correct.

The wdr4300 has more memory and other mappings:
http://wiki.openwrt.org/toh/tp-link/tl- … r_settings

Just rely on your own "printenv" for the calculation of the addresses.

hi, got two wdr4300 v1.7 which has the same art's (all FF)

This might be a dumb question, but how does one bork one's ART partition? By not removing the bootloader from the original firmware, and flashing that via mtd, or so? Or is this even possible from within OpenWrt? Because I read that the partition is not writeable by default.

What is my address?

db12x> printenv
bootargs=console=ttyS0,115200 root=31:02 rootfstype=squashfs init=/sbin/init mtd                                                                             parts=ath-nor0:256k(u-boot),64k(u-boot-env),6336k(rootfs),1408k(uImage),64k(mib0                                                                             ),64k(ART)
bootcmd=bootm 0x9f020000
bootdelay=1
baudrate=115200
ethaddr=0xba:0xbe:0xfa:0xce:0x08:0x41
ipaddr=192.168.1.111
serverip=192.168.1.100
dir=
lu=tftp 0x80060000 ${dir}u-boot.bin&&erase 0x9f000000 +$filesize;cp.b $fileaddr                                                                              0x9f000000 $filesize
lf=tftp 0x80060000 ${dir}db12x${bc}-jffs2&&erase 0x9f050000 +0x630000;cp.b $file                                                                             addr 0x9f050000 $filesize
lk=tftp 0x80060000 ${dir}vmlinux${bc}.lzma.uImage&&erase 0x9f680000 +$filesize;c                                                                             p.b $fileaddr 0x9f680000 $filesize
stdin=serial
stdout=serial
stderr=serial
ethact=eth0

Environment size: 686/65532 bytes
db12x>


When you do this after flash system will not boot?

b12x> tftpboot 0x80000000 mtd4
dup 1 speed 1000
Using eth0 device
TFTP from server 192.168.1.100; our IP address is 192.168.1.111
Filename 'mtd4'.
Load address: 0x80000000
Loading: #############
done
Bytes transferred = 65536 (10000 hex)
db12x> erase 0x9f020000 +0x10000

First 0x2 last 0x2 sector size 0x10000                                                                                                                      2
Erased 1 sectors
db12x> cp.b 0x8000000 0x9f020000 0x10000
Copy to Flash... write addr: 9f020000
done
db12x>


b12x> reset

U-Boot 1.1.4 (Nov 13 2014 - 11:10:12)

U-boot DB120


DRAM:  128 MB
id read 0x100000ff
flash size 8MB, sector count = 128
Flash:  8 MB
Using default environment

PCIe Reset OK!!!!!!
In:    serial
Out:   serial
Err:   serial
Net:   ag934x_enet_initialize...
No valid address in Flash. Using fixed address
wasp  reset mask:c03300
WASP  ----> S17 PHY *
: cfg1 0x7 cfg2 0x7114
eth0: ba:be:fa:ce:08:41
athrs17_reg_init: complete
eth0 up
eth0
Autobooting in 1 seconds
## Booting image at 9f020000 ...
   Uncompressing Kernel Image ... Stream with EOS marker is not supportedLZMA ERROR 1 - must RESET board to recover

U-Boot 1.1.4 (Nov 13 2014 - 11:10:12)

U-boot DB120

My router is TL - WDR4300 rev 1.0 and I installed Barrier Breaker - 14:07

mxpdsa wrote:

Autobooting in 1 seconds
## Booting image at 9f020000 ...
   Uncompressing Kernel Image ... Stream with EOS marker is not supportedLZMA ERROR 1 - must RESET board to recover

...

My router is TL - WDR4300 rev 1.0 and I installed Barrier Breaker - 14:07

Now you erased both, so you need to flash both smile
(firmware + art-partition).
Dont touch 0x9f000000++ -> should be the uboot


vilpalu wrote:

hi, got two wdr4300 v1.7 which has the same art's (all FF)

Well, this is strange - if thats supposed to be FFed, im out - the router i took the ART-Partition from is a wdr4300 v1.2 (not v1.1, i checked this today), did not see an empty art-partition by now...

If its another one, not v1.7, maybe:  (WITHOUT warranty):

# recover ART
tftpboot 0x80060000 mtd4
erase 0x9f7f0000 +0x10000
cp.b 0x80060000 0x9f7f0000 0x10000

# recover firmware:
You need a factory image, eg. https://downloads.openwrt.org/barrier_b … actory.bin

tftpboot 0x80060000 openwrt-ar71xx-generic-tl-wdr4300-v1-squashfs-factory.bin
erase 0x9f020000 +0x7c0000
cp.b 0x80060000 0x9f020000 0x7c0000

(i never recovered a wdr4300, only wr1043nd)

Good luck again

(Last edited by ninno on 31 Mar 2015, 23:38)

I can not believe now doing everything smile

Thank greatest friend smile)))

How can I backup all / all partitions, in case there are problems that can easily do a restore?

Another question sad

USB Storage server? whether there is a possibility.

(This router I bought most of these reasons)

mxpdsa wrote:

I can not believe now doing everything smile
Thank greatest friend smile)))

How can I backup all / all partitions, in case there are problems that can easily do a restore?

So you got your router back? Perfect smile

You can always save /dev/mtd0,mtd4,mtd5. mtd5 includes firmware + any configuration changes, mtd4 - art partition, mtd0 is your bootloader (not so easy to flash back if it ever gets deleted).
Backup of the router can also be taken from the luci web interface - no need for the console, just try it.

mxpdsa wrote:

Another question sad
USB Storage server? whether there is a possibility.
(This router I bought most of these reasons)

I never used openwrt for storage, but sure can be done and its seems nicely integrated into the web interface as well, just check out how to configures samba for example here:
http://wiki.openwrt.org/doc/recipes/usb … binterface
http://wiki.openwrt.org/doc/uci/samba
http://wiki.openwrt.org/doc/uci/fstab

I did a backup and I sincerely hope that we will not need it again smile

dd if=/dev/mtd1 of=/tmp/mtd1-kernel.backup
dd if=/dev/mtd2 of=/tmp/mtd2-rootfs.backup
dd if=/dev/mtd3 of=/tmp/mtd3-rootfs_data.backup
dd if=/dev/mtd4 of=/tmp/mtd4-art.backup
dd if=/dev/mtd5 of=/tmp/mtd5-firmware.backup


Thanks a lot friends!

I was wrong about all FF in ART. start from 0x4ff9 to 0x541f is info smile

The discussion might have continued from here.