• source navigation  • diff markup  • identifier search  • freetext search  • 

Sources/firmware-utils/src/tplink-safeloader.c

  1 // SPDX-License-Identifier: BSD-2-Clause
  2 /*
  3   Copyright (c) 2014, Matthias Schiffer <mschiffer@universe-factory.net>
  4   All rights reserved.
  5 */
  6 
  7 
  8 /*
  9    tplink-safeloader
 10 
 11    Image generation tool for the TP-LINK SafeLoader as seen on
 12    TP-LINK Pharos devices (CPE210/220/510/520)
 13 */
 14 
 15 
 16 #include <assert.h>
 17 #include <ctype.h>
 18 #include <errno.h>
 19 #include <stdbool.h>
 20 #include <stddef.h>
 21 #include <stdio.h>
 22 #include <stdint.h>
 23 #include <stdlib.h>
 24 #include <string.h>
 25 #include <time.h>
 26 #include <unistd.h>
 27 
 28 #include <arpa/inet.h>
 29 
 30 #include <sys/types.h>
 31 #include <sys/stat.h>
 32 #include <limits.h>
 33 
 34 #include "md5.h"
 35 
 36 
 37 #define ALIGN(x,a) ({ typeof(a) __a = (a); (((x) + __a - 1) & ~(__a - 1)); })
 38 
 39 
 40 #define MAX_PARTITIONS  32
 41 
 42 /** An image partition table entry */
 43 struct image_partition_entry {
 44         const char *name;
 45         size_t size;
 46         uint8_t *data;
 47 };
 48 
 49 /** A flash partition table entry */
 50 struct flash_partition_entry {
 51         const char *name;
 52         uint32_t base;
 53         uint32_t size;
 54 };
 55 
 56 /** Flash partition names table entry */
 57 struct factory_partition_names {
 58         const char *partition_table;
 59         const char *soft_ver;
 60         const char *os_image;
 61         const char *support_list;
 62         const char *file_system;
 63         const char *extra_para;
 64 };
 65 
 66 /** Partition trailing padding definitions
 67  * Values 0x00 to 0xff are reserved to indicate the padding value
 68  * Values from 0x100 are reserved to indicate other behaviour */
 69 enum partition_trail_value {
 70         PART_TRAIL_00   = 0x00,
 71         PART_TRAIL_FF   = 0xff,
 72         PART_TRAIL_MAX  = 0xff,
 73         PART_TRAIL_NONE = 0x100
 74 };
 75 
 76 /** soft-version value overwrite types
 77  * The default (for an uninitialised soft_ver field) is to use the numerical
 78  * version number "0.0.0"
 79  */
 80 enum soft_ver_type {
 81         SOFT_VER_TYPE_NUMERIC = 0,
 82         SOFT_VER_TYPE_TEXT = 1,
 83 };
 84 
 85 /** Firmware layout description */
 86 struct device_info {
 87         const char *id;
 88         const char *vendor;
 89         const char *support_list;
 90         enum partition_trail_value part_trail;
 91         struct {
 92                 enum soft_ver_type type;
 93                 union {
 94                         const char *text;
 95                         uint8_t num[3];
 96                 };
 97         } soft_ver;
 98         uint32_t soft_ver_compat_level;
 99         struct flash_partition_entry partitions[MAX_PARTITIONS+1];
100         const char *first_sysupgrade_partition;
101         const char *last_sysupgrade_partition;
102         struct factory_partition_names partition_names;
103 };
104 
105 #define SOFT_VER_TEXT(_t) {.type = SOFT_VER_TYPE_TEXT, .text = _t}
106 #define SOFT_VER_NUMERIC(_maj, _min, _patch) {  \
107                 .type = SOFT_VER_TYPE_NUMERIC,          \
108                 .num = {_maj, _min, _patch}}
109 #define SOFT_VER_DEFAULT SOFT_VER_NUMERIC(0, 0, 0)
110 
111 struct __attribute__((__packed__)) meta_header {
112         uint32_t length;
113         uint32_t zero;
114 };
115 
116 /** The content of the soft-version structure */
117 struct __attribute__((__packed__)) soft_version {
118         uint8_t pad1;
119         uint8_t version_major;
120         uint8_t version_minor;
121         uint8_t version_patch;
122         uint8_t year_hi;
123         uint8_t year_lo;
124         uint8_t month;
125         uint8_t day;
126         uint32_t rev;
127         uint32_t compat_level;
128 };
129 
130 /*
131  * Safeloader image type
132  *   Safeloader images contain a 0x14 byte preamble with image size (big endian
133  *   UINT32) and md5 checksum (16 bytes).
134  *
135  * SAFEFLOADER_TYPE_DEFAULT
136  *   Standard preamble with size including preamble length, and checksum.
137  *   Header of 0x1000 bytes, contents of which are not specified.
138  *   Payload starts at offset 0x1014.
139  *
140  * SAFELOADER_TYPE_VENDOR
141  *   Standard preamble with size including preamble length, and checksum.
142  *   Header contains up to 0x1000 bytes of vendor data, starting with a big endian
143  *   UINT32 size, followed by that number of bytes containing (text) data.
144  *   Padded with 0xFF. Payload starts at offset 0x1014.
145  *
146  * SAFELOADER_TYPE_CLOUD
147  *   Standard preamble with size including preamble length, and checksum.
148  *   Followed by the 'fw-type:Cloud' string and some (unknown) data.
149  *   Payload starts at offset 0x1014.
150  *
151  * SAFELOADER_TYPE_QNEW
152  *   Reversed order preamble, with (apparent) md5 checksum before the image
153  *   size. The size does not include the preamble length.
154  *   Header starts with 0x3C bytes, starting with the string '?NEW' (format not
155  *   understood). Then another 0x1000 bytes follow, with the data payload
156  *   starting at 0x1050.
157  */
158 enum safeloader_image_type {
159         SAFELOADER_TYPE_DEFAULT,
160         SAFELOADER_TYPE_VENDOR,
161         SAFELOADER_TYPE_CLOUD,
162         SAFELOADER_TYPE_QNEW,
163 };
164 
165 /* Internal representation of safeloader image data */
166 struct safeloader_image_info {
167         enum safeloader_image_type type;
168         size_t payload_offset;
169         struct flash_partition_entry entries[MAX_PARTITIONS];
170 };
171 
172 #define SAFELOADER_PREAMBLE_SIZE        0x14
173 #define SAFELOADER_HEADER_SIZE          0x1000
174 #define SAFELOADER_PAYLOAD_OFFSET       (SAFELOADER_PREAMBLE_SIZE + SAFELOADER_HEADER_SIZE)
175 
176 #define SAFELOADER_QNEW_HEADER_SIZE     0x3C
177 #define SAFELOADER_QNEW_PAYLOAD_OFFSET  \
178         (SAFELOADER_PREAMBLE_SIZE + SAFELOADER_QNEW_HEADER_SIZE + SAFELOADER_HEADER_SIZE)
179 
180 #define SAFELOADER_PAYLOAD_TABLE_SIZE   0x800
181 
182 static const uint8_t jffs2_eof_mark[4] = {0xde, 0xad, 0xc0, 0xde};
183 
184 
185 /**
186    Salt for the MD5 hash
187 
188    Fortunately, TP-LINK seems to use the same salt for most devices which use
189    the new image format.
190 */
191 static const uint8_t md5_salt[16] = {
192         0x7a, 0x2b, 0x15, 0xed,
193         0x9b, 0x98, 0x59, 0x6d,
194         0xe5, 0x04, 0xab, 0x44,
195         0xac, 0x2a, 0x9f, 0x4e,
196 };
197 
198 
199 /** Firmware layout table */
200 static struct device_info boards[] = {
201         /** Firmware layout for the CPE210/220 V1 */
202         {
203                 .id     = "CPE210",
204                 .vendor = "CPE510(TP-LINK|UN|N300-5):1.0\r\n",
205                 .support_list =
206                         "SupportList:\r\n"
207                         "CPE210(TP-LINK|UN|N300-2):1.0\r\n"
208                         "CPE210(TP-LINK|UN|N300-2):1.1\r\n"
209                         "CPE210(TP-LINK|US|N300-2):1.1\r\n"
210                         "CPE210(TP-LINK|EU|N300-2):1.1\r\n"
211                         "CPE220(TP-LINK|UN|N300-2):1.1\r\n"
212                         "CPE220(TP-LINK|US|N300-2):1.1\r\n"
213                         "CPE220(TP-LINK|EU|N300-2):1.1\r\n",
214                 .part_trail = 0xff,
215                 .soft_ver = SOFT_VER_DEFAULT,
216 
217                 .partitions = {
218                         {"fs-uboot", 0x00000, 0x20000},
219                         {"partition-table", 0x20000, 0x02000},
220                         {"default-mac", 0x30000, 0x00020},
221                         {"product-info", 0x31100, 0x00100},
222                         {"signature", 0x32000, 0x00400},
223                         {"firmware", 0x40000, 0x770000},
224                         {"soft-version", 0x7b0000, 0x00100},
225                         {"support-list", 0x7b1000, 0x00400},
226                         {"user-config", 0x7c0000, 0x10000},
227                         {"default-config", 0x7d0000, 0x10000},
228                         {"log", 0x7e0000, 0x10000},
229                         {"radio", 0x7f0000, 0x10000},
230                         {NULL, 0, 0}
231                 },
232 
233                 .first_sysupgrade_partition = "os-image",
234                 .last_sysupgrade_partition = "support-list",
235         },
236 
237         /** Firmware layout for the CPE210 V2 */
238         {
239                 .id     = "CPE210V2",
240                 .vendor = "CPE210(TP-LINK|UN|N300-2|00000000):2.0\r\n",
241                 .support_list =
242                         "SupportList:\r\n"
243                         "CPE210(TP-LINK|EU|N300-2|00000000):2.0\r\n"
244                         "CPE210(TP-LINK|EU|N300-2|45550000):2.0\r\n"
245                         "CPE210(TP-LINK|EU|N300-2|55530000):2.0\r\n"
246                         "CPE210(TP-LINK|UN|N300-2|00000000):2.0\r\n"
247                         "CPE210(TP-LINK|UN|N300-2|45550000):2.0\r\n"
248                         "CPE210(TP-LINK|UN|N300-2|55530000):2.0\r\n"
249                         "CPE210(TP-LINK|US|N300-2|55530000):2.0\r\n"
250                         "CPE210(TP-LINK|UN|N300-2):2.0\r\n"
251                         "CPE210(TP-LINK|EU|N300-2):2.0\r\n"
252                         "CPE210(TP-LINK|US|N300-2):2.0\r\n",
253                 .part_trail = 0xff,
254                 .soft_ver = SOFT_VER_DEFAULT,
255 
256                 .partitions = {
257                         {"fs-uboot", 0x00000, 0x20000},
258                         {"partition-table", 0x20000, 0x02000},
259                         {"default-mac", 0x30000, 0x00020},
260                         {"product-info", 0x31100, 0x00100},
261                         {"device-info", 0x31400, 0x00400},
262                         {"signature", 0x32000, 0x00400},
263                         {"device-id", 0x33000, 0x00100},
264                         {"firmware", 0x40000, 0x770000},
265                         {"soft-version", 0x7b0000, 0x00100},
266                         {"support-list", 0x7b1000, 0x01000},
267                         {"user-config", 0x7c0000, 0x10000},
268                         {"default-config", 0x7d0000, 0x10000},
269                         {"log", 0x7e0000, 0x10000},
270                         {"radio", 0x7f0000, 0x10000},
271                         {NULL, 0, 0}
272                 },
273 
274                 .first_sysupgrade_partition = "os-image",
275                 .last_sysupgrade_partition = "support-list",
276         },
277 
278         /** Firmware layout for the CPE210 V3 */
279         {
280                 .id     = "CPE210V3",
281                 .vendor = "CPE210(TP-LINK|UN|N300-2|00000000):3.0\r\n",
282                 .support_list =
283                         "SupportList:\r\n"
284                         "CPE210(TP-LINK|EU|N300-2|45550000):3.0\r\n"
285                         "CPE210(TP-LINK|UN|N300-2|00000000):3.0\r\n"
286                         "CPE210(TP-LINK|US|N300-2|55530000):3.0\r\n"
287                         "CPE210(TP-LINK|UN|N300-2):3.0\r\n"
288                         "CPE210(TP-LINK|EU|N300-2):3.0\r\n"
289                         "CPE210(TP-LINK|EU|N300-2|45550000):3.1\r\n"
290                         "CPE210(TP-LINK|UN|N300-2|00000000):3.1\r\n"
291                         "CPE210(TP-LINK|US|N300-2|55530000):3.1\r\n"
292                         "CPE210(TP-LINK|EU|N300-2|45550000):3.20\r\n"
293                         "CPE210(TP-LINK|UN|N300-2|00000000):3.20\r\n"
294                         "CPE210(TP-LINK|US|N300-2|55530000):3.20\r\n",
295                 .part_trail = 0xff,
296                 .soft_ver = SOFT_VER_DEFAULT,
297 
298                 .partitions = {
299                         {"fs-uboot", 0x00000, 0x20000},
300                         {"partition-table", 0x20000, 0x01000},
301                         {"default-mac", 0x30000, 0x00020},
302                         {"product-info", 0x31100, 0x00100},
303                         {"device-info", 0x31400, 0x00400},
304                         {"signature", 0x32000, 0x00400},
305                         {"device-id", 0x33000, 0x00100},
306                         {"firmware", 0x40000, 0x770000},
307                         {"soft-version", 0x7b0000, 0x00100},
308                         {"support-list", 0x7b1000, 0x01000},
309                         {"user-config", 0x7c0000, 0x10000},
310                         {"default-config", 0x7d0000, 0x10000},
311                         {"log", 0x7e0000, 0x10000},
312                         {"radio", 0x7f0000, 0x10000},
313                         {NULL, 0, 0}
314                 },
315 
316                 .first_sysupgrade_partition = "os-image",
317                 .last_sysupgrade_partition = "support-list",
318         },
319 
320         /** Firmware layout for the CPE220 V2 */
321         {
322                 .id     = "CPE220V2",
323                 .vendor = "CPE510(TP-LINK|UN|N300-5):1.0\r\n",
324                 .support_list =
325                         "SupportList:\r\n"
326                         "CPE220(TP-LINK|EU|N300-2|00000000):2.0\r\n"
327                         "CPE220(TP-LINK|EU|N300-2|45550000):2.0\r\n"
328                         "CPE220(TP-LINK|EU|N300-2|55530000):2.0\r\n"
329                         "CPE220(TP-LINK|UN|N300-2|00000000):2.0\r\n"
330                         "CPE220(TP-LINK|UN|N300-2|45550000):2.0\r\n"
331                         "CPE220(TP-LINK|UN|N300-2|55530000):2.0\r\n"
332                         "CPE220(TP-LINK|US|N300-2|55530000):2.0\r\n"
333                         "CPE220(TP-LINK|UN|N300-2):2.0\r\n"
334                         "CPE220(TP-LINK|EU|N300-2):2.0\r\n"
335                         "CPE220(TP-LINK|US|N300-2):2.0\r\n",
336                 .part_trail = 0xff,
337                 .soft_ver = SOFT_VER_DEFAULT,
338 
339                 .partitions = {
340                         {"fs-uboot", 0x00000, 0x20000},
341                         {"partition-table", 0x20000, 0x02000},
342                         {"default-mac", 0x30000, 0x00020},
343                         {"product-info", 0x31100, 0x00100},
344                         {"signature", 0x32000, 0x00400},
345                         {"firmware", 0x40000, 0x770000},
346                         {"soft-version", 0x7b0000, 0x00100},
347                         {"support-list", 0x7b1000, 0x00400},
348                         {"user-config", 0x7c0000, 0x10000},
349                         {"default-config", 0x7d0000, 0x10000},
350                         {"log", 0x7e0000, 0x10000},
351                         {"radio", 0x7f0000, 0x10000},
352                         {NULL, 0, 0}
353                 },
354 
355                 .first_sysupgrade_partition = "os-image",
356                 .last_sysupgrade_partition = "support-list",
357         },
358 
359         /** Firmware layout for the CPE220 V3 */
360         {
361                 .id     = "CPE220V3",
362                 .vendor = "CPE220(TP-LINK|UN|N300-2|00000000):3.0\r\n",
363                 .support_list =
364                         "SupportList:\r\n"
365                         "CPE220(TP-LINK|EU|N300-2|00000000):3.0\r\n"
366                         "CPE220(TP-LINK|EU|N300-2|45550000):3.0\r\n"
367                         "CPE220(TP-LINK|EU|N300-2|55530000):3.0\r\n"
368                         "CPE220(TP-LINK|UN|N300-2|00000000):3.0\r\n"
369                         "CPE220(TP-LINK|UN|N300-2|45550000):3.0\r\n"
370                         "CPE220(TP-LINK|UN|N300-2|55530000):3.0\r\n"
371                         "CPE220(TP-LINK|US|N300-2|55530000):3.0\r\n"
372                         "CPE220(TP-LINK|UN|N300-2):3.0\r\n"
373                         "CPE220(TP-LINK|EU|N300-2):3.0\r\n"
374                         "CPE220(TP-LINK|US|N300-2):3.0\r\n",
375                 .part_trail = 0xff,
376                 .soft_ver = SOFT_VER_DEFAULT,
377 
378                 .partitions = {
379                         {"fs-uboot", 0x00000, 0x20000},
380                         {"partition-table", 0x20000, 0x02000},
381                         {"default-mac", 0x30000, 0x00020},
382                         {"product-info", 0x31100, 0x00100},
383                         {"device-info", 0x31400, 0x00400},
384                         {"signature", 0x32000, 0x00400},
385                         {"device-id", 0x33000, 0x00100},
386                         {"firmware", 0x40000, 0x770000},
387                         {"soft-version", 0x7b0000, 0x00100},
388                         {"support-list", 0x7b1000, 0x01000},
389                         {"user-config", 0x7c0000, 0x10000},
390                         {"default-config", 0x7d0000, 0x10000},
391                         {"log", 0x7e0000, 0x10000},
392                         {"radio", 0x7f0000, 0x10000},
393                         {NULL, 0, 0}
394                 },
395 
396                 .first_sysupgrade_partition = "os-image",
397                 .last_sysupgrade_partition = "support-list",
398         },
399 
400         /** Firmware layout for the CPE510/520 V1 */
401         {
402                 .id     = "CPE510",
403                 .vendor = "CPE510(TP-LINK|UN|N300-5):1.0\r\n",
404                 .support_list =
405                         "SupportList:\r\n"
406                         "CPE510(TP-LINK|UN|N300-5):1.0\r\n"
407                         "CPE510(TP-LINK|UN|N300-5):1.1\r\n"
408                         "CPE510(TP-LINK|UN|N300-5):1.1\r\n"
409                         "CPE510(TP-LINK|US|N300-5):1.1\r\n"
410                         "CPE510(TP-LINK|CA|N300-5):1.1\r\n"
411                         "CPE510(TP-LINK|EU|N300-5):1.1\r\n"
412                         "CPE520(TP-LINK|UN|N300-5):1.1\r\n"
413                         "CPE520(TP-LINK|US|N300-5):1.1\r\n"
414                         "CPE520(TP-LINK|EU|N300-5):1.1\r\n",
415                 .part_trail = 0xff,
416                 .soft_ver = SOFT_VER_DEFAULT,
417 
418                 .partitions = {
419                         {"fs-uboot", 0x00000, 0x20000},
420                         {"partition-table", 0x20000, 0x02000},
421                         {"default-mac", 0x30000, 0x00020},
422                         {"product-info", 0x31100, 0x00100},
423                         {"signature", 0x32000, 0x00400},
424                         {"firmware", 0x40000, 0x770000},
425                         {"soft-version", 0x7b0000, 0x00100},
426                         {"support-list", 0x7b1000, 0x00400},
427                         {"user-config", 0x7c0000, 0x10000},
428                         {"default-config", 0x7d0000, 0x10000},
429                         {"log", 0x7e0000, 0x10000},
430                         {"radio", 0x7f0000, 0x10000},
431                         {NULL, 0, 0}
432                 },
433 
434                 .first_sysupgrade_partition = "os-image",
435                 .last_sysupgrade_partition = "support-list",
436         },
437 
438         /** Firmware layout for the CPE510 V2 */
439         {
440                 .id     = "CPE510V2",
441                 .vendor = "CPE510(TP-LINK|UN|N300-5):2.0\r\n",
442                 .support_list =
443                         "SupportList:\r\n"
444                         "CPE510(TP-LINK|EU|N300-5|00000000):2.0\r\n"
445                         "CPE510(TP-LINK|EU|N300-5|45550000):2.0\r\n"
446                         "CPE510(TP-LINK|EU|N300-5|55530000):2.0\r\n"
447                         "CPE510(TP-LINK|UN|N300-5|00000000):2.0\r\n"
448                         "CPE510(TP-LINK|UN|N300-5|45550000):2.0\r\n"
449                         "CPE510(TP-LINK|UN|N300-5|55530000):2.0\r\n"
450                         "CPE510(TP-LINK|US|N300-5|00000000):2.0\r\n"
451                         "CPE510(TP-LINK|US|N300-5|45550000):2.0\r\n"
452                         "CPE510(TP-LINK|US|N300-5|55530000):2.0\r\n"
453                         "CPE510(TP-LINK|UN|N300-5):2.0\r\n"
454                         "CPE510(TP-LINK|EU|N300-5):2.0\r\n"
455                         "CPE510(TP-LINK|US|N300-5):2.0\r\n",
456                 .part_trail = 0xff,
457                 .soft_ver = SOFT_VER_DEFAULT,
458 
459                 .partitions = {
460                         {"fs-uboot", 0x00000, 0x20000},
461                         {"partition-table", 0x20000, 0x02000},
462                         {"default-mac", 0x30000, 0x00020},
463                         {"product-info", 0x31100, 0x00100},
464                         {"signature", 0x32000, 0x00400},
465                         {"firmware", 0x40000, 0x770000},
466                         {"soft-version", 0x7b0000, 0x00100},
467                         {"support-list", 0x7b1000, 0x00400},
468                         {"user-config", 0x7c0000, 0x10000},
469                         {"default-config", 0x7d0000, 0x10000},
470                         {"log", 0x7e0000, 0x10000},
471                         {"radio", 0x7f0000, 0x10000},
472                         {NULL, 0, 0}
473                 },
474 
475                 .first_sysupgrade_partition = "os-image",
476                 .last_sysupgrade_partition = "support-list",
477         },
478 
479         /** Firmware layout for the CPE510 V3 */
480         {
481                 .id     = "CPE510V3",
482                 .vendor = "CPE510(TP-LINK|UN|N300-5):3.0\r\n",
483                 .support_list =
484                         "SupportList:\r\n"
485                         "CPE510(TP-LINK|EU|N300-5|00000000):3.0\r\n"
486                         "CPE510(TP-LINK|EU|N300-5|45550000):3.0\r\n"
487                         "CPE510(TP-LINK|EU|N300-5|55530000):3.0\r\n"
488                         "CPE510(TP-LINK|UN|N300-5|00000000):3.0\r\n"
489                         "CPE510(TP-LINK|UN|N300-5|45550000):3.0\r\n"
490                         "CPE510(TP-LINK|UN|N300-5|55530000):3.0\r\n"
491                         "CPE510(TP-LINK|US|N300-5|00000000):3.0\r\n"
492                         "CPE510(TP-LINK|US|N300-5|45550000):3.0\r\n"
493                         "CPE510(TP-LINK|US|N300-5|55530000):3.0\r\n"
494                         "CPE510(TP-LINK|UN|N300-5):3.0\r\n"
495                         "CPE510(TP-LINK|EU|N300-5):3.0\r\n"
496                         "CPE510(TP-LINK|US|N300-5):3.0\r\n"
497                         "CPE510(TP-LINK|UN|N300-5|00000000):3.20\r\n"
498                         "CPE510(TP-LINK|US|N300-5|55530000):3.20\r\n"
499                         "CPE510(TP-LINK|EU|N300-5|45550000):3.20\r\n",
500                 .part_trail = 0xff,
501                 .soft_ver = SOFT_VER_DEFAULT,
502 
503                 .partitions = {
504                         {"fs-uboot", 0x00000, 0x20000},
505                         {"partition-table", 0x20000, 0x02000},
506                         {"default-mac", 0x30000, 0x00020},
507                         {"product-info", 0x31100, 0x00100},
508                         {"signature", 0x32000, 0x00400},
509                         {"firmware", 0x40000, 0x770000},
510                         {"soft-version", 0x7b0000, 0x00100},
511                         {"support-list", 0x7b1000, 0x00400},
512                         {"user-config", 0x7c0000, 0x10000},
513                         {"default-config", 0x7d0000, 0x10000},
514                         {"log", 0x7e0000, 0x10000},
515                         {"radio", 0x7f0000, 0x10000},
516                         {NULL, 0, 0}
517                 },
518 
519                 .first_sysupgrade_partition = "os-image",
520                 .last_sysupgrade_partition = "support-list",
521         },
522 
523         /** Firmware layout for the CPE605V1 */
524         {
525                 .id     = "CPE605V1",
526                 .vendor = "CPE605(TP-LINK|UN|N150-5):1.0\r\n",
527                 .support_list =
528                         "SupportList:\r\n"
529                         "CPE605(TP-LINK|UN|N150-5|00000000):1.0\r\n"
530                         "CPE605(TP-LINK|EU|N150-5|45550000):1.0\r\n"
531                         "CPE605(TP-LINK|US|N150-5|55530000):1.0\r\n",
532                 .part_trail = 0x00,
533                 .soft_ver = SOFT_VER_DEFAULT,
534 
535                 .partitions = {
536                         {"fs-uboot", 0x00000, 0x20000},
537                         {"partition-table", 0x20000, 0x02000},
538                         {"default-mac", 0x30000, 0x00020},
539                         {"serial-number", 0x30100, 0x00020},
540                         {"product-info", 0x31100, 0x00100},
541                         {"device-info", 0x31400, 0x00400},
542                         {"signature", 0x32000, 0x00400},
543                         {"device-id", 0x33000, 0x00100},
544                         {"firmware", 0x40000, 0x770000},
545                         {"soft-version", 0x7b0000, 0x00100},
546                         {"support-list", 0x7b1000, 0x01000},
547                         {"user-config", 0x7c0000, 0x10000},
548                         {"default-config", 0x7d0000, 0x10000},
549                         {"log", 0x7e0000, 0x10000},
550                         {"radio", 0x7f0000, 0x10000},
551                         {NULL, 0, 0}
552                 },
553 
554                 .first_sysupgrade_partition = "os-image",
555                 .last_sysupgrade_partition = "support-list",
556         },
557 
558         /** Firmware layout for the CPE610V1 */
559         {
560                 .id     = "CPE610V1",
561                 .vendor = "CPE610(TP-LINK|UN|N300-5|00000000):1.0\r\n",
562                 .support_list =
563                         "SupportList:\r\n"
564                         "CPE610(TP-LINK|EU|N300-5|00000000):1.0\r\n"
565                         "CPE610(TP-LINK|EU|N300-5|45550000):1.0\r\n"
566                         "CPE610(TP-LINK|EU|N300-5|55530000):1.0\r\n"
567                         "CPE610(TP-LINK|UN|N300-5|00000000):1.0\r\n"
568                         "CPE610(TP-LINK|UN|N300-5|45550000):1.0\r\n"
569                         "CPE610(TP-LINK|UN|N300-5|55530000):1.0\r\n"
570                         "CPE610(TP-LINK|US|N300-5|55530000):1.0\r\n"
571                         "CPE610(TP-LINK|UN|N300-5):1.0\r\n"
572                         "CPE610(TP-LINK|EU|N300-5):1.0\r\n"
573                         "CPE610(TP-LINK|US|N300-5):1.0\r\n",
574                 .part_trail = 0xff,
575                 .soft_ver = SOFT_VER_DEFAULT,
576 
577                 .partitions = {
578                         {"fs-uboot", 0x00000, 0x20000},
579                         {"partition-table", 0x20000, 0x02000},
580                         {"default-mac", 0x30000, 0x00020},
581                         {"product-info", 0x31100, 0x00100},
582                         {"signature", 0x32000, 0x00400},
583                         {"firmware", 0x40000, 0x770000},
584                         {"soft-version", 0x7b0000, 0x00100},
585                         {"support-list", 0x7b1000, 0x00400},
586                         {"user-config", 0x7c0000, 0x10000},
587                         {"default-config", 0x7d0000, 0x10000},
588                         {"log", 0x7e0000, 0x10000},
589                         {"radio", 0x7f0000, 0x10000},
590                         {NULL, 0, 0}
591                 },
592 
593                 .first_sysupgrade_partition = "os-image",
594                 .last_sysupgrade_partition = "support-list",
595         },
596 
597         /** Firmware layout for the CPE610V2 */
598         {
599                 .id     = "CPE610V2",
600                 .vendor = "CPE610(TP-LINK|UN|N300-5|00000000):2.0\r\n",
601                 .support_list =
602                         "SupportList:\r\n"
603                         "CPE610(TP-LINK|EU|N300-5|00000000):2.0\r\n"
604                         "CPE610(TP-LINK|EU|N300-5|45550000):2.0\r\n"
605                         "CPE610(TP-LINK|EU|N300-5|55530000):2.0\r\n"
606                         "CPE610(TP-LINK|UN|N300-5|00000000):2.0\r\n"
607                         "CPE610(TP-LINK|UN|N300-5|45550000):2.0\r\n"
608                         "CPE610(TP-LINK|UN|N300-5|55530000):2.0\r\n"
609                         "CPE610(TP-LINK|US|N300-5|55530000):2.0\r\n"
610                         "CPE610(TP-LINK|UN|N300-5):2.0\r\n"
611                         "CPE610(TP-LINK|EU|N300-5):2.0\r\n"
612                         "CPE610(TP-LINK|US|N300-5):2.0\r\n",
613                 .part_trail = 0xff,
614                 .soft_ver = SOFT_VER_DEFAULT,
615 
616                 .partitions = {
617                         {"fs-uboot", 0x00000, 0x20000},
618                         {"partition-table", 0x20000, 0x02000},
619                         {"default-mac", 0x30000, 0x00020},
620                         {"product-info", 0x31100, 0x00100},
621                         {"signature", 0x32000, 0x00400},
622                         {"firmware", 0x40000, 0x770000},
623                         {"soft-version", 0x7b0000, 0x00100},
624                         {"support-list", 0x7b1000, 0x00400},
625                         {"user-config", 0x7c0000, 0x10000},
626                         {"default-config", 0x7d0000, 0x10000},
627                         {"log", 0x7e0000, 0x10000},
628                         {"radio", 0x7f0000, 0x10000},
629                         {NULL, 0, 0}
630                 },
631 
632                 .first_sysupgrade_partition = "os-image",
633                 .last_sysupgrade_partition = "support-list",
634         },
635         /** Firmware layout for the CPE710 V1 */
636         {
637                 .id     = "CPE710V1",
638                 .vendor = "CPE710(TP-LINK|UN|AC866-5|00000000):1.0\r\n",
639                 .support_list =
640                         "SupportList:\r\n"
641                         "CPE710(TP-LINK|UN|AC866-5|00000000):1.0\r\n"
642                         "CPE710(TP-LINK|EU|AC866-5|45550000):1.0\r\n"
643                         "CPE710(TP-LINK|US|AC866-5|55530000):1.0\r\n"
644                         "CPE710(TP-LINK|UN|AC866-5):1.0\r\n"
645                         "CPE710(TP-LINK|EU|AC866-5):1.0\r\n"
646                         "CPE710(TP-LINK|US|AC866-5):1.0\r\n",
647                 .part_trail = 0xff,
648                 .soft_ver = SOFT_VER_DEFAULT,
649 
650                 .partitions = {
651                         {"fs-uboot", 0x00000, 0x50000},
652                         {"partition-table", 0x50000, 0x02000},
653                         {"default-mac", 0x60000, 0x00020},
654                         {"serial-number", 0x60100, 0x00020},
655                         {"product-info", 0x61100, 0x00100},
656                         {"device-info", 0x61400, 0x00400},
657                         {"signature", 0x62000, 0x00400},
658                         {"device-id", 0x63000, 0x00100},
659                         {"firmware", 0x70000, 0xf40000},
660                         {"soft-version", 0xfb0000, 0x00100},
661                         {"support-list", 0xfb1000, 0x01000},
662                         {"user-config", 0xfc0000, 0x10000},
663                         {"default-config", 0xfd0000, 0x10000},
664                         {"log", 0xfe0000, 0x10000},
665                         {"radio", 0xff0000, 0x10000},
666                         {NULL, 0, 0}
667                 },
668 
669                 .first_sysupgrade_partition = "os-image",
670                 .last_sysupgrade_partition = "support-list",
671         },
672         /** Firmware layout for the CPE710 V2 */
673         {
674                 .id     = "CPE710V2",
675                 .vendor = "CPE710(TP-LINK|UN|AC866-5|00000000):2.0\r\n",
676                 .support_list =
677                         "SupportList:\r\n"
678                         "CPE710(TP-LINK|UN|AC866-5|00000000):2.0\r\n"
679                         "CPE710(TP-LINK|EU|AC866-5|45550000):2.0\r\n"
680                         "CPE710(TP-LINK|US|AC866-5|55530000):2.0\r\n"
681                         "CPE710(TP-LINK|UN|AC866-5):2.0\r\n"
682                         "CPE710(TP-LINK|EU|AC866-5):2.0\r\n"
683                         "CPE710(TP-LINK|US|AC866-5):2.0\r\n",
684                 .part_trail = 0xff,
685                 .soft_ver = SOFT_VER_NUMERIC(1, 0, 0),
686                 .soft_ver_compat_level = 1,
687 
688                 .partitions = {
689                         {"fs-uboot", 0x00000, 0x50000},
690                         {"partition-table", 0x50000, 0x02000},
691                         {"default-mac", 0x60000, 0x00020},
692                         {"serial-number", 0x60100, 0x00020},
693                         {"product-info", 0x61100, 0x00100},
694                         {"device-info", 0x61400, 0x00400},
695                         {"signature", 0x62000, 0x00400},
696                         {"device-id", 0x63000, 0x00100},
697                         {"firmware", 0x70000, 0xf40000},
698                         {"soft-version", 0xfb0000, 0x00100},
699                         {"support-list", 0xfb1000, 0x01000},
700                         {"user-config", 0xfc0000, 0x10000},
701                         {"default-config", 0xfd0000, 0x10000},
702                         {"log", 0xfe0000, 0x10000},
703                         {"radio", 0xff0000, 0x10000},
704                         {NULL, 0, 0}
705                 },
706 
707                 .first_sysupgrade_partition = "os-image",
708                 .last_sysupgrade_partition = "support-list",
709         },
710 
711         {
712                 .id     = "WBS210",
713                 .vendor = "CPE510(TP-LINK|UN|N300-5):1.0\r\n",
714                 .support_list =
715                         "SupportList:\r\n"
716                         "WBS210(TP-LINK|UN|N300-2):1.20\r\n"
717                         "WBS210(TP-LINK|US|N300-2):1.20\r\n"
718                         "WBS210(TP-LINK|EU|N300-2):1.20\r\n",
719                 .part_trail = 0xff,
720                 .soft_ver = SOFT_VER_DEFAULT,
721 
722                 .partitions = {
723                         {"fs-uboot", 0x00000, 0x20000},
724                         {"partition-table", 0x20000, 0x02000},
725                         {"default-mac", 0x30000, 0x00020},
726                         {"product-info", 0x31100, 0x00100},
727                         {"signature", 0x32000, 0x00400},
728                         {"firmware", 0x40000, 0x770000},
729                         {"soft-version", 0x7b0000, 0x00100},
730                         {"support-list", 0x7b1000, 0x00400},
731                         {"user-config", 0x7c0000, 0x10000},
732                         {"default-config", 0x7d0000, 0x10000},
733                         {"log", 0x7e0000, 0x10000},
734                         {"radio", 0x7f0000, 0x10000},
735                         {NULL, 0, 0}
736                 },
737 
738                 .first_sysupgrade_partition = "os-image",
739                 .last_sysupgrade_partition = "support-list",
740         },
741 
742         {
743                 .id     = "WBS210V2",
744                 .vendor = "CPE510(TP-LINK|UN|N300-5):1.0\r\n",
745                 .support_list =
746                         "SupportList:\r\n"
747                         "WBS210(TP-LINK|UN|N300-2|00000000):2.0\r\n"
748                         "WBS210(TP-LINK|US|N300-2|55530000):2.0\r\n"
749                         "WBS210(TP-LINK|EU|N300-2|45550000):2.0\r\n",
750                 .part_trail = 0xff,
751                 .soft_ver = SOFT_VER_DEFAULT,
752 
753                 .partitions = {
754                         {"fs-uboot", 0x00000, 0x20000},
755                         {"partition-table", 0x20000, 0x02000},
756                         {"default-mac", 0x30000, 0x00020},
757                         {"product-info", 0x31100, 0x00100},
758                         {"signature", 0x32000, 0x00400},
759                         {"firmware", 0x40000, 0x770000},
760                         {"soft-version", 0x7b0000, 0x00100},
761                         {"support-list", 0x7b1000, 0x00400},
762                         {"user-config", 0x7c0000, 0x10000},
763                         {"default-config", 0x7d0000, 0x10000},
764                         {"log", 0x7e0000, 0x10000},
765                         {"radio", 0x7f0000, 0x10000},
766                         {NULL, 0, 0}
767                 },
768 
769                 .first_sysupgrade_partition = "os-image",
770                 .last_sysupgrade_partition = "support-list",
771         },
772 
773         {
774                 .id     = "WBS510",
775                 .vendor = "CPE510(TP-LINK|UN|N300-5):1.0\r\n",
776                 .support_list =
777                         "SupportList:\r\n"
778                         "WBS510(TP-LINK|UN|N300-5):1.20\r\n"
779                         "WBS510(TP-LINK|US|N300-5):1.20\r\n"
780                         "WBS510(TP-LINK|EU|N300-5):1.20\r\n"
781                         "WBS510(TP-LINK|CA|N300-5):1.20\r\n",
782                 .part_trail = 0xff,
783                 .soft_ver = SOFT_VER_DEFAULT,
784 
785                 .partitions = {
786                         {"fs-uboot", 0x00000, 0x20000},
787                         {"partition-table", 0x20000, 0x02000},
788                         {"default-mac", 0x30000, 0x00020},
789                         {"product-info", 0x31100, 0x00100},
790                         {"signature", 0x32000, 0x00400},
791                         {"firmware", 0x40000, 0x770000},
792                         {"soft-version", 0x7b0000, 0x00100},
793                         {"support-list", 0x7b1000, 0x00400},
794                         {"user-config", 0x7c0000, 0x10000},
795                         {"default-config", 0x7d0000, 0x10000},
796                         {"log", 0x7e0000, 0x10000},
797                         {"radio", 0x7f0000, 0x10000},
798                         {NULL, 0, 0}
799                 },
800 
801                 .first_sysupgrade_partition = "os-image",
802                 .last_sysupgrade_partition = "support-list",
803         },
804 
805         {
806                 .id     = "WBS510V2",
807                 .vendor = "CPE510(TP-LINK|UN|N300-5):1.0\r\n",
808                 .support_list =
809                         "SupportList:\r\n"
810                         "WBS510(TP-LINK|UN|N300-5|00000000):2.0\r\n"
811                         "WBS510(TP-LINK|US|N300-5|55530000):2.0\r\n"
812                         "WBS510(TP-LINK|EU|N300-5|45550000):2.0\r\n"
813                         "WBS510(TP-LINK|CA|N300-5|43410000):2.0\r\n",
814                 .part_trail = 0xff,
815                 .soft_ver = SOFT_VER_DEFAULT,
816 
817                 .partitions = {
818                         {"fs-uboot", 0x00000, 0x20000},
819                         {"partition-table", 0x20000, 0x02000},
820                         {"default-mac", 0x30000, 0x00020},
821                         {"product-info", 0x31100, 0x00100},
822                         {"signature", 0x32000, 0x00400},
823                         {"firmware", 0x40000, 0x770000},
824                         {"soft-version", 0x7b0000, 0x00100},
825                         {"support-list", 0x7b1000, 0x00400},
826                         {"user-config", 0x7c0000, 0x10000},
827                         {"default-config", 0x7d0000, 0x10000},
828                         {"log", 0x7e0000, 0x10000},
829                         {"radio", 0x7f0000, 0x10000},
830                         {NULL, 0, 0}
831                 },
832 
833                 .first_sysupgrade_partition = "os-image",
834                 .last_sysupgrade_partition = "support-list",
835         },
836 
837         /** Firmware layout for the AD7200 */
838         {
839                 .id = "AD7200",
840                 .vendor = "",
841                 .support_list =
842                         "SupportList:\r\n"
843                         "{product_name:AD7200,product_ver:1.0.0,special_id:00000000}\r\n",
844                 .part_trail = 0x00,
845                 .soft_ver = SOFT_VER_DEFAULT,
846 
847                 .partitions = {
848                         {"SBL1", 0x00000, 0x20000},
849                         {"MIBIB", 0x20000, 0x20000},
850                         {"SBL2", 0x40000, 0x20000},
851                         {"SBL3", 0x60000, 0x30000},
852                         {"DDRCONFIG", 0x90000, 0x10000},
853                         {"SSD", 0xa0000, 0x10000},
854                         {"TZ", 0xb0000, 0x30000},
855                         {"RPM", 0xe0000, 0x20000},
856                         {"fs-uboot", 0x100000, 0x70000},
857                         {"uboot-env", 0x170000, 0x40000},
858                         {"radio", 0x1b0000, 0x40000},
859                         {"os-image", 0x1f0000, 0x400000},
860                         {"file-system", 0x5f0000, 0x1900000},
861                         {"default-mac", 0x1ef0000, 0x00200},
862                         {"pin", 0x1ef0200, 0x00200},
863                         {"device-id", 0x1ef0400, 0x00200},
864                         {"product-info", 0x1ef0600, 0x0fa00},
865                         {"partition-table", 0x1f00000, 0x10000},
866                         {"soft-version", 0x1f10000, 0x10000},
867                         {"support-list", 0x1f20000, 0x10000},
868                         {"profile", 0x1f30000, 0x10000},
869                         {"default-config", 0x1f40000, 0x10000},
870                         {"user-config", 0x1f50000, 0x40000},
871                         {"qos-db", 0x1f90000, 0x40000},
872                         {"usb-config", 0x1fd0000, 0x10000},
873                         {"log", 0x1fe0000, 0x20000},
874                         {NULL, 0, 0}
875                 },
876 
877                 .first_sysupgrade_partition = "os-image",
878                 .last_sysupgrade_partition = "file-system"
879         },
880 
881         /** Firmware layout for the C2600 */
882         {
883                 .id     = "C2600",
884                 .vendor = "",
885                 .support_list =
886                         "SupportList:\r\n"
887                         "{product_name:Archer C2600,product_ver:1.0.0,special_id:00000000}\r\n",
888                 .part_trail = 0x00,
889                 .soft_ver = SOFT_VER_DEFAULT,
890 
891                 /**
892                     We use a bigger os-image partition than the stock images (and thus
893                     smaller file-system), as our kernel doesn't fit in the stock firmware's
894                     2 MB os-image since kernel 4.14.
895                 */
896                 .partitions = {
897                         {"SBL1", 0x00000, 0x20000},
898                         {"MIBIB", 0x20000, 0x20000},
899                         {"SBL2", 0x40000, 0x20000},
900                         {"SBL3", 0x60000, 0x30000},
901                         {"DDRCONFIG", 0x90000, 0x10000},
902                         {"SSD", 0xa0000, 0x10000},
903                         {"TZ", 0xb0000, 0x30000},
904                         {"RPM", 0xe0000, 0x20000},
905                         {"fs-uboot", 0x100000, 0x70000},
906                         {"uboot-env", 0x170000, 0x40000},
907                         {"radio", 0x1b0000, 0x40000},
908                         {"os-image", 0x1f0000, 0x400000}, /* Stock: base 0x1f0000 size 0x200000 */
909                         {"file-system", 0x5f0000, 0x1900000}, /* Stock: base 0x3f0000 size 0x1b00000 */
910                         {"default-mac", 0x1ef0000, 0x00200},
911                         {"pin", 0x1ef0200, 0x00200},
912                         {"product-info", 0x1ef0400, 0x0fc00},
913                         {"partition-table", 0x1f00000, 0x10000},
914                         {"soft-version", 0x1f10000, 0x10000},
915                         {"support-list", 0x1f20000, 0x10000},
916                         {"profile", 0x1f30000, 0x10000},
917                         {"default-config", 0x1f40000, 0x10000},
918                         {"user-config", 0x1f50000, 0x40000},
919                         {"qos-db", 0x1f90000, 0x40000},
920                         {"usb-config", 0x1fd0000, 0x10000},
921                         {"log", 0x1fe0000, 0x20000},
922                         {NULL, 0, 0}
923                 },
924 
925                 .first_sysupgrade_partition = "os-image",
926                 .last_sysupgrade_partition = "file-system"
927         },
928 
929         /** Firmware layout for the A7-V5 */
930         {
931                 .id     = "ARCHER-A7-V5",
932                 .support_list =
933                         "SupportList:\n"
934                         "{product_name:Archer A7,product_ver:5.0.0,special_id:45550000}\n"
935                         "{product_name:Archer A7,product_ver:5.0.0,special_id:55530000}\n"
936                         "{product_name:Archer A7,product_ver:5.0.0,special_id:43410000}\n"
937                         "{product_name:Archer A7,product_ver:5.0.0,special_id:4A500000}\n"
938                         "{product_name:Archer A7,product_ver:5.0.0,special_id:54570000}\n"
939                         "{product_name:Archer A7,product_ver:5.0.0,special_id:52550000}\n",
940                 .part_trail = 0x00,
941                 .soft_ver = SOFT_VER_TEXT("soft_ver:7.0.0\n"),
942 
943                 /* We're using a dynamic kernel/rootfs split here */
944                 .partitions = {
945                         {"factory-boot", 0x00000, 0x20000},
946                         {"fs-uboot", 0x20000, 0x20000},
947                         {"firmware", 0x40000, 0xec0000},        /* Stock: name os-image base 0x40000 size 0x120000 */
948                                                                 /* Stock: name file-system base 0x160000 size 0xda0000 */
949                         {"default-mac", 0xf40000, 0x00200},
950                         {"pin", 0xf40200, 0x00200},
951                         {"device-id", 0xf40400, 0x00100},
952                         {"product-info", 0xf40500, 0x0fb00},
953                         {"soft-version", 0xf50000, 0x00100},
954                         {"extra-para", 0xf51000, 0x01000},
955                         {"support-list", 0xf52000, 0x0a000},
956                         {"profile", 0xf5c000, 0x04000},
957                         {"default-config", 0xf60000, 0x10000},
958                         {"user-config", 0xf70000, 0x40000},
959                         {"certificate", 0xfb0000, 0x10000},
960                         {"partition-table", 0xfc0000, 0x10000},
961                         {"log", 0xfd0000, 0x20000},
962                         {"radio", 0xff0000, 0x10000},
963                         {NULL, 0, 0}
964                 },
965 
966                 .first_sysupgrade_partition = "os-image",
967                 .last_sysupgrade_partition = "file-system",
968         },
969 
970         /** Firmware layout for the Archer A9 v6 */
971         {
972                 .id     = "ARCHER-A9-V6",
973                 .support_list =
974                         "SupportList:\n"
975                         "{product_name:Archer A9,product_ver:6.0,special_id:55530000}\n"
976                         "{product_name:Archer A9,product_ver:6.0,special_id:45550000}\n"
977                         "{product_name:Archer A9,product_ver:6.0,special_id:52550000}\n"
978                         "{product_name:Archer A9,product_ver:6.0,special_id:4A500000}\n"
979                         "{product_name:Archer C90,product_ver:6.0,special_id:55530000}\n",
980                 .part_trail = 0x00,
981                 .soft_ver = SOFT_VER_TEXT("soft_ver:1.1.0\n"),
982 
983                 /* We're using a dynamic kernel/rootfs split here */
984                 .partitions = {
985                         {"factory-boot", 0x00000, 0x20000},
986                         {"fs-uboot", 0x20000, 0x20000},
987                         {"partition-table", 0x40000, 0x10000},
988                         {"radio", 0x50000, 0x10000},
989                         {"default-mac", 0x60000, 0x00200},
990                         {"pin", 0x60200, 0x00200},
991                         {"device-id", 0x60400, 0x00100},
992                         {"product-info", 0x60500, 0x0fb00},
993                         {"soft-version", 0x70000, 0x01000},
994                         {"extra-para", 0x71000, 0x01000},
995                         {"support-list", 0x72000, 0x0a000},
996                         {"profile", 0x7c000, 0x04000},
997                         {"user-config", 0x80000, 0x10000},
998                         {"ap-config", 0x90000, 0x10000},
999                         {"apdef-config", 0xa0000, 0x10000},
1000                         {"router-config", 0xb0000, 0x10000},
1001                         {"firmware", 0xc0000, 0xf00000},        /* Stock: name os-image base 0xc0000 size 0x120000 */
1002                                                                 /* Stock: name file-system base 0x1e0000 size 0xde0000 */
1003                         {"log", 0xfc0000, 0x20000},
1004                         {"certificate", 0xfe0000, 0x10000},
1005                         {"default-config", 0xff0000, 0x10000},
1006                         {NULL, 0, 0}
1007                 },
1008 
1009                 .first_sysupgrade_partition = "os-image",
1010                 .last_sysupgrade_partition = "file-system",
1011         },
1012 
1013         /** Firmware layout for the Archer AX23 v1 */
1014         {
1015                 .id     = "ARCHER-AX23-V1",
1016                 .vendor = "",
1017                 .support_list =
1018                         "SupportList:\n"
1019                         "{product_name:Archer AX23,product_ver:1.0,special_id:45550000}\n"
1020                         "{product_name:Archer AX23,product_ver:1.0,special_id:4A500000}\n"
1021                         "{product_name:Archer AX23,product_ver:1.0,special_id:4B520000}\n"
1022                         "{product_name:Archer AX23,product_ver:1.0,special_id:52550000}\n"
1023                         "{product_name:Archer AX23,product_ver:1.0.0,special_id:43410000}\n"
1024                         "{product_name:Archer AX23,product_ver:1.0.0,special_id:54570000}\n"
1025                         "{product_name:Archer AX23,product_ver:1.0.0,special_id:55530000}\n"
1026                         "{product_name:Archer AX23,product_ver:1.20,special_id:45550000}\n"
1027                         "{product_name:Archer AX23,product_ver:1.20,special_id:4A500000}\n"
1028                         "{product_name:Archer AX23,product_ver:1.20,special_id:52550000}\n"
1029                         "{product_name:Archer AX23,product_ver:1.20,special_id:55530000}\n"
1030                         "{product_name:Archer AX1800,product_ver:1.20,special_id:45550000}\n"
1031                         "{product_name:Archer AX1800,product_ver:1.20,special_id:52550000}\n",
1032                 .part_trail = 0x00,
1033                 .soft_ver = SOFT_VER_TEXT("soft_ver:3.0.3\n"),
1034 
1035                 .partitions = {
1036                         {"fs-uboot", 0x00000, 0x40000},
1037                         {"firmware", 0x40000, 0xf60000},
1038                         {"default-mac", 0xfa0000, 0x00200},
1039                         {"pin", 0xfa0200, 0x00100},
1040                         {"device-id", 0xfa0300, 0x00100},
1041                         {"product-info", 0xfa0400, 0x0fc00},
1042                         {"default-config", 0xfb0000, 0x08000},
1043                         {"ap-def-config", 0xfb8000, 0x08000},
1044                         {"user-config", 0xfc0000, 0x0a000},
1045                         {"ag-config", 0xfca000, 0x04000},
1046                         {"certificate", 0xfce000, 0x02000},
1047                         {"ap-config", 0xfd0000, 0x06000},
1048                         {"router-config", 0xfd6000, 0x06000},
1049                         {"favicon", 0xfdc000, 0x02000},
1050                         {"logo", 0xfde000, 0x02000},
1051                         {"partition-table", 0xfe0000, 0x00800},
1052                         {"soft-version", 0xfe0800, 0x00100},
1053                         {"support-list", 0xfe0900, 0x00400},
1054                         {"profile", 0xfe0d00, 0x03000},
1055                         {"extra-para", 0xfe3d00, 0x00100},
1056                         {"radio", 0xff0000, 0x10000},
1057                         {NULL, 0, 0}
1058                 },
1059                 .first_sysupgrade_partition = "os-image",
1060                 .last_sysupgrade_partition = "file-system",
1061         },
1062         /** Firmware layout for the C2v3 */
1063         {
1064                 .id     = "ARCHER-C2-V3",
1065                 .support_list =
1066                         "SupportList:\n"
1067                         "{product_name:ArcherC2,product_ver:3.0.0,special_id:00000000}\n"
1068                         "{product_name:ArcherC2,product_ver:3.0.0,special_id:55530000}\n"
1069                         "{product_name:ArcherC2,product_ver:3.0.0,special_id:45550000}\n",
1070                 .part_trail = 0x00,
1071                 .soft_ver = SOFT_VER_TEXT("soft_ver:3.0.1\n"),
1072 
1073                 /** We're using a dynamic kernel/rootfs split here */
1074 
1075                 .partitions = {
1076                         {"factory-boot", 0x00000, 0x20000},
1077                         {"fs-uboot", 0x20000, 0x10000},
1078                         {"firmware", 0x30000, 0x7a0000},
1079                         {"user-config", 0x7d0000, 0x04000},
1080                         {"default-mac", 0x7e0000, 0x00100},
1081                         {"device-id", 0x7e0100, 0x00100},
1082                         {"extra-para", 0x7e0200, 0x00100},
1083                         {"pin", 0x7e0300, 0x00100},
1084                         {"support-list", 0x7e0400, 0x00400},
1085                         {"soft-version", 0x7e0800, 0x00400},
1086                         {"product-info", 0x7e0c00, 0x01400},
1087                         {"partition-table", 0x7e2000, 0x01000},
1088                         {"profile", 0x7e3000, 0x01000},
1089                         {"default-config", 0x7e4000, 0x04000},
1090                         {"merge-config", 0x7ec000, 0x02000},
1091                         {"qos-db", 0x7ee000, 0x02000},
1092                         {"radio", 0x7f0000, 0x10000},
1093                         {NULL, 0, 0}
1094                 },
1095 
1096                 .first_sysupgrade_partition = "os-image",
1097                 .last_sysupgrade_partition = "file-system",
1098         },
1099 
1100         /** Firmware layout for the C25v1 */
1101         {
1102                 .id     = "ARCHER-C25-V1",
1103                 .support_list =
1104                         "SupportList:\n"
1105                         "{product_name:ArcherC25,product_ver:1.0.0,special_id:00000000}\n"
1106                         "{product_name:ArcherC25,product_ver:1.0.0,special_id:55530000}\n"
1107                         "{product_name:ArcherC25,product_ver:1.0.0,special_id:45550000}\n",
1108                 .part_trail = 0x00,
1109                 .soft_ver = SOFT_VER_TEXT("soft_ver:1.0.0\n"),
1110 
1111                 /* We're using a dynamic kernel/rootfs split here */
1112                 .partitions = {
1113                         {"factory-boot", 0x00000, 0x20000},
1114                         {"fs-uboot", 0x20000, 0x10000},
1115                         {"firmware", 0x30000, 0x7a0000},        /* Stock: name os-image base 0x30000 size 0x100000 */
1116                                                                 /* Stock: name file-system base 0x130000 size 0x6a0000 */
1117                         {"user-config", 0x7d0000, 0x04000},
1118                         {"default-mac", 0x7e0000, 0x00100},
1119                         {"device-id", 0x7e0100, 0x00100},
1120                         {"extra-para", 0x7e0200, 0x00100},
1121                         {"pin", 0x7e0300, 0x00100},
1122                         {"support-list", 0x7e0400, 0x00400},
1123                         {"soft-version", 0x7e0800, 0x00400},
1124                         {"product-info", 0x7e0c00, 0x01400},
1125                         {"partition-table", 0x7e2000, 0x01000},
1126                         {"profile", 0x7e3000, 0x01000},
1127                         {"default-config", 0x7e4000, 0x04000},
1128                         {"merge-config", 0x7ec000, 0x02000},
1129                         {"qos-db", 0x7ee000, 0x02000},
1130                         {"radio", 0x7f0000, 0x10000},
1131                         {NULL, 0, 0}
1132                 },
1133 
1134                 .first_sysupgrade_partition = "os-image",
1135                 .last_sysupgrade_partition = "file-system",
1136         },
1137 
1138         /** Firmware layout for the C58v1 */
1139         {
1140                 .id     = "ARCHER-C58-V1",
1141                 .vendor = "",
1142                 .support_list =
1143                         "SupportList:\r\n"
1144                         "{product_name:Archer C58,product_ver:1.0.0,special_id:00000000}\r\n"
1145                         "{product_name:Archer C58,product_ver:1.0.0,special_id:45550000}\r\n"
1146                         "{product_name:Archer C58,product_ver:1.0.0,special_id:55530000}\r\n",
1147                 .part_trail = 0x00,
1148                 .soft_ver = SOFT_VER_TEXT("soft_ver:1.0.0\n"),
1149 
1150                 .partitions = {
1151                         {"fs-uboot", 0x00000, 0x10000},
1152                         {"default-mac", 0x10000, 0x00200},
1153                         {"pin", 0x10200, 0x00200},
1154                         {"product-info", 0x10400, 0x00100},
1155                         {"partition-table", 0x10500, 0x00800},
1156                         {"soft-version", 0x11300, 0x00200},
1157                         {"support-list", 0x11500, 0x00100},
1158                         {"device-id", 0x11600, 0x00100},
1159                         {"profile", 0x11700, 0x03900},
1160                         {"default-config", 0x15000, 0x04000},
1161                         {"user-config", 0x19000, 0x04000},
1162                         {"firmware", 0x20000, 0x7c8000},
1163                         {"certyficate", 0x7e8000, 0x08000},
1164                         {"radio", 0x7f0000, 0x10000},
1165                         {NULL, 0, 0}
1166                 },
1167 
1168                 .first_sysupgrade_partition = "os-image",
1169                 .last_sysupgrade_partition = "file-system",
1170         },
1171 
1172         /** Firmware layout for the C59v1 */
1173         {
1174                 .id     = "ARCHER-C59-V1",
1175                 .vendor = "",
1176                 .support_list =
1177                         "SupportList:\r\n"
1178                         "{product_name:Archer C59,product_ver:1.0.0,special_id:00000000}\r\n"
1179                         "{product_name:Archer C59,product_ver:1.0.0,special_id:43410000}\r\n"
1180                         "{product_name:Archer C59,product_ver:1.0.0,special_id:45550000}\r\n"
1181                         "{product_name:Archer C59,product_ver:1.0.0,special_id:52550000}\r\n"
1182                         "{product_name:Archer C59,product_ver:1.0.0,special_id:55530000}\r\n",
1183                 .part_trail = 0x00,
1184                 .soft_ver = SOFT_VER_TEXT("soft_ver:1.0.0\n"),
1185 
1186                 /* We're using a dynamic kernel/rootfs split here */
1187                 .partitions = {
1188                         {"fs-uboot", 0x00000, 0x10000},
1189                         {"default-mac", 0x10000, 0x00200},
1190                         {"pin", 0x10200, 0x00200},
1191                         {"device-id", 0x10400, 0x00100},
1192                         {"product-info", 0x10500, 0x0fb00},
1193                         {"firmware", 0x20000, 0xe30000},
1194                         {"partition-table", 0xe50000, 0x10000},
1195                         {"soft-version", 0xe60000, 0x10000},
1196                         {"support-list", 0xe70000, 0x10000},
1197                         {"profile", 0xe80000, 0x10000},
1198                         {"default-config", 0xe90000, 0x10000},
1199                         {"user-config", 0xea0000, 0x40000},
1200                         {"usb-config", 0xee0000, 0x10000},
1201                         {"certificate", 0xef0000, 0x10000},
1202                         {"qos-db", 0xf00000, 0x40000},
1203                         {"log", 0xfe0000, 0x10000},
1204                         {"radio", 0xff0000, 0x10000},
1205                         {NULL, 0, 0}
1206                 },
1207 
1208                 .first_sysupgrade_partition = "os-image",
1209                 .last_sysupgrade_partition = "file-system",
1210         },
1211 
1212         /** Firmware layout for the C59v2 */
1213         {
1214                 .id     = "ARCHER-C59-V2",
1215                 .vendor = "",
1216                 .support_list =
1217                         "SupportList:\r\n"
1218                         "{product_name:Archer C59,product_ver:2.0.0,special_id:00000000}\r\n"
1219                         "{product_name:Archer C59,product_ver:2.0.0,special_id:43410000}\r\n"
1220                         "{product_name:Archer C59,product_ver:2.0.0,special_id:45550000}\r\n"
1221                         "{product_name:Archer C59,product_ver:2.0.0,special_id:55530000}\r\n",
1222                 .part_trail = 0x00,
1223                 .soft_ver = SOFT_VER_TEXT("soft_ver:2.0.0 Build 20161206 rel.7303\n"),
1224 
1225                 /** We're using a dynamic kernel/rootfs split here */
1226                 .partitions = {
1227                         {"factory-boot", 0x00000, 0x20000},
1228                         {"fs-uboot", 0x20000, 0x10000},
1229                         {"default-mac", 0x30000, 0x00200},
1230                         {"pin", 0x30200, 0x00200},
1231                         {"device-id", 0x30400, 0x00100},
1232                         {"product-info", 0x30500, 0x0fb00},
1233                         {"firmware", 0x40000, 0xe10000},
1234                         {"partition-table", 0xe50000, 0x10000},
1235                         {"soft-version", 0xe60000, 0x10000},
1236                         {"support-list", 0xe70000, 0x10000},
1237                         {"profile", 0xe80000, 0x10000},
1238                         {"default-config", 0xe90000, 0x10000},
1239                         {"user-config", 0xea0000, 0x40000},
1240                         {"usb-config", 0xee0000, 0x10000},
1241                         {"certificate", 0xef0000, 0x10000},
1242                         {"extra-para", 0xf00000, 0x10000},
1243                         {"qos-db", 0xf10000, 0x30000},
1244                         {"log", 0xfe0000, 0x10000},
1245                         {"radio", 0xff0000, 0x10000},
1246                         {NULL, 0, 0}
1247                 },
1248 
1249                 .first_sysupgrade_partition = "os-image",
1250                 .last_sysupgrade_partition = "file-system",
1251         },
1252 
1253         /** Firmware layout for the Archer C6 v2 (EU/RU/JP) */
1254         {
1255                 .id     = "ARCHER-C6-V2",
1256                 .vendor = "",
1257                 .support_list =
1258                         "SupportList:\r\n"
1259                         "{product_name:Archer A6,product_ver:2.0.0,special_id:45550000}\r\n"
1260                         "{product_name:Archer A6,product_ver:2.0.0,special_id:52550000}\r\n"
1261                         "{product_name:Archer C6,product_ver:2.0.0,special_id:45550000}\r\n"
1262                         "{product_name:Archer C6,product_ver:2.0.0,special_id:52550000}\r\n"
1263                         "{product_name:Archer C6,product_ver:2.0.0,special_id:4A500000}\r\n",
1264                 .part_trail = 0x00,
1265                 .soft_ver = SOFT_VER_TEXT("soft_ver:1.9.1\n"),
1266 
1267                 .partitions = {
1268                         {"fs-uboot", 0x00000, 0x20000},
1269                         {"default-mac", 0x20000, 0x00200},
1270                         {"pin", 0x20200, 0x00100},
1271                         {"product-info", 0x20300, 0x00200},
1272                         {"device-id", 0x20500, 0x0fb00},
1273                         {"firmware", 0x30000, 0x7a9400},
1274                         {"soft-version", 0x7d9400, 0x00100},
1275                         {"extra-para", 0x7d9500, 0x00100},
1276                         {"support-list", 0x7d9600, 0x00200},
1277                         {"profile", 0x7d9800, 0x03000},
1278                         {"default-config", 0x7dc800, 0x03000},
1279                         {"partition-table", 0x7df800, 0x00800},
1280                         {"user-config", 0x7e0000, 0x0c000},
1281                         {"certificate", 0x7ec000, 0x04000},
1282                         {"radio", 0x7f0000, 0x10000},
1283                         {NULL, 0, 0}
1284                 },
1285 
1286                 .first_sysupgrade_partition = "os-image",
1287                 .last_sysupgrade_partition = "file-system",
1288         },
1289 
1290         /** Firmware layout for the Archer C6 v2 (US) and A6 v2 (US/TW) */
1291         {
1292                 .id     = "ARCHER-C6-V2-US",
1293                 .vendor = "",
1294                 .support_list =
1295                         "SupportList:\n"
1296                         "{product_name:Archer A6,product_ver:2.0.0,special_id:55530000}\n"
1297                         "{product_name:Archer A6,product_ver:2.0.0,special_id:54570000}\n"
1298                         "{product_name:Archer C6,product_ver:2.0.0,special_id:55530000}\n",
1299                 .part_trail = 0x00,
1300                 .soft_ver = SOFT_VER_TEXT("soft_ver:1.9.1\n"),
1301 
1302                 .partitions = {
1303                         {"factory-boot", 0x00000, 0x20000},
1304                         {"default-mac", 0x20000, 0x00200},
1305                         {"pin", 0x20200, 0x00100},
1306                         {"product-info", 0x20300, 0x00200},
1307                         {"device-id", 0x20500, 0x0fb00},
1308                         {"fs-uboot", 0x30000, 0x20000},
1309                         {"firmware", 0x50000, 0xf89400},
1310                         {"soft-version", 0xfd9400, 0x00100},
1311                         {"extra-para", 0xfd9500, 0x00100},
1312                         {"support-list", 0xfd9600, 0x00200},
1313                         {"profile", 0xfd9800, 0x03000},
1314                         {"default-config", 0xfdc800, 0x03000},
1315                         {"partition-table", 0xfdf800, 0x00800},
1316                         {"user-config", 0xfe0000, 0x0c000},
1317                         {"certificate", 0xfec000, 0x04000},
1318                         {"radio", 0xff0000, 0x10000},
1319                         {NULL, 0, 0}
1320                 },
1321                 .first_sysupgrade_partition = "os-image",
1322                 .last_sysupgrade_partition = "file-system",
1323         },
1324         /** Firmware layout for the Archer C6 v3 */
1325         {
1326                 .id     = "ARCHER-C6-V3",
1327                 .vendor = "",
1328                 .support_list =
1329                         "SupportList:\n"
1330                         "{product_name:Archer C6,product_ver:3.20,special_id:55530000}"
1331                         "{product_name:Archer C6,product_ver:3.20,special_id:45550000}"
1332                         "{product_name:Archer C6,product_ver:3.20,special_id:52550000}"
1333                         "{product_name:Archer C6,product_ver:3.20,special_id:4A500000}"
1334                         "{product_name:Archer C6,product_ver:3.20,special_id:4B520000}"
1335                         "{product_name:Archer C6,product_ver:3.0.0,special_id:42520000}",
1336                 .part_trail = 0x00,
1337                 .soft_ver = SOFT_VER_TEXT("soft_ver:1.0.9\n"),
1338 
1339                 .partitions = {
1340                         {"fs-uboot", 0x00000, 0x40000},
1341                         {"firmware", 0x40000, 0xf60000},
1342                         {"default-mac", 0xfa0000, 0x00200},
1343                         {"pin", 0xfa0200, 0x00100},
1344                         {"device-id", 0xfa0300, 0x00100},
1345                         {"product-info", 0xfa0400, 0x0fc00},
1346                         {"default-config", 0xfb0000, 0x08000},
1347                         {"ap-def-config", 0xfb8000, 0x08000},
1348                         {"user-config", 0xfc0000, 0x0a000},
1349                         {"ag-config", 0xfca000, 0x04000},
1350                         {"certificate", 0xfce000, 0x02000},
1351                         {"ap-config", 0xfd0000, 0x06000},
1352                         {"router-config", 0xfd6000, 0x06000},
1353                         {"favicon", 0xfdc000, 0x02000},
1354                         {"logo", 0xfde000, 0x02000},
1355                         {"partition-table", 0xfe0000, 0x00800},
1356                         {"soft-version", 0xfe0800, 0x00100},
1357                         {"support-list", 0xfe0900, 0x00200},
1358                         {"profile", 0xfe0b00, 0x03000},
1359                         {"extra-para", 0xfe3b00, 0x00100},
1360                         {"radio", 0xff0000, 0x10000},
1361                         {NULL, 0, 0}
1362                 },
1363                 .first_sysupgrade_partition = "os-image",
1364                 .last_sysupgrade_partition = "file-system",
1365         },
1366         /** Firmware layout for the Archer A6 v3  */
1367         {
1368                 .id     = "ARCHER-A6-V3",
1369                 .vendor = "",
1370                 .support_list =
1371                         "SupportList:\n"
1372                         "{product_name:Archer A6,product_ver:3.0.0,special_id:43410000}\n"
1373                         "{product_name:Archer A6,product_ver:3.0.0,special_id:55530000}\n"
1374                         "{product_name:Archer A6,product_ver:3.0.0,special_id:54570000}\n"
1375                         "{product_name:Archer A6,product_ver:3.0.0,special_id:4A500000}\n"
1376                         "{product_name:Archer A6,product_ver:3.20,special_id:45550000}\n"
1377                         "{product_name:Archer A6,product_ver:3.20,special_id:52550000}\n",
1378                 .part_trail = 0x00,
1379                 .soft_ver = SOFT_VER_TEXT("soft_ver:1.0.5\n"),
1380 
1381                 .partitions = {
1382                         {"fs-uboot", 0x00000, 0x40000},
1383                         {"firmware", 0x40000, 0xf60000},
1384                         {"default-mac", 0xfa0000, 0x00200},
1385                         {"pin", 0xfa0200, 0x00100},
1386                         {"device-id", 0xfa0300, 0x00100},
1387                         {"product-info", 0xfa0400, 0x0fc00},
1388                         {"default-config", 0xfb0000, 0x08000},
1389                         {"ap-def-config", 0xfb8000, 0x08000},
1390                         {"user-config", 0xfc0000, 0x0a000},
1391                         {"ag-config", 0xfca000, 0x04000},
1392                         {"certificate", 0xfce000, 0x02000},
1393                         {"ap-config", 0xfd0000, 0x06000},
1394                         {"router-config", 0xfd6000, 0x06000},
1395                         {"favicon", 0xfdc000, 0x02000},
1396                         {"logo", 0xfde000, 0x02000},
1397                         {"partition-table", 0xfe0000, 0x00800},
1398                         {"soft-version", 0xfe0800, 0x00100},
1399                         {"support-list", 0xfe0900, 0x00200},
1400                         {"profile", 0xfe0b00, 0x03000},
1401                         {"extra-para", 0xfe3b00, 0x00100},
1402                         {"radio", 0xff0000, 0x10000},
1403                         {NULL, 0, 0}
1404                 },
1405                 .first_sysupgrade_partition = "os-image",
1406                 .last_sysupgrade_partition = "file-system",
1407         },
1408         /** Firmware layout for the Archer C6U v1 */
1409         {
1410                 .id     = "ARCHER-C6U-V1",
1411                 .vendor = "",
1412                 .support_list =
1413                         "SupportList:\n"
1414                         "{product_name:Archer C6U,product_ver:1.0.0,special_id:45550000}\n"
1415                         "{product_name:Archer C6U,product_ver:1.0.0,special_id:52550000}\n",
1416                 .part_trail = 0x00,
1417                 .soft_ver = SOFT_VER_TEXT("soft_ver:1.0.2\n"),
1418 
1419                 .partitions = {
1420                         {"fs-uboot", 0x00000, 0x40000},
1421                         {"firmware", 0x40000, 0xf60000},
1422                         {"default-mac", 0xfa0000, 0x00200},
1423                         {"pin", 0xfa0200, 0x00100},
1424                         {"device-id", 0xfa0300, 0x00100},
1425                         {"product-info", 0xfa0400, 0x0fc00},
1426                         {"default-config", 0xfb0000, 0x08000},
1427                         {"ap-def-config", 0xfb8000, 0x08000},
1428                         {"user-config", 0xfc0000, 0x0c000},
1429                         {"certificate", 0xfcc000, 0x04000},
1430                         {"ap-config", 0xfd0000, 0x08000},
1431                         {"router-config", 0xfd8000, 0x08000},
1432                         {"partition-table", 0xfe0000, 0x00800},
1433                         {"soft-version", 0xfe0800, 0x00100},
1434                         {"support-list", 0xfe0900, 0x00200},
1435                         {"profile", 0xfe0b00, 0x03000},
1436                         {"extra-para", 0xfe3b00, 0x00100},
1437                         {"radio", 0xff0000, 0x10000},
1438                         {NULL, 0, 0}
1439                 },
1440                 .first_sysupgrade_partition = "os-image",
1441                 .last_sysupgrade_partition = "file-system",
1442         },
1443         /** Firmware layout for the C60v1 */
1444         {
1445                 .id     = "ARCHER-C60-V1",
1446                 .vendor = "",
1447                 .support_list =
1448                         "SupportList:\r\n"
1449                         "{product_name:Archer C60,product_ver:1.0.0,special_id:00000000}\r\n"
1450                         "{product_name:Archer C60,product_ver:1.0.0,special_id:43410000}\r\n"
1451                         "{product_name:Archer C60,product_ver:1.0.0,special_id:45550000}\r\n"
1452                         "{product_name:Archer C60,product_ver:1.0.0,special_id:55530000}\r\n",
1453                 .part_trail = 0x00,
1454                 .soft_ver = SOFT_VER_TEXT("soft_ver:1.0.0\n"),
1455 
1456                 .partitions = {
1457                         {"fs-uboot", 0x00000, 0x10000},
1458                         {"default-mac", 0x10000, 0x00200},
1459                         {"pin", 0x10200, 0x00200},
1460                         {"product-info", 0x10400, 0x00100},
1461                         {"partition-table", 0x10500, 0x00800},
1462                         {"soft-version", 0x11300, 0x00200},
1463                         {"support-list", 0x11500, 0x00100},
1464                         {"device-id", 0x11600, 0x00100},
1465                         {"profile", 0x11700, 0x03900},
1466                         {"default-config", 0x15000, 0x04000},
1467                         {"user-config", 0x19000, 0x04000},
1468                         {"firmware", 0x20000, 0x7c8000},
1469                         {"certyficate", 0x7e8000, 0x08000},
1470                         {"radio", 0x7f0000, 0x10000},
1471                         {NULL, 0, 0}
1472                 },
1473 
1474                 .first_sysupgrade_partition = "os-image",
1475                 .last_sysupgrade_partition = "file-system",
1476         },
1477 
1478         /** Firmware layout for the C60v2 */
1479         {
1480                 .id     = "ARCHER-C60-V2",
1481                 .vendor = "",
1482                 .support_list =
1483                         "SupportList:\r\n"
1484                         "{product_name:Archer C60,product_ver:2.0.0,special_id:42520000}\r\n"
1485                         "{product_name:Archer C60,product_ver:2.0.0,special_id:43410000}\r\n"
1486                         "{product_name:Archer C60,product_ver:2.0.0,special_id:45550000}\r\n"
1487                         "{product_name:Archer C60,product_ver:2.0.0,special_id:55530000}\r\n",
1488                 .part_trail = 0x00,
1489                 .soft_ver = SOFT_VER_TEXT("soft_ver:2.0.0\n"),
1490 
1491                 .partitions = {
1492                         {"factory-boot", 0x00000, 0x1fb00},
1493                         {"default-mac", 0x1fb00, 0x00200},
1494                         {"pin", 0x1fd00, 0x00100},
1495                         {"product-info", 0x1fe00, 0x00100},
1496                         {"device-id", 0x1ff00, 0x00100},
1497                         {"fs-uboot", 0x20000, 0x10000},
1498                         {"firmware", 0x30000, 0x7a0000},
1499                         {"soft-version", 0x7d9500, 0x00100},
1500                         {"support-list", 0x7d9600, 0x00100},
1501                         {"extra-para", 0x7d9700, 0x00100},
1502                         {"profile", 0x7d9800, 0x03000},
1503                         {"default-config", 0x7dc800, 0x03000},
1504                         {"partition-table", 0x7df800, 0x00800},
1505                         {"user-config", 0x7e0000, 0x0c000},
1506                         {"certificate", 0x7ec000, 0x04000},
1507                         {"radio", 0x7f0000, 0x10000},
1508                         {NULL, 0, 0}
1509                 },
1510 
1511                 .first_sysupgrade_partition = "os-image",
1512                 .last_sysupgrade_partition = "file-system",
1513         },
1514 
1515         /** Firmware layout for the C60v3 */
1516         {
1517                 .id     = "ARCHER-C60-V3",
1518                 .vendor = "",
1519                 .support_list =
1520                         "SupportList:\r\n"
1521                         "{product_name:Archer C60,product_ver:3.0.0,special_id:42520000}\r\n"
1522                         "{product_name:Archer C60,product_ver:3.0.0,special_id:43410000}\r\n"
1523                         "{product_name:Archer C60,product_ver:3.0.0,special_id:45550000}\r\n"
1524                         "{product_name:Archer C60,product_ver:3.0.0,special_id:55530000}\r\n",
1525                 .part_trail = 0x00,
1526                 .soft_ver = SOFT_VER_TEXT("soft_ver:3.0.0\n"),
1527 
1528                 .partitions = {
1529                         {"factory-boot", 0x00000, 0x1fb00},
1530                         {"default-mac", 0x1fb00, 0x00200},
1531                         {"pin", 0x1fd00, 0x00100},
1532                         {"product-info", 0x1fe00, 0x00100},
1533                         {"device-id", 0x1ff00, 0x00100},
1534                         {"fs-uboot", 0x20000, 0x10000},
1535                         {"firmware", 0x30000, 0x7a0000},
1536                         {"soft-version", 0x7d9500, 0x00100},
1537                         {"support-list", 0x7d9600, 0x00100},
1538                         {"extra-para", 0x7d9700, 0x00100},
1539                         {"profile", 0x7d9800, 0x03000},
1540                         {"default-config", 0x7dc800, 0x03000},
1541                         {"partition-table", 0x7df800, 0x00800},
1542                         {"user-config", 0x7e0000, 0x0c000},
1543                         {"certificate", 0x7ec000, 0x04000},
1544                         {"radio", 0x7f0000, 0x10000},
1545                         {NULL, 0, 0}
1546                 },
1547 
1548                 .first_sysupgrade_partition = "os-image",
1549                 .last_sysupgrade_partition = "file-system",
1550         },
1551 
1552         /** Firmware layout for the C5 */
1553         {
1554                 .id     = "ARCHER-C5-V2",
1555                 .vendor = "",
1556                 .support_list =
1557                         "SupportList:\r\n"
1558                         "{product_name:ArcherC5,product_ver:2.0.0,special_id:00000000}\r\n"
1559                         "{product_name:ArcherC5,product_ver:2.0.0,special_id:55530000}\r\n"
1560                         "{product_name:ArcherC5,product_ver:2.0.0,special_id:4A500000}\r\n", /* JP version */
1561                 .part_trail = 0x00,
1562                 .soft_ver = SOFT_VER_DEFAULT,
1563 
1564                 .partitions = {
1565                         {"fs-uboot", 0x00000, 0x40000},
1566                         {"os-image", 0x40000, 0x200000},
1567                         {"file-system", 0x240000, 0xc00000},
1568                         {"default-mac", 0xe40000, 0x00200},
1569                         {"pin", 0xe40200, 0x00200},
1570                         {"product-info", 0xe40400, 0x00200},
1571                         {"partition-table", 0xe50000, 0x10000},
1572                         {"soft-version", 0xe60000, 0x00200},
1573                         {"support-list", 0xe61000, 0x0f000},
1574                         {"profile", 0xe70000, 0x10000},
1575                         {"default-config", 0xe80000, 0x10000},
1576                         {"user-config", 0xe90000, 0x50000},
1577                         {"log", 0xee0000, 0x100000},
1578                         {"radio_bk", 0xfe0000, 0x10000},
1579                         {"radio", 0xff0000, 0x10000},
1580                         {NULL, 0, 0}
1581                 },
1582 
1583                 .first_sysupgrade_partition = "os-image",
1584                 .last_sysupgrade_partition = "file-system"
1585         },
1586 
1587         /** Firmware layout for the C7 */
1588         {
1589                 .id     = "ARCHER-C7-V4",
1590                 .support_list =
1591                         "SupportList:\n"
1592                         "{product_name:Archer C7,product_ver:4.0.0,special_id:00000000}\n"
1593                         "{product_name:Archer C7,product_ver:4.0.0,special_id:41550000}\n"
1594                         "{product_name:Archer C7,product_ver:4.0.0,special_id:45550000}\n"
1595                         "{product_name:Archer C7,product_ver:4.0.0,special_id:4B520000}\n"
1596                         "{product_name:Archer C7,product_ver:4.0.0,special_id:42520000}\n"
1597                         "{product_name:Archer C7,product_ver:4.0.0,special_id:4A500000}\n"
1598                         "{product_name:Archer C7,product_ver:4.0.0,special_id:52550000}\n"
1599                         "{product_name:Archer C7,product_ver:4.0.0,special_id:54570000}\n"
1600                         "{product_name:Archer C7,product_ver:4.0.0,special_id:55530000}\n"
1601                         "{product_name:Archer C7,product_ver:4.0.0,special_id:43410000}\n",
1602                 .part_trail = 0x00,
1603                 .soft_ver = SOFT_VER_TEXT("soft_ver:1.0.0\n"),
1604 
1605                 /* We're using a dynamic kernel/rootfs split here */
1606                 .partitions = {
1607                         {"factory-boot", 0x00000, 0x20000},
1608                         {"fs-uboot", 0x20000, 0x20000},
1609                         {"firmware", 0x40000, 0xEC0000},        /* Stock: name os-image base 0x40000 size 0x120000 */
1610                                                                 /* Stock: name file-system base 0x160000 size 0xda0000 */
1611                         {"default-mac", 0xf00000, 0x00200},
1612                         {"pin", 0xf00200, 0x00200},
1613                         {"device-id", 0xf00400, 0x00100},
1614                         {"product-info", 0xf00500, 0x0fb00},
1615                         {"soft-version", 0xf10000, 0x00100},
1616                         {"extra-para", 0xf11000, 0x01000},
1617                         {"support-list", 0xf12000, 0x0a000},
1618                         {"profile", 0xf1c000, 0x04000},
1619                         {"default-config", 0xf20000, 0x10000},
1620                         {"user-config", 0xf30000, 0x40000},
1621                         {"qos-db", 0xf70000, 0x40000},
1622                         {"certificate", 0xfb0000, 0x10000},
1623                         {"partition-table", 0xfc0000, 0x10000},
1624                         {"log", 0xfd0000, 0x20000},
1625                         {"radio", 0xff0000, 0x10000},
1626                         {NULL, 0, 0}
1627                 },
1628 
1629                 .first_sysupgrade_partition = "os-image",
1630                 .last_sysupgrade_partition = "file-system",
1631         },
1632 
1633         /** Firmware layout for the C7 v5*/
1634         {
1635                 .id     = "ARCHER-C7-V5",
1636                 .support_list =
1637                         "SupportList:\n"
1638                         "{product_name:Archer C7,product_ver:5.0.0,special_id:00000000}\n"
1639                         "{product_name:Archer C7,product_ver:5.0.0,special_id:45550000}\n"
1640                         "{product_name:Archer C7,product_ver:5.0.0,special_id:55530000}\n"
1641                         "{product_name:Archer C7,product_ver:5.0.0,special_id:43410000}\n"
1642                         "{product_name:Archer C7,product_ver:5.0.0,special_id:4A500000}\n"
1643                         "{product_name:Archer C7,product_ver:5.0.0,special_id:54570000}\n"
1644                         "{product_name:Archer C7,product_ver:5.0.0,special_id:52550000}\n"
1645                         "{product_name:Archer C7,product_ver:5.0.0,special_id:4B520000}\n",
1646 
1647                 .part_trail = 0x00,
1648                 .soft_ver = SOFT_VER_TEXT("soft_ver:7.0.0\n"),
1649 
1650                 /* We're using a dynamic kernel/rootfs split here */
1651                 .partitions = {
1652                         {"factory-boot",    0x00000,  0x20000},
1653                         {"fs-uboot",        0x20000,  0x20000},
1654                         {"partition-table", 0x40000,  0x10000},
1655                         {"radio",           0x50000,  0x10000},
1656                         {"default-mac",     0x60000,  0x00200},
1657                         {"pin",             0x60200,  0x00200},
1658                         {"device-id",       0x60400,  0x00100},
1659                         {"product-info",    0x60500,  0x0fb00},
1660                         {"soft-version",    0x70000,  0x01000},
1661                         {"extra-para",      0x71000,  0x01000},
1662                         {"support-list",    0x72000,  0x0a000},
1663                         {"profile",         0x7c000,  0x04000},
1664                         {"user-config",     0x80000,  0x40000},
1665 
1666 
1667                         {"firmware",        0xc0000,  0xf00000},        /* Stock: name os-image base 0xc0000  size 0x120000 */
1668                                                                         /* Stock: name file-system base 0x1e0000 size 0xde0000 */
1669 
1670                         {"log",             0xfc0000, 0x20000},
1671                         {"certificate",     0xfe0000, 0x10000},
1672                         {"default-config",  0xff0000, 0x10000},
1673                         {NULL, 0, 0}
1674 
1675                 },
1676 
1677                 .first_sysupgrade_partition = "os-image",
1678                 .last_sysupgrade_partition = "file-system",
1679         },
1680 
1681         /** Firmware layout for the C9 */
1682         {
1683                 .id     = "ARCHERC9",
1684                 .vendor = "",
1685                 .support_list =
1686                         "SupportList:\n"
1687                         "{product_name:ArcherC9,"
1688                         "product_ver:1.0.0,"
1689                         "special_id:00000000}\n",
1690                 .part_trail = 0x00,
1691                 .soft_ver = SOFT_VER_DEFAULT,
1692 
1693                 .partitions = {
1694                         {"fs-uboot", 0x00000, 0x40000},
1695                         {"os-image", 0x40000, 0x200000},
1696                         {"file-system", 0x240000, 0xc00000},
1697                         {"default-mac", 0xe40000, 0x00200},
1698                         {"pin", 0xe40200, 0x00200},
1699                         {"product-info", 0xe40400, 0x00200},
1700                         {"partition-table", 0xe50000, 0x10000},
1701                         {"soft-version", 0xe60000, 0x00200},
1702                         {"support-list", 0xe61000, 0x0f000},
1703                         {"profile", 0xe70000, 0x10000},
1704                         {"default-config", 0xe80000, 0x10000},
1705                         {"user-config", 0xe90000, 0x50000},
1706                         {"log", 0xee0000, 0x100000},
1707                         {"radio_bk", 0xfe0000, 0x10000},
1708                         {"radio", 0xff0000, 0x10000},
1709                         {NULL, 0, 0}
1710                 },
1711 
1712                 .first_sysupgrade_partition = "os-image",
1713                 .last_sysupgrade_partition = "file-system"
1714         },
1715 
1716         /** Firmware layout for the Deco M4R v1 and v2 */
1717         {
1718                 .id     = "DECO-M4R-V1",
1719                 .vendor = "",
1720                 .support_list =
1721                         "SupportList:\n"
1722                         "{product_name:M4R,product_ver:1.0.0,special_id:55530000}\n"
1723                         "{product_name:M4R,product_ver:1.0.0,special_id:45550000}\n"
1724                         "{product_name:M4R,product_ver:1.0.0,special_id:43410000}\n"
1725                         "{product_name:M4R,product_ver:1.0.0,special_id:4A500000}\n"
1726                         "{product_name:M4R,product_ver:1.0.0,special_id:41550000}\n"
1727                         "{product_name:M4R,product_ver:1.0.0,special_id:4B520000}\n"
1728                         "{product_name:M4R,product_ver:1.0.0,special_id:49440000}\n"
1729                         "{product_name:M4R,product_ver:2.0.0,special_id:55530000}\n"
1730                         "{product_name:M4R,product_ver:2.0.0,special_id:45550000}\n"
1731                         "{product_name:M4R,product_ver:2.0.0,special_id:43410000}\n"
1732                         "{product_name:M4R,product_ver:2.0.0,special_id:4A500000}\n"
1733                         "{product_name:M4R,product_ver:2.0.0,special_id:41550000}\n"
1734                         "{product_name:M4R,product_ver:2.0.0,special_id:4B520000}\n"
1735                         "{product_name:M4R,product_ver:2.0.0,special_id:54570000}\n"
1736                         "{product_name:M4R,product_ver:2.0.0,special_id:42340000}\n"
1737                         "{product_name:M4R,product_ver:2.0.0,special_id:49440000}\n",
1738                 .part_trail = 0x00,
1739                 .soft_ver = SOFT_VER_DEFAULT,
1740 
1741                 .partitions = {
1742                         {"fs-uboot", 0x00000, 0x80000},
1743                         {"firmware", 0x80000, 0xe00000},
1744                         {"product-info", 0xe80000, 0x05000},
1745                         {"default-mac", 0xe85000, 0x01000},
1746                         {"device-id", 0xe86000, 0x01000},
1747                         {"support-list", 0xe87000, 0x10000},
1748                         {"user-config", 0xea7000, 0x10000},
1749                         {"device-config", 0xeb7000, 0x10000},
1750                         {"group-info", 0xec7000, 0x10000},
1751                         {"partition-table", 0xed7000, 0x02000},
1752                         {"soft-version", 0xed9000, 0x10000},
1753                         {"profile", 0xee9000, 0x10000},
1754                         {"default-config", 0xef9000, 0x10000},
1755                         {"url-sig", 0xfe0000, 0x10000},
1756                         {"radio", 0xff0000, 0x10000},
1757                         {NULL, 0, 0}
1758                 },
1759                 .first_sysupgrade_partition = "os-image",
1760                 .last_sysupgrade_partition = "file-system",
1761         },
1762 
1763         /** Firmware layout for the Deco M4R v4 */
1764         {
1765                 .id     = "DECO-M4R-V4",
1766                 .vendor = "",
1767                 .support_list =
1768                         "SupportList:\n"
1769                         "{product_name:M4R,product_ver:4.0.0,special_id:55530000}\n"
1770                         "{product_name:M4R,product_ver:4.0.0,special_id:45550000}\n"
1771                         "{product_name:M4R,product_ver:4.0.0,special_id:4A500000}\n"
1772                         "{product_name:M4R,product_ver:4.0.0,special_id:42340000}\n"
1773                         "{product_name:M4R,product_ver:4.0.0,special_id:5A470000}\n",
1774                 .part_trail = 0x00,
1775                 .soft_ver = SOFT_VER_TEXT("soft_ver:1.0.0\n"),
1776 
1777                 .partitions = {
1778                         {"fs-uboot", 0x00000, 0x40000},
1779                         {"firmware", 0x40000, 0xf60000},
1780                         {"default-mac", 0xfa0000, 0x00300},
1781                         {"device-id", 0xfa0300, 0x00100},
1782                         {"product-info", 0xfa0400, 0x0fc00},
1783                         {"group-info", 0xfb0000, 0x04000},
1784                         {"user-config", 0xfb4000, 0x0c000},
1785                         {"device-config", 0xfc0000, 0x10000},
1786                         {"default-config", 0xfd0000, 0x10000},
1787                         {"partition-table", 0xfe0000, 0x00800},
1788                         {"soft-version", 0xfe0800, 0x00100},
1789                         {"support-list", 0xfe0900, 0x00200},
1790                         {"profile", 0xfe0b00, 0x03000},
1791                         {"extra-para", 0xfe3b00, 0x00100},
1792                         {"radio", 0xff0000, 0x10000},
1793                         {NULL, 0, 0}
1794                 },
1795                 .first_sysupgrade_partition = "os-image",
1796                 .last_sysupgrade_partition = "file-system",
1797         },
1798 
1799         /** Firmware layout for the Deco M5 */
1800         {
1801                 .id = "DECO-M5",
1802                 .vendor = "",
1803                 .support_list =
1804                         "SupportList:\n"
1805                         "{product_name:M5,product_ver:1.0.0,special_id:55530000}\n"
1806                         "{product_name:M5,product_ver:1.0.0,special_id:45550000}\n"
1807                         "{product_name:M5,product_ver:1.0.0,special_id:43410000}\n"
1808                         "{product_name:M5,product_ver:1.0.0,special_id:4A500000}\n"
1809                         "{product_name:M5,product_ver:1.0.0,special_id:41550000}\n"
1810                         "{product_name:M5,product_ver:1.0.0,special_id:4B520000}\n"
1811                         "{product_name:M5,product_ver:1.0.0,special_id:49440000}\n"
1812                         "{product_name:M5,product_ver:3.0.0,special_id:55530000}\n"
1813                         "{product_name:M5,product_ver:3.0.0,special_id:45550000}\n"
1814                         "{product_name:M5,product_ver:3.0.0,special_id:43410000}\n"
1815                         "{product_name:M5,product_ver:3.0.0,special_id:4A500000}\n"
1816                         "{product_name:M5,product_ver:3.0.0,special_id:41550000}\n"
1817                         "{product_name:M5,product_ver:3.0.0,special_id:4B520000}\n"
1818                         "{product_name:M5,product_ver:3.0.0,special_id:49440000}\n"
1819                         "{product_name:M5,product_ver:3.0.0,special_id:53570000}\n"
1820                         "{product_name:M5,product_ver:3.0.0,special_id:42340000}\n"
1821                         "{product_name:M5,product_ver:3.0.0,special_id:54570000}\n"
1822                         "{product_name:M5,product_ver:3.2.0,special_id:55530000}\n"
1823                         "{product_name:M5,product_ver:3.2.0,special_id:45550000}\n"
1824                         "{product_name:M5,product_ver:3.2.0,special_id:43410000}\n"
1825                         "{product_name:M5,product_ver:3.2.0,special_id:4A500000}\n"
1826                         "{product_name:M5,product_ver:3.2.0,special_id:41550000}\n"
1827                         "{product_name:M5,product_ver:3.2.0,special_id:4B520000}\n"
1828                         "{product_name:M5,product_ver:3.2.0,special_id:49440000}\n"
1829                         "{product_name:M5,product_ver:3.2.0,special_id:53570000}\n"
1830                         "{product_name:M5,product_ver:3.2.0,special_id:42340000}\n"
1831                         "{product_name:M5,product_ver:3.2.0,special_id:54570000}\n",
1832                 .part_trail = 0x00,
1833                 .soft_ver = SOFT_VER_DEFAULT,
1834 
1835                 .partitions = {
1836                         {"SBL1", 0x00000, 0x30000},
1837                         {"boot-config_0", 0x30000, 0x10000},
1838                         {"MIBIB", 0x40000, 0x10000},
1839                         {"boot-config_1", 0x50000, 0x10000},
1840                         {"QSEE", 0x60000, 0x60000},
1841                         {"CDT", 0xc0000, 0x10000},
1842                         {"DDRPARAMS", 0xd0000, 0x10000},
1843                         {"uboot-env", 0xe0000, 0x10000},
1844                         {"fs-uboot@0", 0xf0000, 0x80000},
1845                         {"radio", 0x170000, 0x0fff0},
1846                         {"bluetooth-XTAL", 0x17fff0, 0x00010},
1847                         {"default-mac", 0x180000, 0x01000},
1848                         {"device-id", 0x182000, 0x01000},
1849                         {"product-info", 0x183000, 0x05000},
1850                         {"support-list", 0x190000, 0x10000},
1851                         {"user-config", 0x200000, 0x10000},
1852                         {"device-config", 0x210000, 0x10000},
1853                         {"group-info", 0x220000, 0x10000},
1854                         {"partition-table@0", 0x230000, 0x02000},
1855                         {"os-image@0", 0x240000, 0x300000},
1856                         {"file-system@0", 0x540000, 0x790000},
1857                         {"soft-version@0", 0xcd0000, 0x10000},
1858                         {"profile@0", 0xce0000, 0x10000},
1859                         {"default-config@0", 0xcf0000, 0x10000},
1860                         {"partition-table@1", 0xd00000, 0x02000},
1861                         {"fs-uboot@1", 0xd10000, 0x80000},
1862                         {"os-image@1", 0xd90000, 0x400000},
1863                         {"file-system@1", 0x1190000, 0xc40000},
1864                         {"soft-version@1", 0x1dd0000, 0x10000},
1865                         {"profile@1", 0x1de0000, 0x10000},
1866                         {"default-config@1", 0x1df0000, 0x10000},
1867                         {"tm-sig", 0x1e00000, 0x200000},
1868                         {NULL, 0, 0}
1869                 },
1870 
1871                 .partition_names.partition_table = "partition-table@1",
1872                 .partition_names.soft_ver = "soft-version@1",
1873                 .partition_names.os_image = "os-image@1",
1874                 .partition_names.file_system = "file-system@1",
1875 
1876                 .first_sysupgrade_partition = "os-image@1",
1877                 .last_sysupgrade_partition = "file-system@1"
1878         },
1879 
1880         /** Firmware layout for the Deco S4 v2 */
1881         {
1882                 .id     = "DECO-S4-V2",
1883                 .vendor = "",
1884                 .support_list =
1885                         "SupportList:\n"
1886                         "{product_name:S4,product_ver:1.0.0,special_id:55530000}\n"
1887                         "{product_name:S4,product_ver:1.0.0,special_id:45550000}\n"
1888                         "{product_name:S4,product_ver:1.0.0,special_id:43410000}\n"
1889                         "{product_name:S4,product_ver:1.0.0,special_id:4A500000}\n"
1890                         "{product_name:S4,product_ver:1.0.0,special_id:41550000}\n"
1891                         "{product_name:S4,product_ver:1.0.0,special_id:4B520000}\n"
1892                         "{product_name:S4,product_ver:2.0.0,special_id:55530000}\n"
1893                         "{product_name:S4,product_ver:2.0.0,special_id:45550000}\n"
1894                         "{product_name:S4,product_ver:2.0.0,special_id:43410000}\n"
1895                         "{product_name:S4,product_ver:2.0.0,special_id:4A500000}\n"
1896                         "{product_name:S4,product_ver:2.0.0,special_id:41550000}\n"
1897                         "{product_name:S4,product_ver:2.0.0,special_id:4B520000}\n",
1898                 .part_trail = 0x00,
1899                 .soft_ver = SOFT_VER_DEFAULT,
1900 
1901                 .partitions = {
1902                         {"fs-uboot", 0x00000, 0x80000},
1903                         {"product-info", 0x80000, 0x05000},
1904                         {"default-mac", 0x85000, 0x01000},
1905                         {"device-id", 0x86000, 0x01000},
1906                         {"support-list", 0x87000, 0x10000},
1907                         {"user-config", 0xa7000, 0x10000},
1908                         {"device-config", 0xb7000, 0x10000},
1909                         {"group-info", 0xc7000, 0x10000},
1910                         {"partition-table", 0xd7000, 0x02000},
1911                         {"soft-version", 0xd9000, 0x10000},
1912                         {"profile", 0xe9000, 0x10000},
1913                         {"default-config", 0xf9000, 0x10000},
1914                         {"url-sig", 0x1e0000, 0x10000},
1915                         {"radio", 0x1f0000, 0x10000},
1916                         {"firmware", 0x200000, 0xe00000},
1917                         {NULL, 0, 0}
1918                 },
1919                 .first_sysupgrade_partition = "os-image",
1920                 .last_sysupgrade_partition = "file-system",
1921         },
1922 
1923         /** Firmware layout for the EAP120 */
1924         {
1925                 .id     = "EAP120",
1926                 .vendor = "EAP120(TP-LINK|UN|N300-2):1.0\r\n",
1927                 .support_list =
1928                         "SupportList:\r\n"
1929                         "EAP120(TP-LINK|UN|N300-2):1.0\r\n",
1930                 .part_trail = 0xff,
1931                 .soft_ver = SOFT_VER_DEFAULT,
1932 
1933                 .partitions = {
1934                         {"fs-uboot", 0x00000, 0x20000},
1935                         {"partition-table", 0x20000, 0x02000},
1936                         {"default-mac", 0x30000, 0x00020},
1937                         {"support-list", 0x31000, 0x00100},
1938                         {"product-info", 0x31100, 0x00100},
1939                         {"soft-version", 0x32000, 0x00100},
1940                         {"os-image", 0x40000, 0x180000},
1941                         {"file-system", 0x1c0000, 0x600000},
1942                         {"user-config", 0x7c0000, 0x10000},
1943                         {"backup-config", 0x7d0000, 0x10000},
1944                         {"log", 0x7e0000, 0x10000},
1945                         {"radio", 0x7f0000, 0x10000},
1946                         {NULL, 0, 0}
1947                 },
1948 
1949                 .first_sysupgrade_partition = "os-image",
1950                 .last_sysupgrade_partition = "file-system"
1951         },
1952 
1953         /** Firmware layout for the EAP225-Outdoor v1 */
1954         {
1955                 .id     = "EAP225-OUTDOOR-V1",
1956                 .support_list =
1957                         "SupportList:\r\n"
1958                         "EAP225-Outdoor(TP-Link|UN|AC1200-D):1.0\r\n",
1959                 .part_trail = PART_TRAIL_NONE,
1960                 .soft_ver = SOFT_VER_DEFAULT,
1961                 .soft_ver_compat_level = 2,
1962 
1963                 .partitions = {
1964                         {"fs-uboot", 0x00000, 0x20000},
1965                         {"partition-table", 0x20000, 0x02000},
1966                         {"default-mac", 0x30000, 0x01000},
1967                         {"support-list", 0x31000, 0x00100},
1968                         {"product-info", 0x31100, 0x00400},
1969                         {"soft-version", 0x32000, 0x00100},
1970                         {"firmware", 0x40000, 0xd80000},
1971                         {"user-config", 0xdc0000, 0x30000},
1972                         {"mutil-log", 0xf30000, 0x80000},
1973                         {"oops", 0xfb0000, 0x40000},
1974                         {"radio", 0xff0000, 0x10000},
1975                         {NULL, 0, 0}
1976                 },
1977 
1978                 .first_sysupgrade_partition = "os-image",
1979                 .last_sysupgrade_partition = "file-system"
1980         },
1981 
1982         /** Firmware layout for the EAP225 v1 */
1983         {
1984                 .id     = "EAP225-V1",
1985                 .support_list =
1986                         "SupportList:\r\n"
1987                         "EAP225(TP-LINK|UN|AC1200-D):1.0\r\n",
1988                 .part_trail = PART_TRAIL_NONE,
1989                 .soft_ver = SOFT_VER_DEFAULT,
1990 
1991                 .partitions = {
1992                         {"fs-uboot", 0x00000, 0x20000},
1993                         {"partition-table", 0x20000, 0x02000},
1994                         {"default-mac", 0x30000, 0x01000},
1995                         {"support-list", 0x31000, 0x00100},
1996                         {"product-info", 0x31100, 0x00400},
1997                         {"soft-version", 0x32000, 0x00100},
1998                         {"firmware", 0x40000, 0xd80000},
1999                         {"user-config", 0xdc0000, 0x30000},
2000                         {"radio", 0xff0000, 0x10000},
2001                         {NULL, 0, 0}
2002                 },
2003 
2004                 .first_sysupgrade_partition = "os-image",
2005                 .last_sysupgrade_partition = "file-system"
2006         },
2007 
2008         /** Firmware layout for the EAP225 v3
2009          * Also compatible with:
2010          *   - EAP225 v3.20
2011          *   - EAP225 v4
2012          *   - EAP225-Outdoor v1
2013          *   - EAP225-Outdoor v3
2014          *   */
2015         {
2016                 .id     = "EAP225-V3",
2017                 .support_list =
2018                         "SupportList:\r\n"
2019                         "EAP225(TP-Link|UN|AC1350-D):3.0\r\n"
2020                         "EAP225(TP-Link|UN|AC1350-D):3.20\r\n"
2021                         "EAP225(TP-Link|UN|AC1350-D):4.0 CA\r\n"
2022                         "EAP225-Outdoor(TP-Link|UN|AC1200-D):1.0\r\n"
2023                         "EAP225-Outdoor(TP-Link|UN|AC1200-D):3.0 CA,JP\r\n",
2024                 .part_trail = PART_TRAIL_NONE,
2025                 .soft_ver = SOFT_VER_DEFAULT,
2026                 .soft_ver_compat_level = 2,
2027 
2028                 .partitions = {
2029                         {"fs-uboot", 0x00000, 0x20000},
2030                         {"partition-table", 0x20000, 0x02000},
2031                         {"default-mac", 0x30000, 0x01000},
2032                         {"support-list", 0x31000, 0x00100},
2033                         {"product-info", 0x31100, 0x00400},
2034                         {"soft-version", 0x32000, 0x00100},
2035                         {"firmware", 0x40000, 0xd80000},
2036                         {"user-config", 0xdc0000, 0x30000},
2037                         {"mutil-log", 0xf30000, 0x80000},
2038                         {"oops", 0xfb0000, 0x40000},
2039                         {"radio", 0xff0000, 0x10000},
2040                         {NULL, 0, 0}
2041                 },
2042 
2043                 .first_sysupgrade_partition = "os-image",
2044                 .last_sysupgrade_partition = "file-system"
2045         },
2046 
2047         /** Firmware layout for the EAP225-Wall v2 */
2048         {
2049                 .id     = "EAP225-WALL-V2",
2050                 .support_list =
2051                         "SupportList:\r\n"
2052                         "EAP225-Wall(TP-Link|UN|AC1200-D):2.0\r\n",
2053                 .part_trail = PART_TRAIL_NONE,
2054                 .soft_ver = SOFT_VER_DEFAULT,
2055                 .soft_ver_compat_level = 1,
2056 
2057                 .partitions = {
2058                         {"fs-uboot", 0x00000, 0x20000},
2059                         {"partition-table", 0x20000, 0x02000},
2060                         {"default-mac", 0x30000, 0x01000},
2061                         {"support-list", 0x31000, 0x00100},
2062                         {"product-info", 0x31100, 0x00400},
2063                         {"soft-version", 0x32000, 0x00100},
2064                         {"firmware", 0x40000, 0xd80000},
2065                         {"user-config", 0xdc0000, 0x30000},
2066                         {"mutil-log", 0xf30000, 0x80000},
2067                         {"oops", 0xfb0000, 0x40000},
2068                         {"radio", 0xff0000, 0x10000},
2069                         {NULL, 0, 0}
2070                 },
2071 
2072                 .first_sysupgrade_partition = "os-image",
2073                 .last_sysupgrade_partition = "file-system"
2074         },
2075 
2076         /** Firmware layout for the EAP235-Wall v1 */
2077         {
2078                 .id     = "EAP235-WALL-V1",
2079                 .support_list =
2080                         "SupportList:\r\n"
2081                         "EAP235-Wall(TP-Link|UN|AC1200-D):1.0\r\n",
2082                 .part_trail = PART_TRAIL_NONE,
2083                 .soft_ver = SOFT_VER_NUMERIC(3, 0, 0),
2084                 .soft_ver_compat_level = 1,
2085 
2086                 .partitions = {
2087                         {"fs-uboot", 0x00000, 0x80000},
2088                         {"partition-table", 0x80000, 0x02000},
2089                         {"default-mac", 0x90000, 0x01000},
2090                         {"support-list", 0x91000, 0x00100},
2091                         {"product-info", 0x91100, 0x00400},
2092                         {"soft-version", 0x92000, 0x00100},
2093                         {"firmware", 0xa0000, 0xd20000},
2094                         {"user-config", 0xdc0000, 0x30000},
2095                         {"mutil-log", 0xf30000, 0x80000},
2096                         {"oops", 0xfb0000, 0x40000},
2097                         {"radio", 0xff0000, 0x10000},
2098                         {NULL, 0, 0}
2099                 },
2100 
2101                 .first_sysupgrade_partition = "os-image",
2102                 .last_sysupgrade_partition = "file-system"
2103         },
2104 
2105         /** Firmware layout for the EAP245 v1 */
2106         {
2107                 .id     = "EAP245-V1",
2108                 .support_list =
2109                         "SupportList:\r\n"
2110                         "EAP245(TP-LINK|UN|AC1750-D):1.0\r\n",
2111                 .part_trail = PART_TRAIL_NONE,
2112                 .soft_ver = SOFT_VER_DEFAULT,
2113 
2114                 .partitions = {
2115                         {"fs-uboot", 0x00000, 0x20000},
2116                         {"partition-table", 0x20000, 0x02000},
2117                         {"default-mac", 0x30000, 0x01000},
2118                         {"support-list", 0x31000, 0x00100},
2119                         {"product-info", 0x31100, 0x00400},
2120                         {"soft-version", 0x32000, 0x00100},
2121                         {"firmware", 0x40000, 0xd80000},
2122                         {"user-config", 0xdc0000, 0x30000},
2123                         {"radio", 0xff0000, 0x10000},
2124                         {NULL, 0, 0}
2125                 },
2126 
2127                 .first_sysupgrade_partition = "os-image",
2128                 .last_sysupgrade_partition = "file-system"
2129         },
2130 
2131         /** Firmware layout for the EAP245 v3 */
2132         {
2133                 .id     = "EAP245-V3",
2134                 .support_list =
2135                         "SupportList:\r\n"
2136                         "EAP245(TP-Link|UN|AC1750-D):3.0\r\n"
2137                         "EAP265 HD(TP-Link|UN|AC1750-D):1.0",
2138                 .part_trail = PART_TRAIL_NONE,
2139                 .soft_ver = SOFT_VER_DEFAULT,
2140                 .soft_ver_compat_level = 1,
2141 
2142                 /** Firmware partition with dynamic kernel/rootfs split */
2143                 .partitions = {
2144                         {"factroy-boot", 0x00000, 0x40000},
2145                         {"fs-uboot", 0x40000, 0x40000},
2146                         {"partition-table", 0x80000, 0x10000},
2147                         {"default-mac", 0x90000, 0x01000},
2148                         {"support-list", 0x91000, 0x00100},
2149                         {"product-info", 0x91100, 0x00400},
2150                         {"soft-version", 0x92000, 0x00100},
2151                         {"radio", 0xa0000, 0x10000},
2152                         {"extra-para", 0xb0000, 0x10000},
2153                         {"firmware", 0xc0000, 0xe40000},
2154                         {"config", 0xf00000, 0x30000},
2155                         {"mutil-log", 0xf30000, 0x80000},
2156                         {"oops", 0xfb0000, 0x40000},
2157                         {NULL, 0, 0}
2158                 },
2159 
2160                 .first_sysupgrade_partition = "os-image",
2161                 .last_sysupgrade_partition = "file-system"
2162         },
2163 
2164         /** Firmware layout for the EAP610 v3/EAP613 v1 */
2165         {
2166                 .id = "EAP610-V3",
2167                 .soft_ver = SOFT_VER_DEFAULT,
2168                 .soft_ver_compat_level = 2,
2169                 .support_list =
2170                         "SupportList:\r\n"
2171                         "EAP610(TP-Link|UN|AX1800-D):3.0\r\n"
2172                         "EAP610(TP-Link|JP|AX1800-D):3.0\r\n"
2173                         "EAP610(TP-Link|EG|AX1800-D):3.0\r\n"
2174                         "EAP610(TP-Link|CA|AX1800-D):3.0\r\n"
2175                         "EAP613(TP-Link|UN|AX1800-D):1.0 JP\r\n",
2176                 .part_trail = PART_TRAIL_NONE,
2177 
2178                 .partitions = {
2179                         {"fs-uboot", 0x00000, 0x80000},
2180                         {"partition-table", 0x80000, 0x02000},
2181                         {"default-mac", 0x90000, 0x01000},
2182                         {"support-list", 0x91000, 0x00100},
2183                         {"product-info", 0x91100, 0x00400},
2184                         {"soft-version", 0x92000, 0x00100},
2185                         {"firmware", 0xa0000, 0xcf0000},
2186                         {"user-config", 0xd90000, 0x60000},
2187                         {"mutil-log", 0xf30000, 0x80000},
2188                         {"oops", 0xfb0000, 0x40000},
2189                         {"radio", 0xff0000, 0x10000},
2190                         {NULL, 0, 0}
2191                 },
2192 
2193                 .first_sysupgrade_partition = "os-image",
2194                 .last_sysupgrade_partition = "file-system"
2195         },
2196 
2197         /** Firmware layout for the EAP615-Wall v1 */
2198         {
2199                 .id = "EAP615-WALL-V1",
2200                 .soft_ver = SOFT_VER_DEFAULT,
2201                 .soft_ver_compat_level = 2,
2202                 .support_list =
2203                         "SupportList:\r\n"
2204                         "EAP615-Wall(TP-Link|UN|AX1800-D):1.0\r\n"
2205                         "EAP615-Wall(TP-Link|CA|AX1800-D):1.0\r\n"
2206                         "EAP615-Wall(TP-Link|JP|AX1800-D):1.0\r\n",
2207                 .part_trail = PART_TRAIL_NONE,
2208 
2209                 .partitions = {
2210                         {"fs-uboot", 0x00000, 0x80000},
2211                         {"partition-table", 0x80000, 0x02000},
2212                         {"default-mac", 0x90000, 0x01000},
2213                         {"support-list", 0x91000, 0x00100},
2214                         {"product-info", 0x91100, 0x00400},
2215                         {"soft-version", 0x92000, 0x00100},
2216                         {"firmware", 0xa0000, 0xcf0000},
2217                         {"user-config", 0xd90000, 0x60000},
2218                         {"mutil-log", 0xf30000, 0x80000},
2219                         {"oops", 0xfb0000, 0x40000},
2220                         {"radio", 0xff0000, 0x10000},
2221                         {NULL, 0, 0}
2222                 },
2223 
2224                 .first_sysupgrade_partition = "os-image",
2225                 .last_sysupgrade_partition = "file-system"
2226         },
2227 
2228         /** Firmware layout for the TL-WA1201 v2 */
2229         {
2230                 .id     = "TL-WA1201-V2",
2231                 .vendor = "",
2232                 .support_list =
2233                         "SupportList:\n"
2234                         "{product_name:TL-WA1201,product_ver:2.0.0,special_id:45550000}\n"
2235                         "{product_name:TL-WA1201,product_ver:2.0.0,special_id:55530000}\n",
2236                 .part_trail = 0x00,
2237                 .soft_ver = SOFT_VER_TEXT("soft_ver:1.0.1 Build 20200709 rel.66244\n"),
2238 
2239                 .partitions = {
2240                         {"fs-uboot", 0x00000, 0x20000},
2241                         {"default-mac", 0x20000, 0x00200},
2242                         {"pin", 0x20200, 0x00100},
2243                         {"product-info", 0x20300, 0x00200},
2244                         {"device-id", 0x20500, 0x0fb00},
2245                         {"firmware", 0x30000, 0xce0000},
2246                         {"portal-logo", 0xd10000, 0x20000},
2247                         {"portal-back", 0xd30000, 0x200000},
2248                         {"soft-version", 0xf30000, 0x00200},
2249                         {"extra-para", 0xf30200, 0x00200},
2250                         {"support-list", 0xf30400, 0x00200},
2251                         {"profile", 0xf30600, 0x0fa00},
2252                         {"apdef-config", 0xf40000, 0x10000},
2253                         {"ap-config", 0xf50000, 0x10000},
2254                         {"redef-config", 0xf60000, 0x10000},
2255                         {"re-config", 0xf70000, 0x10000},
2256                         {"multidef-config", 0xf80000, 0x10000},
2257                         {"multi-config", 0xf90000, 0x10000},
2258                         {"clientdef-config", 0xfa0000, 0x10000},
2259                         {"client-config", 0xfb0000, 0x10000},
2260                         {"partition-table", 0xfc0000, 0x10000},
2261                         {"user-config", 0xfd0000, 0x10000},
2262                         {"certificate", 0xfe0000, 0x10000},
2263                         {"radio", 0xff0000, 0x10000},
2264                         {NULL, 0, 0}
2265                 },
2266                 .first_sysupgrade_partition = "os-image",
2267                 .last_sysupgrade_partition = "file-system",
2268         },
2269 
2270         /** Firmware layout for the TL-WA850RE v2 */
2271         {
2272                 .id     = "TLWA850REV2",
2273                 .vendor = "",
2274                 .support_list =
2275                         "SupportList:\n"
2276                         "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:55530000}\n"
2277                         "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:00000000}\n"
2278                         "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:55534100}\n"
2279                         "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:45550000}\n"
2280                         "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:4B520000}\n"
2281                         "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:42520000}\n"
2282                         "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:4A500000}\n"
2283                         "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:43410000}\n"
2284                         "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:41550000}\n"
2285                         "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:52550000}\n",
2286                 .part_trail = 0x00,
2287                 .soft_ver = SOFT_VER_DEFAULT,
2288 
2289                 /**
2290                    576KB were moved from file-system to os-image
2291                    in comparison to the stock image
2292                 */
2293                 .partitions = {
2294                         {"fs-uboot", 0x00000, 0x20000},
2295                         {"firmware", 0x20000, 0x390000},
2296                         {"partition-table", 0x3b0000, 0x02000},
2297                         {"default-mac", 0x3c0000, 0x00020},
2298                         {"pin", 0x3c0100, 0x00020},
2299                         {"product-info", 0x3c1000, 0x01000},
2300                         {"soft-version", 0x3c2000, 0x00100},
2301                         {"support-list", 0x3c3000, 0x01000},
2302                         {"profile", 0x3c4000, 0x08000},
2303                         {"user-config", 0x3d0000, 0x10000},
2304                         {"default-config", 0x3e0000, 0x10000},
2305                         {"radio", 0x3f0000, 0x10000},
2306                         {NULL, 0, 0}
2307                 },
2308 
2309                 .first_sysupgrade_partition = "os-image",
2310                 .last_sysupgrade_partition = "file-system"
2311         },
2312 
2313         /** Firmware layout for the TL-WA855RE v1 */
2314         {
2315                 .id     = "TLWA855REV1",
2316                 .vendor = "",
2317                 .support_list =
2318                         "SupportList:\n"
2319                         "{product_name:TL-WA855RE,product_ver:1.0.0,special_id:00000000}\n"
2320                         "{product_name:TL-WA855RE,product_ver:1.0.0,special_id:55530000}\n"
2321                         "{product_name:TL-WA855RE,product_ver:1.0.0,special_id:45550000}\n"
2322                         "{product_name:TL-WA855RE,product_ver:1.0.0,special_id:4B520000}\n"
2323                         "{product_name:TL-WA855RE,product_ver:1.0.0,special_id:42520000}\n"
2324                         "{product_name:TL-WA855RE,product_ver:1.0.0,special_id:4A500000}\n"
2325                         "{product_name:TL-WA855RE,product_ver:1.0.0,special_id:43410000}\n"
2326                         "{product_name:TL-WA855RE,product_ver:1.0.0,special_id:41550000}\n"
2327                         "{product_name:TL-WA855RE,product_ver:1.0.0,special_id:52550000}\n",
2328                 .part_trail = 0x00,
2329                 .soft_ver = SOFT_VER_DEFAULT,
2330 
2331                 .partitions = {
2332                         {"fs-uboot", 0x00000, 0x20000},
2333                         {"os-image", 0x20000, 0x150000},
2334                         {"file-system", 0x170000, 0x240000},
2335                         {"partition-table", 0x3b0000, 0x02000},
2336                         {"default-mac", 0x3c0000, 0x00020},
2337                         {"pin", 0x3c0100, 0x00020},
2338                         {"product-info", 0x3c1000, 0x01000},
2339                         {"soft-version", 0x3c2000, 0x00100},
2340                         {"support-list", 0x3c3000, 0x01000},
2341                         {"profile", 0x3c4000, 0x08000},
2342                         {"user-config", 0x3d0000, 0x10000},
2343                         {"default-config", 0x3e0000, 0x10000},
2344                         {"radio", 0x3f0000, 0x10000},
2345                         {NULL, 0, 0}
2346                 },
2347 
2348                 .first_sysupgrade_partition = "os-image",
2349                 .last_sysupgrade_partition = "file-system"
2350         },
2351 
2352         /** Firmware layout for the TL-WPA8630P v2 (EU)*/
2353         {
2354                 .id     = "TL-WPA8630P-V2.0-EU",
2355                 .vendor = "",
2356                 .support_list =
2357                         "SupportList:\n"
2358                         "{product_name:TL-WPA8630P,product_ver:2.0.0,special_id:45550000}\n",
2359                 .part_trail = 0x00,
2360                 .soft_ver = SOFT_VER_DEFAULT,
2361 
2362                 .partitions = {
2363                         {"factory-uboot", 0x00000, 0x20000},
2364                         {"fs-uboot", 0x20000, 0x20000},
2365                         {"firmware", 0x40000, 0x5e0000},
2366                         {"partition-table", 0x620000, 0x02000},
2367                         {"default-mac", 0x630000, 0x00020},
2368                         {"pin", 0x630100, 0x00020},
2369                         {"device-id", 0x630200, 0x00030},
2370                         {"product-info", 0x631100, 0x01000},
2371                         {"extra-para", 0x632100, 0x01000},
2372                         {"soft-version", 0x640000, 0x01000},
2373                         {"support-list", 0x641000, 0x01000},
2374                         {"profile", 0x642000, 0x08000},
2375                         {"user-config", 0x650000, 0x10000},
2376                         {"default-config", 0x660000, 0x10000},
2377                         {"default-nvm", 0x670000, 0xc0000},
2378                         {"default-pib", 0x730000, 0x40000},
2379                         {"radio", 0x7f0000, 0x10000},
2380                         {NULL, 0, 0}
2381                 },
2382 
2383                 .first_sysupgrade_partition = "os-image",
2384                 .last_sysupgrade_partition = "file-system"
2385         },
2386 
2387         /** Firmware layout for the TL-WPA8630P v2 (INT)*/
2388         {
2389                 .id     = "TL-WPA8630P-V2-INT",
2390                 .vendor = "",
2391                 .support_list =
2392                         "SupportList:\n"
2393                         "{product_name:TL-WPA8630P,product_ver:2.0.0,special_id:41550000}\n"
2394                         "{product_name:TL-WPA8630P,product_ver:2.0.0,special_id:44450000}\n"
2395                         "{product_name:TL-WPA8630P,product_ver:2.1.0,special_id:41550000}\n",
2396                 .part_trail = 0x00,
2397                 .soft_ver = SOFT_VER_DEFAULT,
2398 
2399                 .partitions = {
2400                         {"factory-uboot", 0x00000, 0x20000},
2401                         {"fs-uboot", 0x20000, 0x20000},
2402                         {"firmware", 0x40000, 0x5e0000},
2403                         {"partition-table", 0x620000, 0x02000},
2404                         {"extra-para", 0x632100, 0x01000},
2405                         {"soft-version", 0x640000, 0x01000},
2406                         {"support-list", 0x641000, 0x01000},
2407                         {"profile", 0x642000, 0x08000},
2408                         {"user-config", 0x650000, 0x10000},
2409                         {"default-config", 0x660000, 0x10000},
2410                         {"default-nvm", 0x670000, 0xc0000},
2411                         {"default-pib", 0x730000, 0x40000},
2412                         {"default-mac", 0x7e0000, 0x00020},
2413                         {"pin", 0x7e0100, 0x00020},
2414                         {"device-id", 0x7e0200, 0x00030},
2415                         {"product-info", 0x7e1100, 0x01000},
2416                         {"radio", 0x7f0000, 0x10000},
2417                         {NULL, 0, 0}
2418                 },
2419 
2420                 .first_sysupgrade_partition = "os-image",
2421                 .last_sysupgrade_partition = "file-system"
2422         },
2423 
2424         /** Firmware layout for the TL-WPA8630P v2.1 (EU)*/
2425         {
2426                 .id     = "TL-WPA8630P-V2.1-EU",
2427                 .vendor = "",
2428                 .support_list =
2429                         "SupportList:\n"
2430                         "{product_name:TL-WPA8630P,product_ver:2.1.0,special_id:45550000}\n",
2431                 .part_trail = 0x00,
2432                 .soft_ver = SOFT_VER_DEFAULT,
2433 
2434                 .partitions = {
2435                         {"factory-uboot", 0x00000, 0x20000},
2436                         {"fs-uboot", 0x20000, 0x20000},
2437                         {"firmware", 0x40000, 0x5e0000},
2438                         {"extra-para", 0x680000, 0x01000},
2439                         {"product-info", 0x690000, 0x01000},
2440                         {"partition-table", 0x6a0000, 0x02000},
2441                         {"soft-version", 0x6b0000, 0x01000},
2442                         {"support-list", 0x6b1000, 0x01000},
2443                         {"profile", 0x6b2000, 0x08000},
2444                         {"user-config", 0x6c0000, 0x10000},
2445                         {"default-config", 0x6d0000, 0x10000},
2446                         {"default-nvm", 0x6e0000, 0xc0000},
2447                         {"default-pib", 0x7a0000, 0x40000},
2448                         {"default-mac", 0x7e0000, 0x00020},
2449                         {"pin", 0x7e0100, 0x00020},
2450                         {"device-id", 0x7e0200, 0x00030},
2451                         {"radio", 0x7f0000, 0x10000},
2452                         {NULL, 0, 0}
2453                 },
2454 
2455                 .first_sysupgrade_partition = "os-image",
2456                 .last_sysupgrade_partition = "file-system"
2457         },
2458 
2459         /** Firmware layout for the TL-WPA8631P v3 */
2460         {
2461                 .id     = "TL-WPA8631P-V3",
2462                 .vendor = "",
2463                 .support_list =
2464                         "SupportList:\n"
2465                         "{product_name:TL-WPA8631P,product_ver:3.0.0,special_id:41550000}\n"
2466                         "{product_name:TL-WPA8631P,product_ver:3.0.0,special_id:45550000}\n"
2467                         "{product_name:TL-WPA8631P,product_ver:3.0.0,special_id:55530000}\n"
2468                         "{product_name:TL-WPA8631P,product_ver:4.0.0,special_id:41550000}\n"
2469                         "{product_name:TL-WPA8631P,product_ver:4.0.0,special_id:45550000}\n"
2470                         "{product_name:TL-WPA8631P,product_ver:4.0.0,special_id:55530000}\n"
2471                         "{product_name:TL-WPA8635P,product_ver:3.0.0,special_id:46520000}\n",
2472                 .part_trail = 0x00,
2473                 .soft_ver = SOFT_VER_DEFAULT,
2474 
2475                 .partitions = {
2476                         {"fs-uboot", 0x00000, 0x20000},
2477                         {"firmware", 0x20000, 0x710000},
2478                         {"partition-table", 0x730000, 0x02000},
2479                         {"default-mac", 0x732000, 0x00020},
2480                         {"pin", 0x732100, 0x00020},
2481                         {"device-id", 0x732200, 0x00030},
2482                         {"default-region", 0x732300, 0x00010},
2483                         {"product-info", 0x732400, 0x00200},
2484                         {"extra-para", 0x732600, 0x00200},
2485                         {"soft-version", 0x732800, 0x00100},
2486                         {"support-list", 0x732900, 0x00200},
2487                         {"profile", 0x732b00, 0x00100},
2488                         {"default-config", 0x732c00, 0x00800},
2489                         {"plc-type", 0x733400, 0x00020},
2490                         {"default-pib", 0x733500, 0x06000},
2491                         {"user-config", 0x740000, 0x10000},
2492                         {"plc-pib", 0x750000, 0x10000},
2493                         {"plc-nvm", 0x760000, 0x90000},
2494                         {"radio", 0x7f0000, 0x10000},
2495                         {NULL, 0, 0}
2496                 },
2497 
2498                 .first_sysupgrade_partition = "os-image",
2499                 .last_sysupgrade_partition = "file-system"
2500         },
2501 
2502         /** Firmware layout for the TL-WR1043 v5 */
2503         {
2504                 .id     = "TLWR1043NV5",
2505                 .vendor = "",
2506                 .support_list =
2507                         "SupportList:\n"
2508                         "{product_name:TL-WR1043N,product_ver:5.0.0,special_id:45550000}\n"
2509                         "{product_name:TL-WR1043N,product_ver:5.0.0,special_id:55530000}\n",
2510                 .part_trail = 0x00,
2511                 .soft_ver = SOFT_VER_TEXT("soft_ver:1.0.0\n"),
2512                 .partitions = {
2513                         {"factory-boot", 0x00000, 0x20000},
2514                         {"fs-uboot", 0x20000, 0x20000},
2515                         {"firmware", 0x40000, 0xec0000},
2516                         {"default-mac", 0xf00000, 0x00200},
2517                         {"pin", 0xf00200, 0x00200},
2518                         {"device-id", 0xf00400, 0x00100},
2519                         {"product-info", 0xf00500, 0x0fb00},
2520                         {"soft-version", 0xf10000, 0x01000},
2521                         {"extra-para", 0xf11000, 0x01000},
2522                         {"support-list", 0xf12000, 0x0a000},
2523                         {"profile", 0xf1c000, 0x04000},
2524                         {"default-config", 0xf20000, 0x10000},
2525                         {"user-config", 0xf30000, 0x40000},
2526                         {"qos-db", 0xf70000, 0x40000},
2527                         {"certificate", 0xfb0000, 0x10000},
2528                         {"partition-table", 0xfc0000, 0x10000},
2529                         {"log", 0xfd0000, 0x20000},
2530                         {"radio", 0xff0000, 0x10000},
2531                         {NULL, 0, 0}
2532                 },
2533                 .first_sysupgrade_partition = "os-image",
2534                 .last_sysupgrade_partition = "file-system"
2535         },
2536 
2537         /** Firmware layout for the TL-WR1043 v4 */
2538         {
2539                 .id     = "TLWR1043NDV4",
2540                 .vendor = "",
2541                 .support_list =
2542                         "SupportList:\n"
2543                         "{product_name:TL-WR1043ND,product_ver:4.0.0,special_id:45550000}\n",
2544                 .part_trail = 0x00,
2545                 .soft_ver = SOFT_VER_DEFAULT,
2546 
2547                 /* We're using a dynamic kernel/rootfs split here */
2548                 .partitions = {
2549                         {"fs-uboot", 0x00000, 0x20000},
2550                         {"firmware", 0x20000, 0xf30000},
2551                         {"default-mac", 0xf50000, 0x00200},
2552                         {"pin", 0xf50200, 0x00200},
2553                         {"product-info", 0xf50400, 0x0fc00},
2554                         {"soft-version", 0xf60000, 0x0b000},
2555                         {"support-list", 0xf6b000, 0x04000},
2556                         {"profile", 0xf70000, 0x04000},
2557                         {"default-config", 0xf74000, 0x0b000},
2558                         {"user-config", 0xf80000, 0x40000},
2559                         {"partition-table", 0xfc0000, 0x10000},
2560                         {"log", 0xfd0000, 0x20000},
2561                         {"radio", 0xff0000, 0x10000},
2562                         {NULL, 0, 0}
2563                 },
2564 
2565                 .first_sysupgrade_partition = "os-image",
2566                 .last_sysupgrade_partition = "file-system"
2567         },
2568 
2569         /** Firmware layout for the TL-WR902AC v1 */
2570         {
2571                 .id     = "TL-WR902AC-V1",
2572                 .vendor = "",
2573                 .support_list =
2574                         "SupportList:\n"
2575                         "{product_name:TL-WR902AC,product_ver:1.0.0,special_id:45550000}\n"
2576                         "{product_name:TL-WR902AC,product_ver:1.0.0,special_id:55530000}\n",
2577                 .part_trail = 0x00,
2578                 .soft_ver = SOFT_VER_DEFAULT,
2579 
2580                 /**
2581                    384KB were moved from file-system to os-image
2582                    in comparison to the stock image
2583                 */
2584                 .partitions = {
2585                         {"fs-uboot", 0x00000, 0x20000},
2586                         {"firmware", 0x20000, 0x730000},
2587                         {"default-mac", 0x750000, 0x00200},
2588                         {"pin", 0x750200, 0x00200},
2589                         {"product-info", 0x750400, 0x0fc00},
2590                         {"soft-version", 0x760000, 0x0b000},
2591                         {"support-list", 0x76b000, 0x04000},
2592                         {"profile", 0x770000, 0x04000},
2593                         {"default-config", 0x774000, 0x0b000},
2594                         {"user-config", 0x780000, 0x40000},
2595                         {"partition-table", 0x7c0000, 0x10000},
2596                         {"log", 0x7d0000, 0x20000},
2597                         {"radio", 0x7f0000, 0x10000},
2598                         {NULL, 0, 0}
2599                 },
2600 
2601                 .first_sysupgrade_partition = "os-image",
2602                 .last_sysupgrade_partition = "file-system",
2603         },
2604 
2605         /** Firmware layout for the TL-WR941HP v1 */
2606         {
2607                 .id     = "TL-WR941HP-V1",
2608                 .vendor = "",
2609                 .support_list =
2610                         "SupportList:\n"
2611                         "{product_name:TL-WR941HP,product_ver:1.0.0,special_id:00000000}\n",
2612                 .part_trail = 0x00,
2613                 .soft_ver = SOFT_VER_DEFAULT,
2614 
2615                 .partitions = {
2616                         {"fs-uboot", 0x00000, 0x20000},
2617                         {"firmware", 0x20000, 0x730000},
2618                         {"default-mac", 0x750000, 0x00200},
2619                         {"pin", 0x750200, 0x00200},
2620                         {"product-info", 0x750400, 0x0fc00},
2621                         {"soft-version", 0x760000, 0x0b000},
2622                         {"support-list", 0x76b000, 0x04000},
2623                         {"profile", 0x770000, 0x04000},
2624                         {"default-config", 0x774000, 0x0b000},
2625                         {"user-config", 0x780000, 0x40000},
2626                         {"partition-table", 0x7c0000, 0x10000},
2627                         {"log", 0x7d0000, 0x20000},
2628                         {"radio", 0x7f0000, 0x10000},
2629                         {NULL, 0, 0}
2630                 },
2631 
2632                 .first_sysupgrade_partition = "os-image",
2633                 .last_sysupgrade_partition = "file-system",
2634         },
2635 
2636         /** Firmware layout for the TL-WR942N V1 */
2637         {
2638                 .id     = "TLWR942NV1",
2639                 .vendor = "",
2640                 .support_list =
2641                         "SupportList:\r\n"
2642                         "{product_name:TL-WR942N,product_ver:1.0.0,special_id:00000000}\r\n"
2643                         "{product_name:TL-WR942N,product_ver:1.0.0,special_id:52550000}\r\n",
2644                 .part_trail = 0x00,
2645                 .soft_ver = SOFT_VER_DEFAULT,
2646 
2647                 .partitions = {
2648                         {"fs-uboot", 0x00000, 0x20000},
2649                         {"firmware", 0x20000, 0xe20000},
2650                         {"default-mac", 0xe40000, 0x00200},
2651                         {"pin", 0xe40200, 0x00200},
2652                         {"product-info", 0xe40400, 0x0fc00},
2653                         {"partition-table", 0xe50000, 0x10000},
2654                         {"soft-version", 0xe60000, 0x10000},
2655                         {"support-list", 0xe70000, 0x10000},
2656                         {"profile", 0xe80000, 0x10000},
2657                         {"default-config", 0xe90000, 0x10000},
2658                         {"user-config", 0xea0000, 0x40000},
2659                         {"qos-db", 0xee0000, 0x40000},
2660                         {"certificate", 0xf20000, 0x10000},
2661                         {"usb-config", 0xfb0000, 0x10000},
2662                         {"log", 0xfc0000, 0x20000},
2663                         {"radio-bk", 0xfe0000, 0x10000},
2664                         {"radio", 0xff0000, 0x10000},
2665                         {NULL, 0, 0}
2666                 },
2667 
2668                 .first_sysupgrade_partition = "os-image",
2669                 .last_sysupgrade_partition = "file-system",
2670         },
2671 
2672   /** Firmware layout for the RE200 v2 */
2673         {
2674                 .id     = "RE200-V2",
2675                 .vendor = "",
2676                 .support_list =
2677                         "SupportList:\n"
2678                         "{product_name:RE200,product_ver:2.0.0,special_id:00000000}\n"
2679                         "{product_name:RE200,product_ver:2.0.0,special_id:41520000}\n"
2680                         "{product_name:RE200,product_ver:2.0.0,special_id:41550000}\n"
2681                         "{product_name:RE200,product_ver:2.0.0,special_id:42520000}\n"
2682                         "{product_name:RE200,product_ver:2.0.0,special_id:43410000}\n"
2683                         "{product_name:RE200,product_ver:2.0.0,special_id:45530000}\n"
2684                         "{product_name:RE200,product_ver:2.0.0,special_id:45550000}\n"
2685                         "{product_name:RE200,product_ver:2.0.0,special_id:49440000}\n"
2686                         "{product_name:RE200,product_ver:2.0.0,special_id:4a500000}\n"
2687                         "{product_name:RE200,product_ver:2.0.0,special_id:4b520000}\n"
2688                         "{product_name:RE200,product_ver:2.0.0,special_id:52550000}\n"
2689                         "{product_name:RE200,product_ver:2.0.0,special_id:54570000}\n"
2690                         "{product_name:RE200,product_ver:2.0.0,special_id:55530000}\n",
2691                 .part_trail = 0x00,
2692                 .soft_ver = SOFT_VER_DEFAULT,
2693 
2694                 .partitions = {
2695                         {"fs-uboot", 0x00000, 0x20000},
2696                         {"firmware", 0x20000, 0x7a0000},
2697                         {"partition-table", 0x7c0000, 0x02000},
2698                         {"default-mac", 0x7c2000, 0x00020},
2699                         {"pin", 0x7c2100, 0x00020},
2700                         {"product-info", 0x7c3100, 0x01000},
2701                         {"soft-version", 0x7c4200, 0x01000},
2702                         {"support-list", 0x7c5200, 0x01000},
2703                         {"profile", 0x7c6200, 0x08000},
2704                         {"config-info", 0x7ce200, 0x00400},
2705                         {"user-config", 0x7d0000, 0x10000},
2706                         {"default-config", 0x7e0000, 0x10000},
2707                         {"radio", 0x7f0000, 0x10000},
2708                         {NULL, 0, 0}
2709                 },
2710 
2711                 .first_sysupgrade_partition = "os-image",
2712                 .last_sysupgrade_partition = "file-system"
2713         },
2714 
2715   /** Firmware layout for the RE200 v3 */
2716         {
2717                 .id     = "RE200-V3",
2718                 .vendor = "",
2719                 .support_list =
2720                         "SupportList:\n"
2721                         "{product_name:RE200,product_ver:3.0.0,special_id:00000000}\n"
2722                         "{product_name:RE200,product_ver:3.0.0,special_id:41520000}\n"
2723                         "{product_name:RE200,product_ver:3.0.0,special_id:41550000}\n"
2724                         "{product_name:RE200,product_ver:3.0.0,special_id:42520000}\n"
2725                         "{product_name:RE200,product_ver:3.0.0,special_id:43410000}\n"
2726                         "{product_name:RE200,product_ver:3.0.0,special_id:45470000}\n"
2727                         "{product_name:RE200,product_ver:3.0.0,special_id:45530000}\n"
2728                         "{product_name:RE200,product_ver:3.0.0,special_id:45550000}\n"
2729                         "{product_name:RE200,product_ver:3.0.0,special_id:49440000}\n"
2730                         "{product_name:RE200,product_ver:3.0.0,special_id:4A500000}\n"
2731                         "{product_name:RE200,product_ver:3.0.0,special_id:4B520000}\n"
2732                         "{product_name:RE200,product_ver:3.0.0,special_id:52550000}\n"
2733                         "{product_name:RE200,product_ver:3.0.0,special_id:54570000}\n"
2734                         "{product_name:RE200,product_ver:3.0.0,special_id:55530000}\n",
2735                 .part_trail = 0x00,
2736                 .soft_ver = SOFT_VER_DEFAULT,
2737 
2738                 .partitions = {
2739                         {"fs-uboot", 0x00000, 0x20000},
2740                         {"firmware", 0x20000, 0x7a0000},
2741                         {"partition-table", 0x7c0000, 0x02000},
2742                         {"default-mac", 0x7c2000, 0x00020},
2743                         {"pin", 0x7c2100, 0x00020},
2744                         {"product-info", 0x7c3100, 0x01000},
2745                         {"soft-version", 0x7c4200, 0x01000},
2746                         {"support-list", 0x7c5200, 0x01000},
2747                         {"profile", 0x7c6200, 0x08000},
2748                         {"config-info", 0x7ce200, 0x00400},
2749                         {"user-config", 0x7d0000, 0x10000},
2750                         {"default-config", 0x7e0000, 0x10000},
2751                         {"radio", 0x7f0000, 0x10000},
2752                         {NULL, 0, 0}
2753                 },
2754 
2755                 .first_sysupgrade_partition = "os-image",
2756                 .last_sysupgrade_partition = "file-system"
2757         },
2758 
2759   /** Firmware layout for the RE200 v4 */
2760         {
2761                 .id     = "RE200-V4",
2762                 .vendor = "",
2763                 .support_list =
2764                         "SupportList:\n"
2765                         "{product_name:RE200,product_ver:4.0.0,special_id:00000000}\n"
2766                         "{product_name:RE200,product_ver:4.0.0,special_id:45550000}\n"
2767                         "{product_name:RE200,product_ver:4.0.0,special_id:4A500000}\n"
2768                         "{product_name:RE200,product_ver:4.0.0,special_id:4B520000}\n"
2769                         "{product_name:RE200,product_ver:4.0.0,special_id:43410000}\n"
2770                         "{product_name:RE200,product_ver:4.0.0,special_id:41550000}\n"
2771                         "{product_name:RE200,product_ver:4.0.0,special_id:42520000}\n"
2772                         "{product_name:RE200,product_ver:4.0.0,special_id:55530000}\n"
2773                         "{product_name:RE200,product_ver:4.0.0,special_id:41520000}\n"
2774                         "{product_name:RE200,product_ver:4.0.0,special_id:52550000}\n"
2775                         "{product_name:RE200,product_ver:4.0.0,special_id:54570000}\n"
2776                         "{product_name:RE200,product_ver:4.0.0,special_id:45530000}\n"
2777                         "{product_name:RE200,product_ver:4.0.0,special_id:49440000}\n"
2778                         "{product_name:RE200,product_ver:4.0.0,special_id:45470000}\n",
2779                 .part_trail = 0x00,
2780                 .soft_ver = SOFT_VER_TEXT("soft_ver:1.1.0\n"),
2781 
2782                 .partitions = {
2783                         {"fs-uboot", 0x00000, 0x20000},
2784                         {"firmware", 0x20000, 0x7a0000},
2785                         {"partition-table", 0x7c0000, 0x02000},
2786                         {"default-mac", 0x7c2000, 0x00020},
2787                         {"pin", 0x7c2100, 0x00020},
2788                         {"product-info", 0x7c3100, 0x01000},
2789                         {"soft-version", 0x7c4200, 0x01000},
2790                         {"support-list", 0x7c5200, 0x01000},
2791                         {"profile", 0x7c6200, 0x08000},
2792                         {"config-info", 0x7ce200, 0x00400},
2793                         {"user-config", 0x7d0000, 0x10000},
2794                         {"default-config", 0x7e0000, 0x10000},
2795                         {"radio", 0x7f0000, 0x10000},
2796                         {NULL, 0, 0}
2797                 },
2798 
2799                 .first_sysupgrade_partition = "os-image",
2800                 .last_sysupgrade_partition = "file-system"
2801         },
2802 
2803         /** Firmware layout for the RE205 v3 */
2804         {
2805                 .id     = "RE205-V3",
2806                 .vendor = "",
2807                 .support_list =
2808                         "SupportList:\n"
2809                         "{product_name:RE205,product_ver:3.0.0,special_id:00000000}\n"
2810                         "{product_name:RE205,product_ver:3.0.0,special_id:45550000}\n"
2811                         "{product_name:RE205,product_ver:3.0.0,special_id:4A500000}\n"
2812                         "{product_name:RE205,product_ver:3.0.0,special_id:4B520000}\n"
2813                         "{product_name:RE205,product_ver:3.0.0,special_id:43410000}\n"
2814                         "{product_name:RE205,product_ver:3.0.0,special_id:41550000}\n"
2815                         "{product_name:RE205,product_ver:3.0.0,special_id:42520000}\n"
2816                         "{product_name:RE205,product_ver:3.0.0,special_id:55530000}\n"
2817                         "{product_name:RE205,product_ver:3.0.0,special_id:41520000}\n"
2818                         "{product_name:RE205,product_ver:3.0.0,special_id:52550000}\n"
2819                         "{product_name:RE205,product_ver:3.0.0,special_id:54570000}\n"
2820                         "{product_name:RE205,product_ver:3.0.0,special_id:45530000}\n"
2821                         "{product_name:RE205,product_ver:3.0.0,special_id:45470000}\n",
2822                 .part_trail = 0x00,
2823                 .soft_ver = SOFT_VER_TEXT("soft_ver:1.1.0\n"),
2824 
2825                 .partitions = {
2826                         {"fs-uboot", 0x00000, 0x20000},
2827                         {"firmware", 0x20000, 0x7a0000},
2828                         {"partition-table", 0x7c0000, 0x02000},
2829                         {"default-mac", 0x7c2000, 0x00020},
2830                         {"pin", 0x7c2100, 0x00020},
2831                         {"product-info", 0x7c3100, 0x01000},
2832                         {"soft-version", 0x7c4200, 0x01000},
2833                         {"support-list", 0x7c5200, 0x01000},
2834                         {"profile", 0x7c6200, 0x08000},
2835                         {"config-info", 0x7ce200, 0x00400},
2836                         {"user-config", 0x7d0000, 0x10000},
2837                         {"default-config", 0x7e0000, 0x10000},
2838                         {"radio", 0x7f0000, 0x10000},
2839                         {NULL, 0, 0}
2840                 },
2841 
2842                 .first_sysupgrade_partition = "os-image",
2843                 .last_sysupgrade_partition = "file-system"
2844         },
2845 
2846         /** Firmware layout for the RE220 v2 */
2847         {
2848                 .id     = "RE220-V2",
2849                 .vendor = "",
2850                 .support_list =
2851                         "SupportList:\n"
2852                         "{product_name:RE220,product_ver:2.0.0,special_id:00000000}\n"
2853                         "{product_name:RE220,product_ver:2.0.0,special_id:41520000}\n"
2854                         "{product_name:RE220,product_ver:2.0.0,special_id:41550000}\n"
2855                         "{product_name:RE220,product_ver:2.0.0,special_id:42520000}\n"
2856                         "{product_name:RE220,product_ver:2.0.0,special_id:43410000}\n"
2857                         "{product_name:RE220,product_ver:2.0.0,special_id:45530000}\n"
2858                         "{product_name:RE220,product_ver:2.0.0,special_id:45550000}\n"
2859                         "{product_name:RE220,product_ver:2.0.0,special_id:49440000}\n"
2860                         "{product_name:RE220,product_ver:2.0.0,special_id:4a500000}\n"
2861                         "{product_name:RE220,product_ver:2.0.0,special_id:4b520000}\n"
2862                         "{product_name:RE220,product_ver:2.0.0,special_id:52550000}\n"
2863                         "{product_name:RE220,product_ver:2.0.0,special_id:54570000}\n"
2864                         "{product_name:RE220,product_ver:2.0.0,special_id:55530000}\n",
2865                 .part_trail = 0x00,
2866                 .soft_ver = SOFT_VER_DEFAULT,
2867 
2868                 .partitions = {
2869                         {"fs-uboot", 0x00000, 0x20000},
2870                         {"firmware", 0x20000, 0x7a0000},
2871                         {"partition-table", 0x7c0000, 0x02000},
2872                         {"default-mac", 0x7c2000, 0x00020},
2873                         {"pin", 0x7c2100, 0x00020},
2874                         {"product-info", 0x7c3100, 0x01000},
2875                         {"soft-version", 0x7c4200, 0x01000},
2876                         {"support-list", 0x7c5200, 0x01000},
2877                         {"profile", 0x7c6200, 0x08000},
2878                         {"config-info", 0x7ce200, 0x00400},
2879                         {"user-config", 0x7d0000, 0x10000},
2880                         {"default-config", 0x7e0000, 0x10000},
2881                         {"radio", 0x7f0000, 0x10000},
2882                         {NULL, 0, 0}
2883                 },
2884 
2885                 .first_sysupgrade_partition = "os-image",
2886                 .last_sysupgrade_partition = "file-system"
2887         },
2888 
2889   /** Firmware layout for the RE305 v1 */
2890         {
2891                 .id     = "RE305-V1",
2892                 .vendor = "",
2893                 .support_list =
2894                         "SupportList:\n"
2895                         "{product_name:RE305,product_ver:1.0.0,special_id:45550000}\n"
2896                         "{product_name:RE305,product_ver:1.0.0,special_id:55530000}\n"
2897                         "{product_name:RE305,product_ver:1.0.0,special_id:4a500000}\n"
2898                         "{product_name:RE305,product_ver:1.0.0,special_id:42520000}\n"
2899                         "{product_name:RE305,product_ver:1.0.0,special_id:4b520000}\n"
2900                         "{product_name:RE305,product_ver:1.0.0,special_id:41550000}\n"
2901                         "{product_name:RE305,product_ver:1.0.0,special_id:43410000}\n",
2902                 .part_trail = 0x00,
2903                 .soft_ver = SOFT_VER_DEFAULT,
2904 
2905                 .partitions = {
2906                         {"fs-uboot", 0x00000, 0x20000},
2907                         {"firmware", 0x20000, 0x5e0000},
2908                         {"partition-table", 0x600000, 0x02000},
2909                         {"default-mac", 0x610000, 0x00020},
2910                         {"pin", 0x610100, 0x00020},
2911                         {"product-info", 0x611100, 0x01000},
2912                         {"soft-version", 0x620000, 0x01000},
2913                         {"support-list", 0x621000, 0x01000},
2914                         {"profile", 0x622000, 0x08000},
2915                         {"user-config", 0x630000, 0x10000},
2916                         {"default-config", 0x640000, 0x10000},
2917                         {"radio", 0x7f0000, 0x10000},
2918                         {NULL, 0, 0}
2919                 },
2920 
2921                 .first_sysupgrade_partition = "os-image",
2922                 .last_sysupgrade_partition = "file-system"
2923         },
2924 
2925         /** Firmware layout for the RE305 v3 */
2926         {
2927                 .id     = "RE305-V3",
2928                 .vendor = "",
2929                 .support_list =
2930                         "SupportList:\n"
2931                         "{product_name:RE305,product_ver:3.0.0,special_id:00000000}\n"
2932                         "{product_name:RE305,product_ver:3.0.0,special_id:45550000}\n"
2933                         "{product_name:RE305,product_ver:3.0.0,special_id:4A500000}\n"
2934                         "{product_name:RE305,product_ver:3.0.0,special_id:4B520000}\n"
2935                         "{product_name:RE305,product_ver:3.0.0,special_id:41550000}\n"
2936                         "{product_name:RE305,product_ver:3.0.0,special_id:42520000}\n"
2937                         "{product_name:RE305,product_ver:3.0.0,special_id:55530000}\n"
2938                         "{product_name:RE305,product_ver:3.0.0,special_id:45530000}\n"
2939                         "{product_name:RE305,product_ver:3.0.0,special_id:41530000}\n"
2940                         "{product_name:RE305,product_ver:3.0.0,special_id:43410000}\n"
2941                         "{product_name:RE305,product_ver:3.0.0,special_id:52550000}\n",
2942                 .part_trail = 0x00,
2943                 .soft_ver = SOFT_VER_TEXT("soft_ver:2.0.0\n"),
2944 
2945                 .partitions = {
2946                         {"fs-uboot", 0x00000, 0x20000},
2947                         {"firmware", 0x20000, 0x7a0000},
2948                         {"partition-table", 0x7c0000, 0x02000},
2949                         {"default-mac", 0x7c2000, 0x00020},
2950                         {"pin", 0x7c2100, 0x00020},
2951                         {"product-info", 0x7c3100, 0x01000},
2952                         {"soft-version", 0x7c4200, 0x01000},
2953                         {"support-list", 0x7c5200, 0x01000},
2954                         {"profile", 0x7c6200, 0x08000},
2955                         {"config-info", 0x7ce200, 0x00400},
2956                         {"user-config", 0x7d0000, 0x10000},
2957                         {"default-config", 0x7e0000, 0x10000},
2958                         {"radio", 0x7f0000, 0x10000},
2959                         {NULL, 0, 0}
2960                 },
2961 
2962                 .first_sysupgrade_partition = "os-image",
2963                 .last_sysupgrade_partition = "file-system"
2964         },
2965 
2966         /** Firmware layout for the RE350 v1 */
2967         {
2968                 .id     = "RE350-V1",
2969                 .vendor = "",
2970                 .support_list =
2971                         "SupportList:\n"
2972                         "{product_name:RE350,product_ver:1.0.0,special_id:45550000}\n"
2973                         "{product_name:RE350,product_ver:1.0.0,special_id:00000000}\n"
2974                         "{product_name:RE350,product_ver:1.0.0,special_id:41550000}\n"
2975                         "{product_name:RE350,product_ver:1.0.0,special_id:55530000}\n"
2976                         "{product_name:RE350,product_ver:1.0.0,special_id:43410000}\n"
2977                         "{product_name:RE350,product_ver:1.0.0,special_id:4b520000}\n"
2978                         "{product_name:RE350,product_ver:1.0.0,special_id:4a500000}\n",
2979                 .part_trail = 0x00,
2980                 .soft_ver = SOFT_VER_DEFAULT,
2981 
2982                 /** We're using a dynamic kernel/rootfs split here */
2983                 .partitions = {
2984                         {"fs-uboot", 0x00000, 0x20000},
2985                         {"firmware", 0x20000, 0x5e0000},
2986                         {"partition-table", 0x600000, 0x02000},
2987                         {"default-mac", 0x610000, 0x00020},
2988                         {"pin", 0x610100, 0x00020},
2989                         {"product-info", 0x611100, 0x01000},
2990                         {"soft-version", 0x620000, 0x01000},
2991                         {"support-list", 0x621000, 0x01000},
2992                         {"profile", 0x622000, 0x08000},
2993                         {"user-config", 0x630000, 0x10000},
2994                         {"default-config", 0x640000, 0x10000},
2995                         {"radio", 0x7f0000, 0x10000},
2996                         {NULL, 0, 0}
2997                 },
2998 
2999                 .first_sysupgrade_partition = "os-image",
3000                 .last_sysupgrade_partition = "file-system"
3001         },
3002 
3003         /** Firmware layout for the RE350K v1 */
3004         {
3005                 .id     = "RE350K-V1",
3006                 .vendor = "",
3007                 .support_list =
3008                         "SupportList:\n"
3009                         "{product_name:RE350K,product_ver:1.0.0,special_id:00000000,product_region:US}\n",
3010                 .part_trail = 0x00,
3011                 .soft_ver = SOFT_VER_DEFAULT,
3012 
3013                 /** We're using a dynamic kernel/rootfs split here */
3014                 .partitions = {
3015                         {"fs-uboot", 0x00000, 0x20000},
3016                         {"firmware", 0x20000, 0xd70000},
3017                         {"partition-table", 0xd90000, 0x02000},
3018                         {"default-mac", 0xda0000, 0x00020},
3019                         {"pin", 0xda0100, 0x00020},
3020                         {"product-info", 0xda1100, 0x01000},
3021                         {"soft-version", 0xdb0000, 0x01000},
3022                         {"support-list", 0xdb1000, 0x01000},
3023                         {"profile", 0xdb2000, 0x08000},
3024                         {"user-config", 0xdc0000, 0x10000},
3025                         {"default-config", 0xdd0000, 0x10000},
3026                         {"device-id", 0xde0000, 0x00108},
3027                         {"radio", 0xff0000, 0x10000},
3028                         {NULL, 0, 0}
3029                 },
3030 
3031                 .first_sysupgrade_partition = "os-image",
3032                 .last_sysupgrade_partition = "file-system"
3033         },
3034 
3035         /** Firmware layout for the RE355 */
3036         {
3037                 .id     = "RE355",
3038                 .vendor = "",
3039                 .support_list =
3040                         "SupportList:\r\n"
3041                         "{product_name:RE355,product_ver:1.0.0,special_id:00000000}\r\n"
3042                         "{product_name:RE355,product_ver:1.0.0,special_id:55530000}\r\n"
3043                         "{product_name:RE355,product_ver:1.0.0,special_id:45550000}\r\n"
3044                         "{product_name:RE355,product_ver:1.0.0,special_id:4A500000}\r\n"
3045                         "{product_name:RE355,product_ver:1.0.0,special_id:43410000}\r\n"
3046                         "{product_name:RE355,product_ver:1.0.0,special_id:41550000}\r\n"
3047                         "{product_name:RE355,product_ver:1.0.0,special_id:4B520000}\r\n"
3048                         "{product_name:RE355,product_ver:1.0.0,special_id:55534100}\r\n",
3049                 .part_trail = 0x00,
3050                 .soft_ver = SOFT_VER_DEFAULT,
3051 
3052                 /* We're using a dynamic kernel/rootfs split here */
3053                 .partitions = {
3054                         {"fs-uboot", 0x00000, 0x20000},
3055                         {"firmware", 0x20000, 0x5e0000},
3056                         {"partition-table", 0x600000, 0x02000},
3057                         {"default-mac", 0x610000, 0x00020},
3058                         {"pin", 0x610100, 0x00020},
3059                         {"product-info", 0x611100, 0x01000},
3060                         {"soft-version", 0x620000, 0x01000},
3061                         {"support-list", 0x621000, 0x01000},
3062                         {"profile", 0x622000, 0x08000},
3063                         {"user-config", 0x630000, 0x10000},
3064                         {"default-config", 0x640000, 0x10000},
3065                         {"radio", 0x7f0000, 0x10000},
3066                         {NULL, 0, 0}
3067                 },
3068 
3069                 .first_sysupgrade_partition = "os-image",
3070                 .last_sysupgrade_partition = "file-system"
3071         },
3072 
3073         /** Firmware layout for the RE365 v1 */
3074         {
3075                 .id     = "RE365",
3076                 .vendor = "",
3077                 .support_list =
3078                         "SupportList:\r\n"
3079                         "{product_name:RE365,product_ver:1.0.0,special_id:45550000}\r\n"
3080                         "{product_name:RE365,product_ver:1.0.0,special_id:55530000}\r\n"
3081                         "{product_name:RE365,product_ver:1.0.0,special_id:4a500000}\r\n"
3082                         "{product_name:RE365,product_ver:1.0.0,special_id:42520000}\r\n"
3083                         "{product_name:RE365,product_ver:1.0.0,special_id:4b520000}\r\n"
3084                         "{product_name:RE365,product_ver:1.0.0,special_id:41550000}\r\n"
3085                         "{product_name:RE365,product_ver:1.0.0,special_id:43410000}\r\n"
3086                         "{product_name:RE365,product_ver:1.0.0,special_id:54570000}\r\n"
3087                         "{product_name:RE365,product_ver:1.0.0,special_id:41530000}\r\n",
3088                 .part_trail = 0x00,
3089                 .soft_ver = SOFT_VER_DEFAULT,
3090 
3091                 .partitions = {
3092                         {"fs-uboot", 0x00000, 0x20000},
3093                         {"firmware", 0x20000, 0x5e0000},
3094                         {"partition-table", 0x600000, 0x02000},
3095                         {"default-mac", 0x610000, 0x00020},
3096                         {"pin", 0x610100, 0x00020},
3097                         {"product-info", 0x611100, 0x01000},
3098                         {"soft-version", 0x620000, 0x01000},
3099                         {"support-list", 0x621000, 0x01000},
3100                         {"profile", 0x622000, 0x08000},
3101                         {"user-config", 0x630000, 0x10000},
3102                         {"default-config", 0x640000, 0x10000},
3103                         {"radio", 0x7f0000, 0x10000},
3104                         {NULL, 0, 0}
3105                 },
3106 
3107                 .first_sysupgrade_partition = "os-image",
3108                 .last_sysupgrade_partition = "file-system"
3109         },
3110 
3111         /** Firmware layout for the RE450 */
3112         {
3113                 .id     = "RE450",
3114                 .vendor = "",
3115                 .support_list =
3116                         "SupportList:\r\n"
3117                         "{product_name:RE450,product_ver:1.0.0,special_id:00000000}\r\n"
3118                         "{product_name:RE450,product_ver:1.0.0,special_id:55530000}\r\n"
3119                         "{product_name:RE450,product_ver:1.0.0,special_id:45550000}\r\n"
3120                         "{product_name:RE450,product_ver:1.0.0,special_id:4A500000}\r\n"
3121                         "{product_name:RE450,product_ver:1.0.0,special_id:43410000}\r\n"
3122                         "{product_name:RE450,product_ver:1.0.0,special_id:41550000}\r\n"
3123                         "{product_name:RE450,product_ver:1.0.0,special_id:4B520000}\r\n"
3124                         "{product_name:RE450,product_ver:1.0.0,special_id:55534100}\r\n",
3125                 .part_trail = 0x00,
3126                 .soft_ver = SOFT_VER_DEFAULT,
3127 
3128                 /** We're using a dynamic kernel/rootfs split here */
3129                 .partitions = {
3130                         {"fs-uboot", 0x00000, 0x20000},
3131                         {"firmware", 0x20000, 0x5e0000},
3132                         {"partition-table", 0x600000, 0x02000},
3133                         {"default-mac", 0x610000, 0x00020},
3134                         {"pin", 0x610100, 0x00020},
3135                         {"product-info", 0x611100, 0x01000},
3136                         {"soft-version", 0x620000, 0x01000},
3137                         {"support-list", 0x621000, 0x01000},
3138                         {"profile", 0x622000, 0x08000},
3139                         {"user-config", 0x630000, 0x10000},
3140                         {"default-config", 0x640000, 0x10000},
3141                         {"radio", 0x7f0000, 0x10000},
3142                         {NULL, 0, 0}
3143                 },
3144 
3145                 .first_sysupgrade_partition = "os-image",
3146                 .last_sysupgrade_partition = "file-system"
3147         },
3148 
3149         /** Firmware layout for the RE450 v2 */
3150         {
3151                 .id     = "RE450-V2",
3152                 .vendor = "",
3153                 .support_list =
3154                         "SupportList:\r\n"
3155                         "{product_name:RE450,product_ver:2.0.0,special_id:00000000}\r\n"
3156                         "{product_name:RE450,product_ver:2.0.0,special_id:55530000}\r\n"
3157                         "{product_name:RE450,product_ver:2.0.0,special_id:45550000}\r\n"
3158                         "{product_name:RE450,product_ver:2.0.0,special_id:4A500000}\r\n"
3159                         "{product_name:RE450,product_ver:2.0.0,special_id:43410000}\r\n"
3160                         "{product_name:RE450,product_ver:2.0.0,special_id:41550000}\r\n"
3161                         "{product_name:RE450,product_ver:2.0.0,special_id:41530000}\r\n"
3162                         "{product_name:RE450,product_ver:2.0.0,special_id:4B520000}\r\n"
3163                         "{product_name:RE450,product_ver:2.0.0,special_id:42520000}\r\n",
3164                 .part_trail = 0x00,
3165                 .soft_ver = SOFT_VER_DEFAULT,
3166 
3167                 /* We're using a dynamic kernel/rootfs split here */
3168                 .partitions = {
3169                         {"fs-uboot", 0x00000, 0x20000},
3170                         {"firmware", 0x20000, 0x5e0000},
3171                         {"partition-table", 0x600000, 0x02000},
3172                         {"default-mac", 0x610000, 0x00020},
3173                         {"pin", 0x610100, 0x00020},
3174                         {"product-info", 0x611100, 0x01000},
3175                         {"soft-version", 0x620000, 0x01000},
3176                         {"support-list", 0x621000, 0x01000},
3177                         {"profile", 0x622000, 0x08000},
3178                         {"user-config", 0x630000, 0x10000},
3179                         {"default-config", 0x640000, 0x10000},
3180                         {"radio", 0x7f0000, 0x10000},
3181                         {NULL, 0, 0}
3182                 },
3183 
3184                 .first_sysupgrade_partition = "os-image",
3185                 .last_sysupgrade_partition = "file-system"
3186         },
3187 
3188         /** Firmware layout for the RE450 v3 */
3189         {
3190                 .id     = "RE450-V3",
3191                 .vendor = "",
3192                 .support_list =
3193                         "SupportList:\r\n"
3194                         "{product_name:RE450,product_ver:3.0.0,special_id:00000000}\r\n"
3195                         "{product_name:RE450,product_ver:3.0.0,special_id:55530000}\r\n"
3196                         "{product_name:RE450,product_ver:3.0.0,special_id:45550000}\r\n"
3197                         "{product_name:RE450,product_ver:3.0.0,special_id:4A500000}\r\n"
3198                         "{product_name:RE450,product_ver:3.0.0,special_id:43410000}\r\n"
3199                         "{product_name:RE450,product_ver:3.0.0,special_id:41550000}\r\n"
3200                         "{product_name:RE450,product_ver:3.0.0,special_id:41530000}\r\n"
3201                         "{product_name:RE450,product_ver:3.0.0,special_id:4B520000}\r\n"
3202                         "{product_name:RE450,product_ver:3.0.0,special_id:42520000}\r\n",
3203                 .part_trail = 0x00,
3204                 .soft_ver = SOFT_VER_DEFAULT,
3205 
3206                 /* We're using a dynamic kernel/rootfs split here */
3207                 .partitions = {
3208                         {"fs-uboot", 0x00000, 0x20000},
3209                         {"default-mac", 0x20000, 0x00020},
3210                         {"pin", 0x20020, 0x00020},
3211                         {"product-info", 0x21000, 0x01000},
3212                         {"partition-table", 0x22000, 0x02000},
3213                         {"soft-version", 0x24000, 0x01000},
3214                         {"support-list", 0x25000, 0x01000},
3215                         {"profile", 0x26000, 0x08000},
3216                         {"user-config", 0x2e000, 0x10000},
3217                         {"default-config", 0x3e000, 0x10000},
3218                         {"config-info", 0x4e000, 0x00400},
3219                         {"firmware", 0x50000, 0x7a0000},
3220                         {"radio", 0x7f0000, 0x10000},
3221                         {NULL, 0, 0}
3222                 },
3223 
3224                 .first_sysupgrade_partition = "os-image",
3225                 .last_sysupgrade_partition = "file-system"
3226         },
3227 
3228         /** Firmware layout for the RE455 v1 */
3229         {
3230                 .id     = "RE455-V1",
3231                 .vendor = "",
3232                 .support_list =
3233                         "SupportList:\r\n"
3234                         "{product_name:RE455,product_ver:1.0.0,special_id:00000000}\r\n"
3235                         "{product_name:RE455,product_ver:1.0.0,special_id:55530000}\r\n"
3236                         "{product_name:RE455,product_ver:1.0.0,special_id:45550000}\r\n"
3237                         "{product_name:RE455,product_ver:1.0.0,special_id:4A500000}\r\n"
3238                         "{product_name:RE455,product_ver:1.0.0,special_id:43410000}\r\n"
3239                         "{product_name:RE455,product_ver:1.0.0,special_id:41550000}\r\n"
3240                         "{product_name:RE455,product_ver:1.0.0,special_id:41530000}\r\n"
3241                         "{product_name:RE455,product_ver:1.0.0,special_id:4B520000}\r\n"
3242                         "{product_name:RE455,product_ver:1.0.0,special_id:42520000}\r\n",
3243                 .part_trail = 0x00,
3244                 .soft_ver = SOFT_VER_DEFAULT,
3245 
3246                 /* We're using a dynamic kernel/rootfs split here */
3247                 .partitions = {
3248                         {"fs-uboot", 0x00000, 0x20000},
3249                         {"default-mac", 0x20000, 0x00020},
3250                         {"pin", 0x20020, 0x00020},
3251                         {"product-info", 0x21000, 0x01000},
3252                         {"partition-table", 0x22000, 0x02000},
3253                         {"soft-version", 0x24000, 0x01000},
3254                         {"support-list", 0x25000, 0x01000},
3255                         {"profile", 0x26000, 0x08000},
3256                         {"user-config", 0x2e000, 0x10000},
3257                         {"default-config", 0x3e000, 0x10000},
3258                         {"config-info", 0x4e000, 0x00400},
3259                         {"firmware", 0x50000, 0x7a0000},
3260                         {"radio", 0x7f0000, 0x10000},
3261                         {NULL, 0, 0}
3262                 },
3263 
3264                 .first_sysupgrade_partition = "os-image",
3265                 .last_sysupgrade_partition = "file-system"
3266         },
3267 
3268         /** Firmware layout for the RE500 */
3269         {
3270                 .id     = "RE500-V1",
3271                 .vendor = "",
3272                 .support_list =
3273                         "SupportList:\r\n"
3274                         "{product_name:RE500,product_ver:1.0.0,special_id:00000000}\r\n"
3275                         "{product_name:RE500,product_ver:1.0.0,special_id:55530000}\r\n"
3276                         "{product_name:RE500,product_ver:1.0.0,special_id:45550000}\r\n"
3277                         "{product_name:RE500,product_ver:1.0.0,special_id:4A500000}\r\n"
3278                         "{product_name:RE500,product_ver:1.0.0,special_id:43410000}\r\n"
3279                         "{product_name:RE500,product_ver:1.0.0,special_id:41550000}\r\n"
3280                         "{product_name:RE500,product_ver:1.0.0,special_id:41530000}\r\n",
3281                 .part_trail = 0x00,
3282                 .soft_ver = SOFT_VER_DEFAULT,
3283 
3284                 /* We're using a dynamic kernel/rootfs split here */
3285                 .partitions = {
3286                         {"fs-uboot", 0x00000, 0x20000},
3287                         {"firmware", 0x20000, 0xde0000},
3288                         {"partition-table", 0xe00000, 0x02000},
3289                         {"default-mac", 0xe10000, 0x00020},
3290                         {"pin", 0xe10100, 0x00020},
3291                         {"product-info", 0xe11100, 0x01000},
3292                         {"soft-version", 0xe20000, 0x01000},
3293                         {"support-list", 0xe21000, 0x01000},
3294                         {"profile", 0xe22000, 0x08000},
3295                         {"user-config", 0xe30000, 0x10000},
3296                         {"default-config", 0xe40000, 0x10000},
3297                         {"radio", 0xff0000, 0x10000},
3298                         {NULL, 0, 0}
3299                 },
3300 
3301                 .first_sysupgrade_partition = "os-image",
3302                 .last_sysupgrade_partition = "file-system"
3303         },
3304 
3305         /** Firmware layout for the RE650 */
3306         {
3307                 .id     = "RE650-V1",
3308                 .vendor = "",
3309                 .support_list =
3310                         "SupportList:\r\n"
3311                         "{product_name:RE650,product_ver:1.0.0,special_id:00000000}\r\n"
3312                         "{product_name:RE650,product_ver:1.0.0,special_id:55530000}\r\n"
3313                         "{product_name:RE650,product_ver:1.0.0,special_id:45550000}\r\n"
3314                         "{product_name:RE650,product_ver:1.0.0,special_id:4A500000}\r\n"
3315                         "{product_name:RE650,product_ver:1.0.0,special_id:43410000}\r\n"
3316                         "{product_name:RE650,product_ver:1.0.0,special_id:41550000}\r\n"
3317                         "{product_name:RE650,product_ver:1.0.0,special_id:41530000}\r\n",
3318                 .part_trail = 0x00,
3319                 .soft_ver = SOFT_VER_DEFAULT,
3320 
3321                 /* We're using a dynamic kernel/rootfs split here */
3322                 .partitions = {
3323                         {"fs-uboot", 0x00000, 0x20000},
3324                         {"firmware", 0x20000, 0xde0000},
3325                         {"partition-table", 0xe00000, 0x02000},
3326                         {"default-mac", 0xe10000, 0x00020},
3327                         {"pin", 0xe10100, 0x00020},
3328                         {"product-info", 0xe11100, 0x01000},
3329                         {"soft-version", 0xe20000, 0x01000},
3330                         {"support-list", 0xe21000, 0x01000},
3331                         {"profile", 0xe22000, 0x08000},
3332                         {"user-config", 0xe30000, 0x10000},
3333                         {"default-config", 0xe40000, 0x10000},
3334                         {"radio", 0xff0000, 0x10000},
3335                         {NULL, 0, 0}
3336                 },
3337 
3338                 .first_sysupgrade_partition = "os-image",
3339                 .last_sysupgrade_partition = "file-system"
3340         },
3341         /** Firmware layout for the RE650 V2 (8MB Flash)*/
3342         {
3343                 .id     = "RE650-V2",
3344                 .vendor = "",
3345                 .support_list =
3346                         "SupportList:\n"
3347                         "{product_name:RE650,product_ver:2.0.0,special_id:00000000}\n"
3348                         "{product_name:RE650,product_ver:2.0.0,special_id:45550000}\n"
3349                         "{product_name:RE650,product_ver:2.0.0,special_id:4A500000}\n"
3350                         "{product_name:RE650,product_ver:2.0.0,special_id:41550000}\n"
3351                         "{product_name:RE650,product_ver:2.0.0,special_id:43410000}\n"
3352                         "{product_name:RE650,product_ver:2.0.0,special_id:41530000}\n"
3353                         "{product_name:RE650,product_ver:2.0.0,special_id:55530000}\n",
3354                 .part_trail = 0x00,
3355                 /* For RE650 v2, soft ver is required, otherwise OEM install doesn't work */
3356                 .soft_ver = SOFT_VER_TEXT("soft_ver:2.0.0\n"),
3357 
3358                 /* We're using a dynamic kernel/rootfs split here */
3359                 .partitions = {
3360                         {"fs-uboot", 0x00000, 0x20000},
3361                         {"firmware", 0x20000, 0x7a0000},
3362                         {"partition-table", 0x7c0000, 0x02000},
3363                         {"default-mac", 0x7c2000, 0x00020},
3364                         {"pin", 0x7c2100, 0x00020},
3365                         {"product-info", 0x7c3100, 0x01000},
3366                         {"soft-version", 0x7c4200, 0x01000},
3367                         {"support-list", 0x7c5200, 0x01000},
3368                         {"profile", 0x7c6200, 0x08000},
3369                         {"config-info", 0x7ce200, 0x00400},
3370                         {"user-config", 0x7d0000, 0x10000},
3371                         {"default-config", 0x7e0000, 0x10000},
3372                         {"radio", 0x7f0000, 0x10000},
3373                         {NULL, 0, 0}
3374                 },
3375 
3376                 .first_sysupgrade_partition = "os-image",
3377                 .last_sysupgrade_partition = "file-system"
3378         },
3379 
3380         /** Firmware layout for the Mercusys MR70X */
3381         {
3382                 .id     = "MR70X",
3383                 .vendor = "",
3384                 .support_list =
3385                         "SupportList:\n"
3386                         "{product_name:MR1800X,product_ver:1.0.0,special_id:45550000}\n"
3387                         "{product_name:MR70X,product_ver:1.0.0,special_id:42520000}\n"
3388                         "{product_name:MR70X,product_ver:1.0.0,special_id:45470000}\n"
3389                         "{product_name:MR70X,product_ver:1.0.0,special_id:53470000}\n"
3390                         "{product_name:MR70X,product_ver:1.0.0,special_id:45550000}\n"
3391                         "{product_name:MR70X,product_ver:1.0.0,special_id:4A500000}\n"
3392                         "{product_name:MR70X,product_ver:1.0.0,special_id:55530000}\n",
3393                 .part_trail = 0x00,
3394                 .soft_ver = SOFT_VER_DEFAULT,
3395 
3396                 .partitions = {
3397                         {"fs-uboot", 0x00000, 0x40000},
3398                         {"firmware", 0x40000, 0xf60000},
3399                         {"default-mac", 0xfa0000, 0x00200},
3400                         {"pin", 0xfa0200, 0x00100},
3401                         {"device-id", 0xfa0300, 0x00100},
3402                         {"product-info", 0xfa0400, 0x0fc00},
3403                         {"default-config", 0xfb0000, 0x08000},
3404                         {"ap-def-config", 0xfb8000, 0x08000},
3405                         {"user-config", 0xfc0000, 0x0a000},
3406                         {"ag-config", 0xfca000, 0x04000},
3407                         {"certificate", 0xfce000, 0x02000},
3408                         {"ap-config", 0xfd0000, 0x06000},
3409                         {"router-config", 0xfd6000, 0x06000},
3410                         {"favicon", 0xfdc000, 0x02000},
3411                         {"logo", 0xfde000, 0x02000},
3412                         {"partition-table", 0xfe0000, 0x00800},
3413                         {"soft-version", 0xfe0800, 0x00100},
3414                         {"support-list", 0xfe0900, 0x00200},
3415                         {"profile", 0xfe0b00, 0x03000},
3416                         {"extra-para", 0xfe3b00, 0x00100},
3417                         {"radio", 0xff0000, 0x10000},
3418                         {NULL, 0, 0}
3419                 },
3420 
3421                 .first_sysupgrade_partition = "os-image",
3422                 .last_sysupgrade_partition = "file-system"
3423         },
3424 
3425         {}
3426 };
3427 
3428 #define error(_ret, _errno, _str, ...)                          \
3429         do {                                                    \
3430                 fprintf(stderr, _str ": %s\n", ## __VA_ARGS__,  \
3431                         strerror(_errno));                      \
3432                 if (_ret)                                       \
3433                         exit(_ret);                             \
3434         } while (0)
3435 
3436 
3437 /** Stores a uint32 as big endian */
3438 static inline void put32(uint8_t *buf, uint32_t val) {
3439         buf[0] = val >> 24;
3440         buf[1] = val >> 16;
3441         buf[2] = val >> 8;
3442         buf[3] = val;
3443 }
3444 
3445 static inline bool meta_partition_should_pad(enum partition_trail_value pv)
3446 {
3447         return (pv >= 0) && (pv <= PART_TRAIL_MAX);
3448 }
3449 
3450 /** Allocate a padded meta partition with a correctly initialised header
3451  * If the `data` pointer is NULL, then the required space is only allocated,
3452  * otherwise `data_len` bytes will be copied from `data` into the partition
3453  * entry. */
3454 static struct image_partition_entry init_meta_partition_entry(
3455         const char *name, const void *data, uint32_t data_len,
3456         enum partition_trail_value pad_value)
3457 {
3458         uint32_t total_len = sizeof(struct meta_header) + data_len;
3459         if (meta_partition_should_pad(pad_value))
3460                 total_len += 1;
3461 
3462         struct image_partition_entry entry = {
3463                 .name = name,
3464                 .size = total_len,
3465                 .data = malloc(total_len)
3466         };
3467         if (!entry.data)
3468                 error(1, errno, "failed to allocate meta partition entry");
3469 
3470         struct meta_header *header = (struct meta_header *)entry.data;
3471         header->length = htonl(data_len);
3472         header->zero = 0;
3473 
3474         if (data)
3475                 memcpy(entry.data+sizeof(*header), data, data_len);
3476 
3477         if (meta_partition_should_pad(pad_value))
3478                 entry.data[total_len - 1] = (uint8_t) pad_value;
3479 
3480         return entry;
3481 }
3482 
3483 /** Allocates a new image partition */
3484 static struct image_partition_entry alloc_image_partition(const char *name, size_t len) {
3485         struct image_partition_entry entry = {name, len, malloc(len)};
3486         if (!entry.data)
3487                 error(1, errno, "malloc");
3488 
3489         return entry;
3490 }
3491 
3492 /** Sets up default partition names whenever custom names aren't specified */
3493 static void set_partition_names(struct device_info *info)
3494 {
3495         if (!info->partition_names.partition_table)
3496                 info->partition_names.partition_table = "partition-table";
3497         if (!info->partition_names.soft_ver)
3498                 info->partition_names.soft_ver = "soft-version";
3499         if (!info->partition_names.os_image)
3500                 info->partition_names.os_image = "os-image";
3501         if (!info->partition_names.support_list)
3502                 info->partition_names.support_list = "support-list";
3503         if (!info->partition_names.file_system)
3504                 info->partition_names.file_system = "file-system";
3505         if (!info->partition_names.extra_para)
3506                 info->partition_names.extra_para = "extra-para";
3507 }
3508 
3509 /** Frees an image partition */
3510 static void free_image_partition(struct image_partition_entry *entry)
3511 {
3512         void *data = entry->data;
3513 
3514         entry->name = NULL;
3515         entry->size = 0;
3516         entry->data = NULL;
3517 
3518         free(data);
3519 }
3520 
3521 static time_t source_date_epoch = -1;
3522 static void set_source_date_epoch() {
3523         char *env = getenv("SOURCE_DATE_EPOCH");
3524         char *endptr = env;
3525         errno = 0;
3526         if (env && *env) {
3527                 source_date_epoch = strtoull(env, &endptr, 10);
3528                 if (errno || (endptr && *endptr != '\0')) {
3529                         fprintf(stderr, "Invalid SOURCE_DATE_EPOCH");
3530                         exit(1);
3531                 }
3532         }
3533 }
3534 
3535 /** Generates the partition-table partition */
3536 static struct image_partition_entry make_partition_table(const struct device_info *p)
3537 {
3538         struct image_partition_entry entry = alloc_image_partition(p->partition_names.partition_table, SAFELOADER_PAYLOAD_TABLE_SIZE);
3539 
3540         char *s = (char *)entry.data, *end = (char *)(s+entry.size);
3541 
3542         *(s++) = 0x00;
3543         *(s++) = 0x04;
3544         *(s++) = 0x00;
3545         *(s++) = 0x00;
3546 
3547         size_t i;
3548         for (i = 0; p->partitions[i].name; i++) {
3549                 size_t len = end-s;
3550                 size_t w = snprintf(s, len, "partition %s base 0x%05x size 0x%05x\n",
3551                         p->partitions[i].name, p->partitions[i].base, p->partitions[i].size);
3552 
3553                 if (w > len-1)
3554                         error(1, 0, "flash partition table overflow?");
3555 
3556                 s += w;
3557         }
3558 
3559         s++;
3560 
3561         memset(s, 0xff, end-s);
3562 
3563         return entry;
3564 }
3565 
3566 
3567 /** Generates a binary-coded decimal representation of an integer in the range [0, 99] */
3568 static inline uint8_t bcd(uint8_t v) {
3569         return 0x10 * (v/10) + v%10;
3570 }
3571 
3572 
3573 /** Generates the soft-version partition */
3574 static struct image_partition_entry make_soft_version(const struct device_info *info, uint32_t rev)
3575 {
3576         /** If an info string is provided, use this instead of
3577          * the structured data, and include the null-termination */
3578         if (info->soft_ver.type == SOFT_VER_TYPE_TEXT) {
3579                 uint32_t len = strlen(info->soft_ver.text) + 1;
3580                 return init_meta_partition_entry(info->partition_names.soft_ver,
3581                         info->soft_ver.text, len, info->part_trail);
3582         }
3583 
3584         time_t t;
3585 
3586         if (source_date_epoch != -1)
3587                 t = source_date_epoch;
3588         else if (time(&t) == (time_t)(-1))
3589                 error(1, errno, "time");
3590 
3591         struct tm *tm = gmtime(&t);
3592 
3593         struct soft_version s = {
3594                 .pad1 = 0xff,
3595 
3596                 .version_major = info->soft_ver.num[0],
3597                 .version_minor = info->soft_ver.num[1],
3598                 .version_patch = info->soft_ver.num[2],
3599 
3600                 .year_hi = bcd((1900+tm->tm_year)/100),
3601                 .year_lo = bcd(tm->tm_year%100),
3602                 .month = bcd(tm->tm_mon+1),
3603                 .day = bcd(tm->tm_mday),
3604                 .rev = htonl(rev),
3605 
3606                 .compat_level = htonl(info->soft_ver_compat_level)
3607         };
3608 
3609         if (info->soft_ver_compat_level == 0)
3610                 return init_meta_partition_entry(info->partition_names.soft_ver, &s,
3611                         (uint8_t *)(&s.compat_level) - (uint8_t *)(&s),
3612                         info->part_trail);
3613         else
3614                 return init_meta_partition_entry(info->partition_names.soft_ver, &s,
3615                         sizeof(s), info->part_trail);
3616 }
3617 
3618 /** Generates the support-list partition */
3619 static struct image_partition_entry make_support_list(
3620         const struct device_info *info)
3621 {
3622         uint32_t len = strlen(info->support_list);
3623         return init_meta_partition_entry(info->partition_names.support_list, info->support_list,
3624                 len, info->part_trail);
3625 }
3626 
3627 /** Partition with extra-para data */
3628 static struct image_partition_entry make_extra_para(
3629         const struct device_info *info, const uint8_t *extra_para, size_t len)
3630 {
3631         return init_meta_partition_entry(info->partition_names.extra_para, extra_para, len,
3632                 info->part_trail);
3633 }
3634 
3635 /** Creates a new image partition with an arbitrary name from a file */
3636 static struct image_partition_entry read_file(const char *part_name, const char *filename, bool add_jffs2_eof, struct flash_partition_entry *file_system_partition) {
3637         struct stat statbuf;
3638 
3639         if (stat(filename, &statbuf) < 0)
3640                 error(1, errno, "unable to stat file `%s'", filename);
3641 
3642         size_t len = statbuf.st_size;
3643 
3644         if (add_jffs2_eof) {
3645                 if (file_system_partition)
3646                         len = ALIGN(len + file_system_partition->base, 0x10000) + sizeof(jffs2_eof_mark) - file_system_partition->base;
3647                 else
3648                         len = ALIGN(len, 0x10000) + sizeof(jffs2_eof_mark);
3649         }
3650 
3651         struct image_partition_entry entry = alloc_image_partition(part_name, len);
3652 
3653         FILE *file = fopen(filename, "rb");
3654         if (!file)
3655                 error(1, errno, "unable to open file `%s'", filename);
3656 
3657         if (fread(entry.data, statbuf.st_size, 1, file) != 1)
3658                 error(1, errno, "unable to read file `%s'", filename);
3659 
3660         if (add_jffs2_eof) {
3661                 uint8_t *eof = entry.data + statbuf.st_size, *end = entry.data+entry.size;
3662 
3663                 memset(eof, 0xff, end - eof - sizeof(jffs2_eof_mark));
3664                 memcpy(end - sizeof(jffs2_eof_mark), jffs2_eof_mark, sizeof(jffs2_eof_mark));
3665         }
3666 
3667         fclose(file);
3668 
3669         return entry;
3670 }
3671 
3672 /**
3673    Copies a list of image partitions into an image buffer and generates the image partition table while doing so
3674 
3675    Example image partition table:
3676 
3677      fwup-ptn partition-table base 0x00800 size 0x00800
3678      fwup-ptn os-image base 0x01000 size 0x113b45
3679      fwup-ptn file-system base 0x114b45 size 0x1d0004
3680      fwup-ptn support-list base 0x2e4b49 size 0x000d1
3681 
3682    Each line of the partition table is terminated with the bytes 09 0d 0a ("\t\r\n"),
3683    the end of the partition table is marked with a zero byte.
3684 
3685    The firmware image must contain at least the partition-table and support-list partitions
3686    to be accepted. There aren't any alignment constraints for the image partitions.
3687 
3688    The partition-table partition contains the actual flash layout; partitions
3689    from the image partition table are mapped to the corresponding flash partitions during
3690    the firmware upgrade. The support-list partition contains a list of devices supported by
3691    the firmware image.
3692 
3693    The base offsets in the firmware partition table are relative to the end
3694    of the vendor information block, so the partition-table partition will
3695    actually start at offset 0x1814 of the image.
3696 
3697    I think partition-table must be the first partition in the firmware image.
3698 */
3699 static void put_partitions(uint8_t *buffer, const struct flash_partition_entry *flash_parts, const struct image_partition_entry *parts) {
3700         size_t i, j;
3701         char *image_pt = (char *)buffer, *end = image_pt + SAFELOADER_PAYLOAD_TABLE_SIZE;
3702 
3703         size_t base = SAFELOADER_PAYLOAD_TABLE_SIZE;
3704         for (i = 0; parts[i].name; i++) {
3705                 for (j = 0; flash_parts[j].name; j++) {
3706                         if (!strcmp(flash_parts[j].name, parts[i].name)) {
3707                                 if (parts[i].size > flash_parts[j].size)
3708                                         error(1, 0, "%s partition too big (more than %u bytes)", flash_parts[j].name, (unsigned)flash_parts[j].size);
3709                                 break;
3710                         }
3711                 }
3712 
3713                 assert(flash_parts[j].name);
3714 
3715                 memcpy(buffer + base, parts[i].data, parts[i].size);
3716 
3717                 size_t len = end-image_pt;
3718                 size_t w = snprintf(image_pt, len, "fwup-ptn %s base 0x%05x size 0x%05x\t\r\n", parts[i].name, (unsigned)base, (unsigned)parts[i].size);
3719 
3720                 if (w > len-1)
3721                         error(1, 0, "image partition table overflow?");
3722 
3723                 image_pt += w;
3724 
3725                 base += parts[i].size;
3726         }
3727 }
3728 
3729 /** Generates and writes the image MD5 checksum */
3730 static void put_md5(uint8_t *md5, uint8_t *buffer, unsigned int len) {
3731         MD5_CTX ctx;
3732 
3733         MD5_Init(&ctx);
3734         MD5_Update(&ctx, md5_salt, (unsigned int)sizeof(md5_salt));
3735         MD5_Update(&ctx, buffer, len);
3736         MD5_Final(md5, &ctx);
3737 }
3738 
3739 
3740 /**
3741    Generates the firmware image in factory format
3742 
3743    Image format:
3744 
3745      Bytes (hex)  Usage
3746      -----------  -----
3747      0000-0003    Image size (4 bytes, big endian)
3748      0004-0013    MD5 hash (hash of a 16 byte salt and the image data starting with byte 0x14)
3749      0014-0017    Vendor information length (without padding) (4 bytes, big endian)
3750      0018-1013    Vendor information (4092 bytes, padded with 0xff; there seem to be older
3751                   (VxWorks-based) TP-LINK devices which use a smaller vendor information block)
3752      1014-1813    Image partition table (2048 bytes, padded with 0xff)
3753      1814-xxxx    Firmware partitions
3754 */
3755 static void * generate_factory_image(struct device_info *info, const struct image_partition_entry *parts, size_t *len) {
3756         *len = SAFELOADER_PAYLOAD_OFFSET + SAFELOADER_PAYLOAD_TABLE_SIZE;
3757 
3758         size_t i;
3759         for (i = 0; parts[i].name; i++)
3760                 *len += parts[i].size;
3761 
3762         uint8_t *image = malloc(*len);
3763         if (!image)
3764                 error(1, errno, "malloc");
3765 
3766         memset(image, 0xff, *len);
3767         put32(image, *len);
3768 
3769         if (info->vendor) {
3770                 size_t vendor_len = strlen(info->vendor);
3771                 put32(image + SAFELOADER_PREAMBLE_SIZE, vendor_len);
3772                 memcpy(image + SAFELOADER_PREAMBLE_SIZE + 0x4, info->vendor, vendor_len);
3773         }
3774 
3775         put_partitions(image + SAFELOADER_PAYLOAD_OFFSET, info->partitions, parts);
3776         put_md5(image + 0x04, image + SAFELOADER_PREAMBLE_SIZE, *len - SAFELOADER_PREAMBLE_SIZE);
3777 
3778         return image;
3779 }
3780 
3781 /**
3782    Generates the firmware image in sysupgrade format
3783 
3784    This makes some assumptions about the provided flash and image partition tables and
3785    should be generalized when TP-LINK starts building its safeloader into hardware with
3786    different flash layouts.
3787 */
3788 static void * generate_sysupgrade_image(struct device_info *info, const struct image_partition_entry *image_parts, size_t *len) {
3789         size_t i, j;
3790         size_t flash_first_partition_index = 0;
3791         size_t flash_last_partition_index = 0;
3792         const struct flash_partition_entry *flash_first_partition = NULL;
3793         const struct flash_partition_entry *flash_last_partition = NULL;
3794         const struct image_partition_entry *image_last_partition = NULL;
3795 
3796         /** Find first and last partitions */
3797         for (i = 0; info->partitions[i].name; i++) {
3798                 if (!strcmp(info->partitions[i].name, info->first_sysupgrade_partition)) {
3799                         flash_first_partition = &info->partitions[i];
3800                         flash_first_partition_index = i;
3801                 } else if (!strcmp(info->partitions[i].name, info->last_sysupgrade_partition)) {
3802                         flash_last_partition = &info->partitions[i];
3803                         flash_last_partition_index = i;
3804                 }
3805         }
3806 
3807         assert(flash_first_partition && flash_last_partition);
3808         assert(flash_first_partition_index < flash_last_partition_index);
3809 
3810         /** Find last partition from image to calculate needed size */
3811         for (i = 0; image_parts[i].name; i++) {
3812                 if (!strcmp(image_parts[i].name, info->last_sysupgrade_partition)) {
3813                         image_last_partition = &image_parts[i];
3814                         break;
3815                 }
3816         }
3817 
3818         assert(image_last_partition);
3819 
3820         *len = flash_last_partition->base - flash_first_partition->base + image_last_partition->size;
3821 
3822         uint8_t *image = malloc(*len);
3823         if (!image)
3824                 error(1, errno, "malloc");
3825 
3826         memset(image, 0xff, *len);
3827 
3828         for (i = flash_first_partition_index; i <= flash_last_partition_index; i++) {
3829                 for (j = 0; image_parts[j].name; j++) {
3830                         if (!strcmp(info->partitions[i].name, image_parts[j].name)) {
3831                                 if (image_parts[j].size > info->partitions[i].size)
3832                                         error(1, 0, "%s partition too big (more than %u bytes)", info->partitions[i].name, (unsigned)info->partitions[i].size);
3833                                 memcpy(image + info->partitions[i].base - flash_first_partition->base, image_parts[j].data, image_parts[j].size);
3834                                 break;
3835                         }
3836 
3837                         assert(image_parts[j].name);
3838                 }
3839         }
3840 
3841         return image;
3842 }
3843 
3844 /** Generates an image according to a given layout and writes it to a file */
3845 static void build_image(const char *output,
3846                 const char *kernel_image,
3847                 const char *rootfs_image,
3848                 uint32_t rev,
3849                 bool add_jffs2_eof,
3850                 bool sysupgrade,
3851                 struct device_info *info) {
3852 
3853         size_t i;
3854 
3855         struct image_partition_entry parts[7] = {};
3856 
3857         struct flash_partition_entry *firmware_partition = NULL;
3858         struct flash_partition_entry *os_image_partition = NULL;
3859         struct flash_partition_entry *file_system_partition = NULL;
3860         size_t firmware_partition_index = 0;
3861 
3862         set_partition_names(info);
3863 
3864         for (i = 0; info->partitions[i].name; i++) {
3865                 if (!strcmp(info->partitions[i].name, "firmware"))
3866                 {
3867                         firmware_partition = &info->partitions[i];
3868                         firmware_partition_index = i;
3869                 }
3870         }
3871 
3872         if (firmware_partition)
3873         {
3874                 os_image_partition = &info->partitions[firmware_partition_index];
3875                 file_system_partition = &info->partitions[firmware_partition_index + 1];
3876 
3877                 struct stat kernel;
3878                 if (stat(kernel_image, &kernel) < 0)
3879                         error(1, errno, "unable to stat file `%s'", kernel_image);
3880 
3881                 if (kernel.st_size > firmware_partition->size)
3882                         error(1, 0, "kernel overflowed firmware partition\n");
3883 
3884                 for (i = MAX_PARTITIONS-1; i >= firmware_partition_index + 1; i--)
3885                         info->partitions[i+1] = info->partitions[i];
3886 
3887                 file_system_partition->name = info->partition_names.file_system;
3888 
3889                 file_system_partition->base = firmware_partition->base + kernel.st_size;
3890 
3891                 /* Align partition start to erase blocks for factory images only */
3892                 if (!sysupgrade)
3893                         file_system_partition->base = ALIGN(firmware_partition->base + kernel.st_size, 0x10000);
3894 
3895                 file_system_partition->size = firmware_partition->size - file_system_partition->base;
3896 
3897                 os_image_partition->name = info->partition_names.os_image;
3898 
3899                 os_image_partition->size = kernel.st_size;
3900         }
3901 
3902         parts[0] = make_partition_table(info);
3903         parts[1] = make_soft_version(info, rev);
3904         parts[2] = make_support_list(info);
3905         parts[3] = read_file(info->partition_names.os_image, kernel_image, false, NULL);
3906         parts[4] = read_file(info->partition_names.file_system, rootfs_image, add_jffs2_eof, file_system_partition);
3907 
3908 
3909         /* Some devices need the extra-para partition to accept the firmware */
3910         if (strcasecmp(info->id, "ARCHER-A6-V3") == 0 ||
3911             strcasecmp(info->id, "ARCHER-A7-V5") == 0 ||
3912             strcasecmp(info->id, "ARCHER-A9-V6") == 0 ||
3913             strcasecmp(info->id, "ARCHER-AX23-V1") == 0 ||
3914             strcasecmp(info->id, "ARCHER-C2-V3") == 0 ||
3915             strcasecmp(info->id, "ARCHER-C7-V4") == 0 ||
3916             strcasecmp(info->id, "ARCHER-C7-V5") == 0 ||
3917             strcasecmp(info->id, "ARCHER-C25-V1") == 0 ||
3918             strcasecmp(info->id, "ARCHER-C59-V2") == 0 ||
3919             strcasecmp(info->id, "ARCHER-C60-V2") == 0 ||
3920             strcasecmp(info->id, "ARCHER-C60-V3") == 0 ||
3921             strcasecmp(info->id, "ARCHER-C6U-V1") == 0 ||
3922             strcasecmp(info->id, "ARCHER-C6-V3") == 0 ||
3923             strcasecmp(info->id, "DECO-M4R-V4") == 0 ||
3924             strcasecmp(info->id, "MR70X") == 0 ||
3925             strcasecmp(info->id, "TLWR1043NV5") == 0) {
3926                 const uint8_t extra_para[2] = {0x01, 0x00};
3927                 parts[5] = make_extra_para(info, extra_para,
3928                         sizeof(extra_para));
3929         } else if (strcasecmp(info->id, "ARCHER-C6-V2") == 0 ||
3930                    strcasecmp(info->id, "TL-WA1201-V2") == 0) {
3931                 const uint8_t extra_para[2] = {0x00, 0x01};
3932                 parts[5] = make_extra_para(info, extra_para,
3933                         sizeof(extra_para));
3934         } else if (strcasecmp(info->id, "ARCHER-C6-V2-US") == 0 ||
3935                    strcasecmp(info->id, "EAP245-V3") == 0) {
3936                 const uint8_t extra_para[2] = {0x01, 0x01};
3937                 parts[5] = make_extra_para(info, extra_para,
3938                         sizeof(extra_para));
3939         }
3940 
3941         size_t len;
3942         void *image;
3943         if (sysupgrade)
3944                 image = generate_sysupgrade_image(info, parts, &len);
3945         else
3946                 image = generate_factory_image(info, parts, &len);
3947 
3948         FILE *file = fopen(output, "wb");
3949         if (!file)
3950                 error(1, errno, "unable to open output file");
3951 
3952         if (fwrite(image, len, 1, file) != 1)
3953                 error(1, 0, "unable to write output file");
3954 
3955         fclose(file);
3956 
3957         free(image);
3958 
3959         for (i = 0; parts[i].name; i++)
3960                 free_image_partition(&parts[i]);
3961 }
3962 
3963 /** Usage output */
3964 static void usage(const char *argv0) {
3965         fprintf(stderr,
3966                 "Usage: %s [OPTIONS...]\n"
3967                 "\n"
3968                 "Options:\n"
3969                 "  -h              show this help\n"
3970                 "\n"
3971                 "Info about an image:\n"
3972                 "  -i <file>       input file to read from\n"
3973                 "Create a new image:\n"
3974                 "  -B <board>      create image for the board specified with <board>\n"
3975                 "  -k <file>       read kernel image from the file <file>\n"
3976                 "  -r <file>       read rootfs image from the file <file>\n"
3977                 "  -o <file>       write output to the file <file>\n"
3978                 "  -V <rev>        sets the revision number to <rev>\n"
3979                 "  -j              add jffs2 end-of-filesystem markers\n"
3980                 "  -S              create sysupgrade instead of factory image\n"
3981                 "Extract an old image:\n"
3982                 "  -x <file>       extract all oem firmware partition\n"
3983                 "  -d <dir>        destination to extract the firmware partition\n"
3984                 "  -z <file>       convert an oem firmware into a sysupgade file. Use -o for output file\n",
3985                 argv0
3986         );
3987 };
3988 
3989 
3990 static struct device_info *find_board(const char *id)
3991 {
3992         struct device_info *board = NULL;
3993 
3994         for (board = boards; board->id != NULL; board++)
3995                 if (strcasecmp(id, board->id) == 0)
3996                         return board;
3997 
3998         return NULL;
3999 }
4000 
4001 static int add_flash_partition(
4002                 struct flash_partition_entry *part_list,
4003                 size_t max_entries,
4004                 const char *name,
4005                 unsigned long base,
4006                 unsigned long size)
4007 {
4008         size_t ptr;
4009         /* check if the list has a free entry */
4010         for (ptr = 0; ptr < max_entries; ptr++, part_list++) {
4011                 if (part_list->name == NULL &&
4012                                 part_list->base == 0 &&
4013                                 part_list->size == 0)
4014                         break;
4015         }
4016 
4017         if (ptr == max_entries) {
4018                 error(1, 0, "No free flash part entry available.");
4019         }
4020 
4021         part_list->name = calloc(1, strlen(name) + 1);
4022         if (!part_list->name) {
4023                 error(1, 0, "Unable to allocate memory");
4024         }
4025 
4026         memcpy((char *)part_list->name, name, strlen(name));
4027         part_list->base = base;
4028         part_list->size = size;
4029 
4030         return 0;
4031 }
4032 
4033 /** read the partition table into struct flash_partition_entry */
4034 enum PARTITION_TABLE_TYPE {
4035         PARTITION_TABLE_FWUP,
4036         PARTITION_TABLE_FLASH,
4037 };
4038 
4039 static int read_partition_table(
4040                 FILE *file, long offset,
4041                 struct flash_partition_entry *entries, size_t max_entries,
4042                 int type)
4043 {
4044         char buf[SAFELOADER_PAYLOAD_TABLE_SIZE];
4045         char *ptr, *end;
4046         const char *parthdr = NULL;
4047         const char *fwuphdr = "fwup-ptn";
4048         const char *flashhdr = "partition";
4049 
4050         /* TODO: search for the partition table */
4051 
4052         switch(type) {
4053         case PARTITION_TABLE_FWUP:
4054                 parthdr = fwuphdr;
4055                 break;
4056         case PARTITION_TABLE_FLASH:
4057                 parthdr = flashhdr;
4058                 break;
4059         default:
4060                 error(1, 0, "Invalid partition table");
4061         }
4062 
4063         if (fseek(file, offset, SEEK_SET) < 0)
4064                 error(1, errno, "Can not seek in the firmware");
4065 
4066         if (fread(buf, sizeof(buf), 1, file) != 1)
4067                 error(1, errno, "Can not read fwup-ptn from the firmware");
4068 
4069         buf[sizeof(buf) - 1] = '\0';
4070 
4071         /* look for the partition header */
4072         if (memcmp(buf, parthdr, strlen(parthdr)) != 0) {
4073                 fprintf(stderr, "DEBUG: can not find fwuphdr\n");
4074                 return 1;
4075         }
4076 
4077         ptr = buf;
4078         end = buf + sizeof(buf);
4079         while ((ptr + strlen(parthdr)) < end &&
4080                         memcmp(ptr, parthdr, strlen(parthdr)) == 0) {
4081                 char *end_part;
4082                 char *end_element;
4083 
4084                 char name[32] = { 0 };
4085                 int name_len = 0;
4086                 unsigned long base = 0;
4087                 unsigned long size = 0;
4088 
4089                 end_part = memchr(ptr, '\n', (end - ptr));
4090                 if (end_part == NULL) {
4091                         /* in theory this should never happen, because a partition always ends with 0x09, 0x0D, 0x0A */
4092                         break;
4093                 }
4094 
4095                 for (int i = 0; i <= 4; i++) {
4096                         if (end_part <= ptr)
4097                                 break;
4098 
4099                         end_element = memchr(ptr, 0x20, (end_part - ptr));
4100                         if (end_element == NULL) {
4101                                 error(1, errno, "Ignoring the rest of the partition entries.");
4102                                 break;
4103                         }
4104 
4105                         switch (i) {
4106                                 /* partition header */
4107                                 case 0:
4108                                         ptr = end_element + 1;
4109                                         continue;
4110                                 /* name */
4111                                 case 1:
4112                                         name_len = (end_element - ptr) > 31 ? 31 : (end_element - ptr);
4113                                         strncpy(name, ptr, name_len);
4114                                         name[name_len] = '\0';
4115                                         ptr = end_element + 1;
4116                                         continue;
4117 
4118                                 /* string "base" */
4119                                 case 2:
4120                                         ptr = end_element + 1;
4121                                         continue;
4122 
4123                                 /* actual base */
4124                                 case 3:
4125                                         base = strtoul(ptr, NULL, 16);
4126                                         ptr = end_element + 1;
4127                                         continue;
4128 
4129                                 /* string "size" */
4130                                 case 4:
4131                                         ptr = end_element + 1;
4132                                         /* actual size. The last element doesn't have a sepeartor */
4133                                         size = strtoul(ptr, NULL, 16);
4134                                         /* the part ends with 0x09, 0x0d, 0x0a */
4135                                         ptr = end_part + 1;
4136                                         add_flash_partition(entries, max_entries, name, base, size);
4137                                         continue;
4138                         }
4139                 }
4140         }
4141 
4142         return 0;
4143 }
4144 
4145 static void safeloader_read_partition(FILE *input_file, size_t payload_offset,
4146                                       struct flash_partition_entry *entry,
4147                                       struct image_partition_entry *part)
4148 {
4149         size_t part_size = entry->size;
4150         void *part_data = malloc(part_size);
4151 
4152         if (fseek(input_file, payload_offset, SEEK_SET))
4153                 error(1, errno, "Failed to seek to partition data");
4154 
4155         if (!part_data)
4156                 error(1, ENOMEM, "Failed to allocate partition data");
4157 
4158         if (fread(part_data, 1, part_size, input_file) < part_size)
4159                 error(1, errno, "Failed to read partition data");
4160 
4161         part->data = part_data;
4162         part->size = part_size;
4163         part->name = entry->name;
4164 }
4165 
4166 static void safeloader_parse_image(FILE *input_file, struct safeloader_image_info *image)
4167 {
4168         static const char *HEADER_ID_CLOUD = "fw-type:Cloud";
4169         static const char *HEADER_ID_QNEW = "?NEW";
4170 
4171         char buf[64];
4172 
4173         if (!input_file)
4174                 return;
4175 
4176         fseek(input_file, SAFELOADER_PREAMBLE_SIZE, SEEK_SET);
4177 
4178         if (fread(buf, sizeof(buf), 1, input_file) != 1)
4179                 error(1, errno, "Can not read image header");
4180 
4181         if (memcmp(HEADER_ID_QNEW, &buf[0], strlen(HEADER_ID_QNEW)) == 0)
4182                 image->type = SAFELOADER_TYPE_QNEW;
4183         else if (memcmp(HEADER_ID_CLOUD, &buf[0], strlen(HEADER_ID_CLOUD)) == 0)
4184                 image->type = SAFELOADER_TYPE_CLOUD;
4185         else if (ntohl(*((uint32_t *) &buf[0])) <= SAFELOADER_HEADER_SIZE)
4186                 image->type = SAFELOADER_TYPE_VENDOR;
4187         else
4188                 image->type = SAFELOADER_TYPE_DEFAULT;
4189 
4190         switch (image->type) {
4191         case SAFELOADER_TYPE_DEFAULT:
4192         case SAFELOADER_TYPE_VENDOR:
4193         case SAFELOADER_TYPE_CLOUD:
4194                 image->payload_offset = SAFELOADER_PAYLOAD_OFFSET;
4195                 break;
4196         case SAFELOADER_TYPE_QNEW:
4197                 image->payload_offset = SAFELOADER_QNEW_PAYLOAD_OFFSET;
4198                 break;
4199         }
4200 
4201         /* Parse image partition table */
4202         read_partition_table(input_file, image->payload_offset, &image->entries[0],
4203                              MAX_PARTITIONS, PARTITION_TABLE_FWUP);
4204 }
4205 
4206 static void write_partition(
4207                 FILE *input_file,
4208                 size_t firmware_offset,
4209                 struct flash_partition_entry *entry,
4210                 FILE *output_file)
4211 {
4212         char buf[4096];
4213         size_t offset;
4214 
4215         fseek(input_file, entry->base + firmware_offset, SEEK_SET);
4216 
4217         for (offset = 0; sizeof(buf) + offset <= entry->size; offset += sizeof(buf)) {
4218                 if (fread(buf, sizeof(buf), 1, input_file) != 1)
4219                         error(1, errno, "Can not read partition from input_file");
4220 
4221                 if (fwrite(buf, sizeof(buf), 1, output_file) != 1)
4222                         error(1, errno, "Can not write partition to output_file");
4223         }
4224         /* write last chunk smaller than buffer */
4225         if (offset < entry->size) {
4226                 offset = entry->size - offset;
4227                 if (fread(buf, offset, 1, input_file) != 1)
4228                         error(1, errno, "Can not read partition from input_file");
4229                 if (fwrite(buf, offset, 1, output_file) != 1)
4230                         error(1, errno, "Can not write partition to output_file");
4231         }
4232 }
4233 
4234 static int extract_firmware_partition(FILE *input_file, size_t firmware_offset, struct flash_partition_entry *entry, const char *output_directory)
4235 {
4236         FILE *output_file;
4237         char output[PATH_MAX];
4238 
4239         snprintf(output, PATH_MAX, "%s/%s", output_directory, entry->name);
4240         output_file = fopen(output, "wb+");
4241         if (output_file == NULL) {
4242                 error(1, errno, "Can not open output file %s", output);
4243         }
4244 
4245         write_partition(input_file, firmware_offset, entry, output_file);
4246 
4247         fclose(output_file);
4248 
4249         return 0;
4250 }
4251 
4252 /** extract all partitions from the firmware file */
4253 static int extract_firmware(const char *input, const char *output_directory)
4254 {
4255         struct safeloader_image_info info = {};
4256         struct stat statbuf;
4257         FILE *input_file;
4258 
4259         /* check input file */
4260         if (stat(input, &statbuf)) {
4261                 error(1, errno, "Can not read input firmware %s", input);
4262         }
4263 
4264         /* check if output directory exists */
4265         if (stat(output_directory, &statbuf)) {
4266                 error(1, errno, "Failed to stat output directory %s", output_directory);
4267         }
4268 
4269         if ((statbuf.st_mode & S_IFMT) != S_IFDIR) {
4270                 error(1, errno, "Given output directory is not a directory %s", output_directory);
4271         }
4272 
4273         input_file = fopen(input, "rb");
4274         safeloader_parse_image(input_file, &info);
4275 
4276         for (size_t i = 0; i < MAX_PARTITIONS && info.entries[i].name; i++)
4277                 extract_firmware_partition(input_file, info.payload_offset, &info.entries[i], output_directory);
4278 
4279         return 0;
4280 }
4281 
4282 static struct flash_partition_entry *find_partition(
4283                 struct flash_partition_entry *entries, size_t max_entries,
4284                 const char *name, const char *error_msg)
4285 {
4286         for (size_t i = 0; i < max_entries; i++, entries++) {
4287                 if (strcmp(entries->name, name) == 0)
4288                         return entries;
4289         }
4290 
4291         if (error_msg) {
4292                 error(1, 0, "%s", error_msg);
4293         }
4294 
4295         return NULL;
4296 }
4297 
4298 static int firmware_info(const char *input)
4299 {
4300         struct safeloader_image_info info = {};
4301         struct image_partition_entry part = {};
4302         struct flash_partition_entry *e;
4303         FILE *input_file;
4304 
4305         input_file = fopen(input, "rb");
4306 
4307         safeloader_parse_image(input_file, &info);
4308 
4309         if (info.type == SAFELOADER_TYPE_VENDOR) {
4310                 char buf[SAFELOADER_HEADER_SIZE] = {};
4311                 uint32_t vendor_size;
4312 
4313                 fseek(input_file, SAFELOADER_PREAMBLE_SIZE, SEEK_SET);
4314                 fread(&vendor_size, sizeof(uint32_t), 1, input_file);
4315 
4316                 vendor_size = ntohl(vendor_size);
4317                 fread(buf, vendor_size, 1, input_file);
4318 
4319                 printf("Firmware vendor string:\n");
4320                 fwrite(buf, strnlen(buf, vendor_size), 1, stdout);
4321                 printf("\n");
4322         }
4323 
4324         printf("Firmware image partitions:\n");
4325         printf("%-8s %-8s %s\n", "base", "size", "name");
4326 
4327         e = &info.entries[0];
4328         for (unsigned int i = 0; i < MAX_PARTITIONS && e->name; i++, e++)
4329                 printf("%08x %08x %s\n", e->base, e->size, e->name);
4330 
4331         e = find_partition(&info.entries[0], MAX_PARTITIONS, "soft-version", NULL);
4332         if (e) {
4333                 struct soft_version *s;
4334                 unsigned int ascii_len;
4335                 const uint8_t *buf;
4336                 size_t data_len;
4337                 bool isstr;
4338 
4339                 safeloader_read_partition(input_file, info.payload_offset + e->base, e, &part);
4340                 data_len = ntohl(((struct meta_header *) part.data)->length);
4341                 buf = part.data + sizeof(struct meta_header);
4342 
4343                 /* Check for (null-terminated) string */
4344                 ascii_len = 0;
4345                 while (ascii_len < data_len && isascii(buf[ascii_len]))
4346                         ascii_len++;
4347 
4348                 isstr = ascii_len == data_len;
4349 
4350                 printf("\n[Software version]\n");
4351                 if (isstr) {
4352                         fwrite(buf, strnlen((const char *) buf, data_len), 1, stdout);
4353                         putchar('\n');
4354                 } else if (data_len >= offsetof(struct soft_version, rev)) {
4355                         s = (struct soft_version *) buf;
4356 
4357                         printf("Version: %d.%d.%d\n", s->version_major, s->version_minor, s->version_patch);
4358                         printf("Date: %02x%02x-%02x-%02x\n", s->year_hi, s->year_lo, s->month, s->day);
4359                         printf("Revision: %d\n", ntohl(s->rev));
4360 
4361                         if (data_len >= offsetof(struct soft_version, compat_level)) {
4362                                 printf("Compatibility level: %d\n", ntohl(s->compat_level));
4363                         }
4364                 } else {
4365                         printf("Failed to parse data\n");
4366                 }
4367 
4368                 free_image_partition(&part);
4369         }
4370 
4371         e = find_partition(&info.entries[0], MAX_PARTITIONS, "support-list", NULL);
4372         if (e) {
4373                 size_t data_len;
4374 
4375                 safeloader_read_partition(input_file, info.payload_offset + e->base, e, &part);
4376                 data_len = ntohl(((struct meta_header *) part.data)->length);
4377 
4378                 printf("\n[Support list]\n");
4379                 fwrite(part.data + sizeof(struct meta_header), data_len, 1, stdout);
4380                 printf("\n");
4381 
4382                 free_image_partition(&part);
4383         }
4384 
4385         e = find_partition(&info.entries[0], MAX_PARTITIONS, "partition-table", NULL);
4386         if (e) {
4387                 size_t flash_table_offset = info.payload_offset + e->base + 4;
4388                 struct flash_partition_entry parts[MAX_PARTITIONS] = {};
4389 
4390                 if (read_partition_table(input_file, flash_table_offset, parts, MAX_PARTITIONS, PARTITION_TABLE_FLASH))
4391                         error(1, 0, "Error can not read the partition table (partition)");
4392 
4393                 printf("\n[Partition table]\n");
4394                 printf("%-8s %-8s %s\n", "base", "size", "name");
4395 
4396                 e = &parts[0];
4397                 for (unsigned int i = 0; i < MAX_PARTITIONS && e->name; i++, e++)
4398                         printf("%08x %08x %s\n", e->base, e->size, e->name);
4399         }
4400 
4401         fclose(input_file);
4402 
4403         return 0;
4404 }
4405 
4406 static void write_ff(FILE *output_file, size_t size)
4407 {
4408         char buf[4096];
4409         size_t offset;
4410 
4411         memset(buf, 0xff, sizeof(buf));
4412 
4413         for (offset = 0; offset + sizeof(buf) < size ; offset += sizeof(buf)) {
4414                 if (fwrite(buf, sizeof(buf), 1, output_file) != 1)
4415                         error(1, errno, "Can not write 0xff to output_file");
4416         }
4417 
4418         /* write last chunk smaller than buffer */
4419         if (offset < size) {
4420                 offset = size - offset;
4421                 if (fwrite(buf, offset, 1, output_file) != 1)
4422                         error(1, errno, "Can not write partition to output_file");
4423         }
4424 }
4425 
4426 static void convert_firmware(const char *input, const char *output)
4427 {
4428         struct flash_partition_entry flash[MAX_PARTITIONS] = {};
4429         struct flash_partition_entry *fwup_partition_table;
4430         struct flash_partition_entry *flash_file_system;
4431         struct flash_partition_entry *fwup_file_system;
4432         struct flash_partition_entry *flash_os_image;
4433         struct flash_partition_entry *fwup_os_image;
4434         struct safeloader_image_info info = {};
4435         size_t flash_table_offset;
4436         struct stat statbuf;
4437         FILE *output_file;
4438         FILE *input_file;
4439 
4440         /* check input file */
4441         if (stat(input, &statbuf)) {
4442                 error(1, errno, "Can not read input firmware %s", input);
4443         }
4444 
4445         input_file = fopen(input, "rb");
4446         if (!input_file)
4447                 error(1, 0, "Can not open input firmware %s", input);
4448 
4449         output_file = fopen(output, "wb");
4450         if (!output_file)
4451                 error(1, 0, "Can not open output firmware %s", output);
4452 
4453         input_file = fopen(input, "rb");
4454         safeloader_parse_image(input_file, &info);
4455 
4456         fwup_os_image = find_partition(info.entries, MAX_PARTITIONS,
4457                         "os-image", "Error can not find os-image partition (fwup)");
4458         fwup_file_system = find_partition(info.entries, MAX_PARTITIONS,
4459                         "file-system", "Error can not find file-system partition (fwup)");
4460         fwup_partition_table = find_partition(info.entries, MAX_PARTITIONS,
4461                         "partition-table", "Error can not find partition-table partition");
4462 
4463         /* the flash partition table has a 0x00000004 magic haeder */
4464         flash_table_offset = info.payload_offset + fwup_partition_table->base + 4;
4465         if (read_partition_table(input_file, flash_table_offset, flash, MAX_PARTITIONS, PARTITION_TABLE_FLASH) != 0)
4466                 error(1, 0, "Error can not read the partition table (flash)");
4467 
4468         flash_os_image = find_partition(flash, MAX_PARTITIONS,
4469                         "os-image", "Error can not find os-image partition (flash)");
4470         flash_file_system = find_partition(flash, MAX_PARTITIONS,
4471                         "file-system", "Error can not find file-system partition (flash)");
4472 
4473         /* write os_image to 0x0 */
4474         write_partition(input_file, info.payload_offset, fwup_os_image, output_file);
4475         write_ff(output_file, flash_os_image->size - fwup_os_image->size);
4476 
4477         /* write file-system behind os_image */
4478         fseek(output_file, flash_file_system->base - flash_os_image->base, SEEK_SET);
4479         write_partition(input_file, info.payload_offset, fwup_file_system, output_file);
4480 
4481         fclose(output_file);
4482         fclose(input_file);
4483 }
4484 
4485 int main(int argc, char *argv[]) {
4486         const char *info_image = NULL, *board = NULL, *kernel_image = NULL, *rootfs_image = NULL, *output = NULL;
4487         const char *extract_image = NULL, *output_directory = NULL, *convert_image = NULL;
4488         bool add_jffs2_eof = false, sysupgrade = false;
4489         unsigned rev = 0;
4490         struct device_info *info;
4491         set_source_date_epoch();
4492 
4493         while (true) {
4494                 int c;
4495 
4496                 c = getopt(argc, argv, "i:B:k:r:o:V:jSh:x:d:z:");
4497                 if (c == -1)
4498                         break;
4499 
4500                 switch (c) {
4501                 case 'i':
4502                         info_image = optarg;
4503                         break;
4504 
4505                 case 'B':
4506                         board = optarg;
4507                         break;
4508 
4509                 case 'k':
4510                         kernel_image = optarg;
4511                         break;
4512 
4513                 case 'r':
4514                         rootfs_image = optarg;
4515                         break;
4516 
4517                 case 'o':
4518                         output = optarg;
4519                         break;
4520 
4521                 case 'V':
4522                         sscanf(optarg, "r%u", &rev);
4523                         break;
4524 
4525                 case 'j':
4526                         add_jffs2_eof = true;
4527                         break;
4528 
4529                 case 'S':
4530                         sysupgrade = true;
4531                         break;
4532 
4533                 case 'h':
4534                         usage(argv[0]);
4535                         return 0;
4536 
4537                 case 'd':
4538                         output_directory = optarg;
4539                         break;
4540 
4541                 case 'x':
4542                         extract_image = optarg;
4543                         break;
4544 
4545                 case 'z':
4546                         convert_image = optarg;
4547                         break;
4548 
4549                 default:
4550                         usage(argv[0]);
4551                         return 1;
4552                 }
4553         }
4554 
4555         if (info_image) {
4556                 firmware_info(info_image);
4557         } else if (extract_image || output_directory) {
4558                 if (!extract_image)
4559                         error(1, 0, "No factory/oem image given via -x <file>. Output directory is only valid with -x");
4560                 if (!output_directory)
4561                         error(1, 0, "Can not extract an image without output directory. Use -d <dir>");
4562                 extract_firmware(extract_image, output_directory);
4563         } else if (convert_image) {
4564                 if (!output)
4565                         error(1, 0, "Can not convert a factory/oem image into sysupgrade image without output file. Use -o <file>");
4566                 convert_firmware(convert_image, output);
4567         } else {
4568                 if (!board)
4569                         error(1, 0, "no board has been specified");
4570                 if (!kernel_image)
4571                         error(1, 0, "no kernel image has been specified");
4572                 if (!rootfs_image)
4573                         error(1, 0, "no rootfs image has been specified");
4574                 if (!output)
4575                         error(1, 0, "no output filename has been specified");
4576 
4577                 info = find_board(board);
4578 
4579                 if (info == NULL)
4580                         error(1, 0, "unsupported board %s", board);
4581 
4582                 build_image(output, kernel_image, rootfs_image, rev, add_jffs2_eof, sysupgrade, info);
4583         }
4584 
4585         return 0;
4586 }
4587 

This page was automatically generated by LXR 0.3.1.  •  OpenWrt