About
Ubiquiti’s Bullet M line includes the Bullet M2HP along with three other devices. The bullet radios (and other Ubiquiti devices) have two different hardware revisions: the older XM and the newer XW (see Choosing the Correct Device Firmware on Ubiquiti Support). This page applies to the Bullet M2HP XW specifically.
Installing OpenWrt 19.07.5
The OpenWrt operating system provides several advantages over the stock Ubiquiti firmware, including more features in the standard distribution, a large set of additional packages that can be installed, and the possibility of a common operating system across different types and models of embedded hardware.
Unfortunately Ubiquiti’s devices use signed firmware which prevents a straightforward installation of alternative firmware such as OpenWrt. However, True Systems has shared two workarounds for this in a GitHub repository. The following steps worked for me with OpenWrt 19.07.5 and a Bullet M2HP XW.
Download the official AirOS XW.v6.1.7.32555.180523.1754.bin firmware from Ubiquiti. Install it using the normal procedure via the web interface.
$ wget 'https://dl.ui.com/firmwares/XW-fw/v6.1.7/XW.v6.1.7.32555.180523.1754.bin' $ sha256sum XW.v6.1.7.32555.180523.1754.bin c6e36003ab82b588936b558dfaf06fd2e54e3bd63b84f17687e023de55f05b23 XW.v6.1.7.32555.180523.1754.bin
Reset the router to factory defaults using the web interface.
Make sure you can ping the router and log in via SSH. The default password is ubnt. If you get no matching host key type found then add the following to your ~/.ssh/config:
Host 192.168.1.20 HostKeyAlgorithms ssh-dss
$ ping -c2 192.168.1.20 PING 192.168.1.20 (192.168.1.20) 56(84) bytes of data. 64 bytes from 192.168.1.20: icmp_seq=1 ttl=64 time=0.718 ms 64 bytes from 192.168.1.20: icmp_seq=2 ttl=64 time=0.714 ms --- 192.168.1.20 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 14ms rtt min/avg/max/mdev = 0.714/0.716/0.718/0.002 ms
$ ssh ubnt@192.168.1.20 ubnt@192.168.1.20's password: XW.v6.1.7# exit
Clone the true-systems/ubnt-openwrt-flashing repository and make it your current working directory. Update the username and/or IP address in the Makefile if necessary (it should match the SSH user@hostname destination used in the previous step).
$ git clone https://github.com/true-systems/ubnt-openwrt-flashing $ cd ubnt-openwrt-flashing/ $ git rev-parse HEAD 9a8fb9f0bb131aae6449771ead59190528956c73 $ grep ^REMOTE_UBNT Makefile REMOTE_UBNT ?= ubnt@192.168.1.20
Download the OpenWrt 19.07.5 factory image for the device.
$ wget 'https://downloads.openwrt.org/releases/19.07.5/targets/ath79/generic/openwrt-19.07.5-ath79-generic-ubnt_bullet-m-xw-squashfs-factory.bin' $ sha256sum openwrt-19.07.5-ath79-generic-ubnt_bullet-m-xw-squashfs-factory.bin e2784584dc8a0dc8fca775d98ebac4796f94e85bde8f422b944511bb834be3b5 openwrt-19.07.5-ath79-generic-ubnt_bullet-m-xw-squashfs-factory.bin
Run the automated flashing process. A backup of the stock firmware will be saved to firmware-backup.bin—you may want to keep this file in case it is necessary to revert to the stock firmware in the future.
1
$ make flash-factory FW_OWRT=openwrt-19.07.5-ath79-generic-ubnt_bullet-m-xw-squashfs-factory.bin
2scp ubnt@192.168.1.20:/sbin/ubntbox ubntbox
3ubnt@192.168.1.20's password:
4ubntbox 100% 698KB 1.5MB/s 00:00
5ssh-copy-id ubnt@192.168.1.20
6/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user/.ssh/id_rsa.pub"
7/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
8/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
9ubnt@192.168.1.20's password:
10Number of key(s) added: 1
12Now try logging into the machine, with: "ssh 'ubnt@192.168.1.20'"
14and check to make sure that only the key(s) you wanted were added.
15Creating factory firmware backup
17ssh ubnt@192.168.1.20 "cat /dev/mtd2 /dev/mtd3" > firmware-backup.bin
18ssh ubnt@192.168.1.20 "umount /tmp; mount -t tmpfs tmpfs /tmp"
19umount: can't unmount /tmp: Invalid argument
20scp ubntbox.patched ubnt@192.168.1.20:/tmp/fwupdate.real
21ubntbox.patched 100% 698KB 1.3MB/s 00:00
22scp openwrt-19.07.5-ath79-generic-ubnt_bullet-m-xw-squashfs-factory.bin ubnt@192.168.1.20:/tmp
23openwrt-19.07.5-ath79-generic-ubnt_bullet-m-xw 100% 4096KB 1.3MB/s 00:03
24ssh ubnt@192.168.1.20 "/tmp/fwupdate.real -m /tmp/openwrt-19.07.5-ath79-generic-ubnt_bullet-m-xw-squashfs-factory.bin -d 2>&1" | tee flash-factory.log
25Found mtd block: /dev/mtd0(u-boot)
26Found mtd block: /dev/mtd1(u-boot-env)
27Found mtd block: /dev/mtd2(kernel)
28Found mtd block: /dev/mtd3(rootfs)
29Found mtd block: /dev/mtd4(cfg)
30Found mtd block: /dev/mtd5(EEPROM)
31Got U-Boot variable: mtdparts = mtdparts=ath-nor0:256k(u-boot),64k(u-boot-env),1024k(kernel),6528k(rootfs),256k(cfg),64k(EEPROM)
32Adding U-Boot partition: u-boot 9F000000 00040000
33Adding U-Boot partition: u-boot-env 9F040000 00010000
34Adding U-Boot partition: kernel 9F050000 00100000
35Adding U-Boot partition: rootfs 9F150000 00660000
36Adding U-Boot partition: cfg 9F7B0000 00040000
37Adding U-Boot partition: EEPROM 9F7F0000 00010000
38Calculating flash size:
39Adding block: /dev/mtd0("u-boot") - size: 00040000
40Adding block: /dev/mtd1("u-boot-env") - size: 00010000
41Adding block: /dev/mtd2("kernel") - size: 00100000
42Adding block: /dev/mtd3("rootfs") - size: 00660000
43Adding block: /dev/mtd4("cfg") - size: 00040000
44Adding block: /dev/mtd5("EEPROM") - size: 00010000
45Total flash size: 00800000
46Flash start: 9F000000
47Flash end: 9F800000
48Header MAGIC 'OPEN'
49Current: XW.ar934x.v6.1.7.32555.180523.1754
50New ver: XW.ar934x.v6.0.4-42.OpenWrt-r11257-5090152ae3
52Versions: New(393220) 6.0.4, Required(393220) 6.0.4
53FW Part: "kernel"(1), MAGIC: 'PART', Base: 0x9F050000, DLen: 0x00100000, PLen: 0x00100000
54FW Part: "rootfs"(2), MAGIC: 'PART', Base: 0x9F150000, DLen: 0x00300004, PLen: 0x00660000
55Signature verified
56Signature MAGIC 'END.'
57FW Part: "kernel"(1), MAGIC: 'PART', Base: 0x9F050000, DLen: 0x00100000, PLen: 0x00100000
58FW Part: "rootfs"(2), MAGIC: 'PART', Base: 0x9F150000, DLen: 0x00300004, PLen: 0x00660000
59Adding adjusted FW partition:
60name:'kernel'
61flash_base:0x9F050000
62mem_base:0x80002000
63size:0x00100000
64entry_point:0x80002000
65data_len:0x00100000
66desc_cksum:0x00000000
67file_cksum:0x00000000
68===========================
69Adding adjusted FW partition:
70name:'rootfs'
71flash_base:0x9F150000
72mem_base:0xBDBDBDBD
73size:0x00660000
74entry_point:0xBDBDBDBD
75data_len:0x00300004
76desc_cksum:0x00000000
77file_cksum:0x00000000
78===========================
79Signature MAGIC 'END.'
80Working(1) with block: /dev/mtd0
81Skipping: artificial: 0, unallocated: 0,writeable: 1024(WRITEABLE: 400, flags: C00), fw.flash_base: 9F050000 < blk->base: 9F000000 + blk->size: 40000
82Copying FIS partition: 0 =>
83name:'u-boot'
84flash_base:0x9F000000
85mem_base:0xBDBDBDBD
86size:0x00040000
87entry_point:0xBDBDBDBD
88data_len:0x00040000
89desc_cksum:0xBDBDBDBD
90file_cksum:0xBDBDBDBD
91===========================
92Working(1) with block: /dev/mtd1
93Skipping: artificial: 0, unallocated: 0,writeable: 1024(WRITEABLE: 400, flags: C00), fw.flash_base: 9F050000 < blk->base: 9F040000 + blk->size: 10000
94Copying FIS partition: 1 =>
95name:'u-boot-env'
96flash_base:0x9F040000
97mem_base:0xBDBDBDBD
98size:0x00010000
99entry_point:0xBDBDBDBD
100data_len:0x00010000
101desc_cksum:0xBDBDBDBD
102file_cksum:0xBDBDBDBD
103===========================
104Working(1) with block: /dev/mtd2
105Working(2) with block: /dev/mtd2
106End check: 9F050000 + 00100000 <= 9F150000
107Creating FIS partition: 2 =>
108name:'kernel'
109flash_base:0x9F050000
110mem_base:0x80002000
111size:0x00100000
112entry_point:0x80002000
113data_len:0x00100000
114desc_cksum:0x00000000
115file_cksum:0x00000000
116===========================
117Working(1) with block: /dev/mtd2
118Skipping: artificial: 0, unallocated: 0,writeable: 1024(WRITEABLE: 400, flags: C00), fw.flash_base: 9F150000 < blk->base: 9F050000 + blk->size: 100000
119Working(1) with block: /dev/mtd3
120Working(2) with block: /dev/mtd3
121End check: 9F150000 + 00660000 <= 9F7B0000
122Creating FIS partition: 3 =>
123name:'rootfs'
124flash_base:0x9F150000
125mem_base:0xBDBDBDBD
126size:0x00660000
127entry_point:0xBDBDBDBD
128data_len:0x00300004
129desc_cksum:0x00000000
130file_cksum:0x00000000
131===========================
132Working(3) with block: /dev/mtd4
133Copying FIS partition: 4 <=
134name:'cfg'
135flash_base:0x9F7B0000
136mem_base:0xBDBDBDBD
137size:0x00040000
138entry_point:0xBDBDBDBD
139data_len:0x00040000
140desc_cksum:0xBDBDBDBD
141file_cksum:0xBDBDBDBD
142===========================
143Working(3) with block: /dev/mtd5
144Copying FIS partition: 5 <=
145name:'EEPROM'
146flash_base:0x9F7F0000
147mem_base:0xBDBDBDBD
148size:0x00010000
149entry_point:0xBDBDBDBD
150data_len:0x00010000
151desc_cksum:0xBDBDBDBD
152file_cksum:0xBDBDBDBD
153===========================
154New FIS entries count 6
155Executing: '/bin/updatefix.sh 393479 393220'
156Current ver: 393479
157New version: 393220
158No need to fix.
159'/bin/updatefix.sh 393479 393220' result: 0
160Working(1) with block: /dev/mtd0
161Skipping: artificial: 0, unallocated: 0,writeable: 1024(WRITEABLE: 400, flags: C00), fw.flash_base: 9F050000 < blk->base: 9F000000 + blk->size: 40000
162Copying FIS partition: 0 =>
163name:'u-boot'
164flash_base:0x9F000000
165mem_base:0xBDBDBDBD
166size:0x00040000
167entry_point:0xBDBDBDBD
168data_len:0x00040000
169desc_cksum:0xBDBDBDBD
170file_cksum:0xBDBDBDBD
171===========================
172Working(1) with block: /dev/mtd1
173Skipping: artificial: 0, unallocated: 0,writeable: 1024(WRITEABLE: 400, flags: C00), fw.flash_base: 9F050000 < blk->base: 9F040000 + blk->size: 10000
174Copying FIS partition: 1 =>
175name:'u-boot-env'
176flash_base:0x9F040000
177mem_base:0xBDBDBDBD
178size:0x00010000
179entry_point:0xBDBDBDBD
180data_len:0x00010000
181desc_cksum:0xBDBDBDBD
182file_cksum:0xBDBDBDBD
183===========================
184Working(1) with block: /dev/mtd2
185Working(2) with block: /dev/mtd2
186Unlocking /dev/mtd2(kernel) ...
187Unlocking device failed: ioctl(MEMUNLOCK): Operation not supported
188Writing 'kernel ' to /dev/mtd2(kernel ) ...
189Writing: 0x00100000 bytes with offset 0x00000000
190[%0 ]
191Block on '/dev/mtd2' at 00000000(len: 00010000) has changes. [%6 ]
192Block on '/dev/mtd2' at 00010000(len: 00010000) has changes. [%12 ]
193Block on '/dev/mtd2' at 00020000(len: 00010000) has changes. [%18 ]
194Block on '/dev/mtd2' at 00030000(len: 00010000) has changes. [%25 ]
195Block on '/dev/mtd2' at 00040000(len: 00010000) has changes. [%31 ]
196Block on '/dev/mtd2' at 00050000(len: 00010000) has changes. [%37 ]
197Block on '/dev/mtd2' at 00060000(len: 00010000) has changes. [%43 ]
198Block on '/dev/mtd2' at 00070000(len: 00010000) has changes. [%50 ]
199Block on '/dev/mtd2' at 00080000(len: 00010000) has changes. [%56 ]
200Block on '/dev/mtd2' at 00090000(len: 00010000) has changes. [%62 ]
201Block on '/dev/mtd2' at 000A0000(len: 00010000) has changes. [%68 ]
202Block on '/dev/mtd2' at 000B0000(len: 00010000) has changes. [%75 ]
203Block on '/dev/mtd2' at 000C0000(len: 00010000) has changes. [%81 ]
204Block on '/dev/mtd2' at 000D0000(len: 00010000) has changes. [%87 ]
205Block on '/dev/mtd2' at 000E0000(len: 00010000) has changes. [%93 ]
206Block on '/dev/mtd2' at 000F0000(len: 00010000) has changes. [%100]
207End check: 9F050000 + 00100000 <= 9F150000
209Creating FIS partition: 2 =>
210name:'kernel'
211flash_base:0x9F050000
212mem_base:0x80002000
213size:0x00100000
214entry_point:0x80002000
215data_len:0x00100000
216desc_cksum:0x00000000
217file_cksum:0x00000000
218===========================
219Working(1) with block: /dev/mtd2
220Skipping: artificial: 0, unallocated: 0,writeable: 1024(WRITEABLE: 400, flags: C00), fw.flash_base: 9F150000 < blk->base: 9F050000 + blk->size: 100000
221Working(1) with block: /dev/mtd3
222Working(2) with block: /dev/mtd3
223Unlocking /dev/mtd3(rootfs) ...
224Unlocking device failed: ioctl(MEMUNLOCK): Operation not supported
225Writing 'rootfs ' to /dev/mtd3(rootfs ) ...
226Writing: 0x00300004 bytes with offset 0x00000000
227[%0 ]
228Block on '/dev/mtd3' at 00000000(len: 00010000) has changes. [%2 ]
229Block on '/dev/mtd3' at 00010000(len: 00010000) has changes. [%4 ]
230Block on '/dev/mtd3' at 00020000(len: 00010000) has changes. [%6 ]
231Block on '/dev/mtd3' at 00030000(len: 00010000) has changes. [%8 ]
232Block on '/dev/mtd3' at 00040000(len: 00010000) has changes. [%10 ]
233Block on '/dev/mtd3' at 00050000(len: 00010000) has changes. [%12 ]
234Block on '/dev/mtd3' at 00060000(len: 00010000) has changes. [%14 ]
235Block on '/dev/mtd3' at 00070000(len: 00010000) has changes. [%16 ]
236Block on '/dev/mtd3' at 00080000(len: 00010000) has changes. [%18 ]
237Block on '/dev/mtd3' at 00090000(len: 00010000) has changes. [%20 ]
238Block on '/dev/mtd3' at 000A0000(len: 00010000) has changes. [%22 ]
239Block on '/dev/mtd3' at 000B0000(len: 00010000) has changes. [%24 ]
240Block on '/dev/mtd3' at 000C0000(len: 00010000) has changes. [%27 ]
241Block on '/dev/mtd3' at 000D0000(len: 00010000) has changes. [%29 ]
242Block on '/dev/mtd3' at 000E0000(len: 00010000) has changes. [%31 ]
243Block on '/dev/mtd3' at 000F0000(len: 00010000) has changes. [%33 ]
244Block on '/dev/mtd3' at 00100000(len: 00010000) has changes. [%35 ]
245Block on '/dev/mtd3' at 00110000(len: 00010000) has changes. [%37 ]
246Block on '/dev/mtd3' at 00120000(len: 00010000) has changes. [%39 ]
247Block on '/dev/mtd3' at 00130000(len: 00010000) has changes. [%41 ]
248Block on '/dev/mtd3' at 00140000(len: 00010000) has changes. [%43 ]
249Block on '/dev/mtd3' at 00150000(len: 00010000) has changes. [%45 ]
250Block on '/dev/mtd3' at 00160000(len: 00010000) has changes. [%47 ]
251Block on '/dev/mtd3' at 00170000(len: 00010000) has changes. [%49 ]
252Block on '/dev/mtd3' at 00180000(len: 00010000) has changes. [%52 ]
253Block on '/dev/mtd3' at 00190000(len: 00010000) has changes. [%54 ]
254Block on '/dev/mtd3' at 001A0000(len: 00010000) has changes. [%56 ]
255Block on '/dev/mtd3' at 001B0000(len: 00010000) has changes. [%58 ]
256Block on '/dev/mtd3' at 001C0000(len: 00010000) has changes. [%60 ]
257Block on '/dev/mtd3' at 001D0000(len: 00010000) has changes. [%62 ]
258Block on '/dev/mtd3' at 001E0000(len: 00010000) has changes. [%64 ]
259Block on '/dev/mtd3' at 001F0000(len: 00010000) has changes. [%66 ]
260Block on '/dev/mtd3' at 00200000(len: 00010000) has changes. [%68 ]
261Block on '/dev/mtd3' at 00210000(len: 00010000) has changes. [%70 ]
262Block on '/dev/mtd3' at 00220000(len: 00010000) has changes. [%72 ]
263Block on '/dev/mtd3' at 00230000(len: 00010000) has changes. [%74 ]
264Block on '/dev/mtd3' at 00240000(len: 00010000) has changes. [%77 ]
265Block on '/dev/mtd3' at 00250000(len: 00010000) has changes. [%79 ]
266Block on '/dev/mtd3' at 00260000(len: 00010000) has changes. [%81 ]
267Block on '/dev/mtd3' at 00270000(len: 00010000) has changes. [%83 ]
268Block on '/dev/mtd3' at 00280000(len: 00010000) has changes. [%85 ]
269Block on '/dev/mtd3' at 00290000(len: 00010000) has changes. [%87 ]
270Block on '/dev/mtd3' at 002A0000(len: 00010000) has changes. [%89 ]
271Block on '/dev/mtd3' at 002B0000(len: 00010000) has changes. [%91 ]
272Block on '/dev/mtd3' at 002C0000(len: 00010000) has changes. [%93 ]
273Block on '/dev/mtd3' at 002D0000(len: 00010000) has changes. [%95 ]
274Block on '/dev/mtd3' at 002E0000(len: 00010000) has changes. [%97 ]
275Block on '/dev/mtd3' at 002F0000(len: 00010000) has changes. [%99 ]
276Block on '/dev/mtd3' at 00300000(len: 00000004) has changes. [%100]
277End check: 9F150000 + 00660000 <= 9F7B0000
279Creating FIS partition: 3 =>
280name:'rootfs'
281flash_base:0x9F150000
282mem_base:0xBDBDBDBD
283size:0x00660000
284entry_point:0xBDBDBDBD
285data_len:0x00300004
286desc_cksum:0x00000000
287file_cksum:0x00000000
288===========================
289Working(3) with block: /dev/mtd4
290Copying FIS partition: 4 <=
291name:'cfg'
292flash_base:0x9F7B0000
293mem_base:0xBDBDBDBD
294size:0x00040000
295entry_point:0xBDBDBDBD
296data_len:0x00040000
297desc_cksum:0xBDBDBDBD
298file_cksum:0xBDBDBDBD
299===========================
300Working(3) with block: /dev/mtd5
301Copying FIS partition: 5 <=
302name:'EEPROM'
303flash_base:0x9F7F0000
304mem_base:0xBDBDBDBD
305size:0x00010000
306entry_point:0xBDBDBDBD
307data_len:0x00010000
308desc_cksum:0xBDBDBDBD
309file_cksum:0xBDBDBDBD
310===========================
311New FIS entries count 6
312FIS Change: change in partition entry 'kernel'.
313FIS Change: change in partition entry 'rootfs'.
314FIS Change: added partition terminator instead of 0xBD.
315New partition count: 6, changes: 3
316Done
At this point, or soon after, OpenWrt should be running and accessible at 192.168.1.1. You may need to press Ctrl-C to exit, due to the SSH session not being terminating properly when the final firmware update completes, but make sure you don’t interrupt any part of the flashing process (if in doubt, wait).
Updating OpenWrt
Once OpenWrt has been installed, it can be updated with an OpenWrt sysupgrade image.
An OpenWrt sysupgrade has been tested with OpenWrt 19.07.10 and with r25153-869df9ecdf.
$ sha256sum openwrt-19.07.10-ath79-generic-ubnt_bullet-m-xw-squashfs-sysupgrade.bin
806ddc698b545b97ce3ed9d6cf4830de5c24da9ba31d1f1040be9f3d4e5a4965 openwrt-19.07.10-ath79-generic-ubnt_bullet-m-xw-squashfs-sysupgrade.bin
Using TFTP recovery
If something goes wrong at some point after a successful installation of OpenWrt (for example a failed upgrade or corrupted filesystem) and you need to flash OpenWrt again, you can use TFTP recovery as follows.
Download the OpenWrt factory image to be flashed to the device. Save this file to /tmp/openwrt.bin or a similar location.
$ sha256sum openwrt-19.07.8-ath79-generic-ubnt_bullet-m-xw-squashfs-factory.bin d0f3fbdba489026fab60872f0646f43eb691eb2b27af014a4656c2f2ac69ca24 openwrt-19.07.8-ath79-generic-ubnt_bullet-m-xw-squashfs-factory.bin
Install the tftp tool. On Debian GNU/Linux for example, run apt install tftp.
Disconnect power from the device. Use a paperclip to press and hold the reset button (either on the device or on the power-over-Ethernet injector, if it has one). While holding the reset button, connect power. Wait 25 seconds, or until the LED indicates upgrade mode is active; then release the button.
Change to the OpenWrt image location, run tftp, and enter the commands shown here:
$ cd /tmp $ tftp tftp> connect 192.168.1.20 tftp> binary tftp> rexmt 1 tftp> timeout 60 tftp> put openwrt.bin
The file should begin transferring. When it completes, you should see Sent 4194716 bytes in 2.5 seconds (for example). The device will flash the firmware and reboot when it is finished (do not reboot it yourself). Once it is finished, you should be able to connect to the router at 192.168.1.1.
Restoring the stock firmware
Before the OpenWrt image is flashed in the previous section, a backup of the AirOS v6.1.7 firmware is written to firmware-backup.bin. To restore this firmware, use the corresponding make target, providing the correct SSH user@hostname destination for the device. See Restore from OpenWrt back to factory image in the true-systems/ubnt-openwrt-flashing README.
This worked for me from OpenWrt 19.07.8.
$ cd ubnt-openwrt-flashing/
$ stat -c "%s bytes" firmware-backup.bin
7733248 bytes
$ sha256sum firmware-backup.bin
b0fb2d237cc689402b0a6d4bb8adf9f5f97748ee23f03c5bc7b4b0a69b30e357 firmware-backup.bin
$ make restore REMOTE_OWRT=root@192.168.1.1
(Your firmware backup may not be the same as the one I tested.)
Credits
OpenWrt is an excellent Linux distribution for embedded devices.
True Systems shared two ways to work around Ubiquiti’s firmware signing, one of which is shown here.
See also
Ubiquiti Bullet M2 / M5 on the OpenWrt wiki
The true-systems/ubnt-openwrt-flashing repository on GitHub
AirMAX M Series Downloads from Ubiquiti
Ubiquiti Bullet versions compared on data-alliance
UniFi - TFTP Recovery for Bricked Access Points on Ubiquiti Support
Changes
2024-02-15: Add details about the Ethernet fix
2024-02-08: Update source repository commit and remove scp -O step that is now unnecessary
2023-10-21: Use AirOS default settings, add temporary SSH host configuration, update source repository commit, add scp -O option, update tested OpenWrt version to 19.07.10
2022-02-24: Updated the warning about OpenWrt 21.02.1
2022-02-12: Updated Restoring the stock firmware section since testing the restore process
2022-01-28: Added the Using TFTP recovery section
2022-01-28: Added a warning about OpenWrt 21.02.1 in the Updating OpenWrt section
2022-01-28: Updated the true-systems/ubnt-openwrt-flashing repository commit (no relevant changes upstream)
2021-04-03: Added the Updating OpenWrt section