rbextract: support devices with plain RLE caldata
authorRoger Pueyo Centelles <roger.pueyo@guifi.net>
Wed, 29 Jan 2020 10:27:03 +0000 (11:27 +0100)
committerKoen Vandeputte <koen.vandeputte@ncentric.com>
Wed, 26 Feb 2020 13:46:46 +0000 (14:46 +0100)
Old MikroTik devices have the RLE-encoded radio calibration data
directly stored in the art (hard_config) partition, without LZO
compression nor any preceding ERD magic bytes. This commit adds
a fallback for these devices.

Tested on the ath79 target with a MikroTik SXT 5nD r2 (SXT Lite5),
only locally --not yet merged upstream--.

Signed-off-by: Roger Pueyo Centelles <roger.pueyo@guifi.net>
package/utils/rbextract/Makefile
package/utils/rbextract/src/rbextract.c

index 4bc6898b11fd58e219f88552e14516b3b467c53f..f50bbea1207e134940fdc68494f9c43248c625c9 100644 (file)
@@ -11,7 +11,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=rbextract
-PKG_RELEASE:=2
+PKG_RELEASE:=3
 CMAKE_INSTALL:=1
 
 include $(INCLUDE_DIR)/package.mk
index ceed2494a12191fca302bdd890bfeb959af4e80a..e75d74957a10e6750a422f1ae5d393e7fc458113 100644 (file)
@@ -335,7 +335,7 @@ __rb_get_wlan_data(void)
        }
        /* Older ath79-based boards directly show the RB_MAGIC_ERD bytes followed by
        the LZO-compressed calibration data with no RLE */
-       if (magic == RB_MAGIC_ERD) {
+       else if (magic == RB_MAGIC_ERD) {
                if (tag_len > RB_ART_SIZE) {
                        printf("Calibration data too large\n");
                        goto err_free_lzo_in;
@@ -362,6 +362,18 @@ __rb_get_wlan_data(void)
 
                buf_rle_out = buf_lzo_out;
        }
+       /* Even older ath79-base boards directly have RLE-encoded calibration data,
+       without any LZO compresion nor showing RB_MAGIC_ERD bytes */
+       else {
+               printf("Decode calibration data with RLE\n");
+               err = rle_decode(tag, tag_len, buf_rle_out, RB_ART_SIZE,
+                                NULL, NULL);
+               if (err) {
+                       printf("unable to decode ERD data\n");
+                       goto err_free_rle_out;
+               }
+       }
+
        return buf_rle_out;
 
 err_free_rle_out: