From patchwork Wed Aug 5 18:07:57 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Weijie Gao X-Patchwork-Id: 504152 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from arrakis.dune.hu (arrakis.dune.hu [78.24.191.176]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 632DD1402B4 for ; Thu, 6 Aug 2015 04:08:55 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=zuyyQiJE; dkim-atps=neutral Received: from arrakis.dune.hu (localhost [127.0.0.1]) by arrakis.dune.hu (Postfix) with ESMTP id CF8DF284304; Wed, 5 Aug 2015 20:07:39 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on arrakis.dune.hu X-Spam-Level: X-Spam-Status: No, score=-1.5 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID autolearn=unavailable version=3.3.2 Received: from arrakis.dune.hu (localhost [127.0.0.1]) by arrakis.dune.hu (Postfix) with ESMTP id 268DD28BB53 for ; Wed, 5 Aug 2015 20:07:32 +0200 (CEST) X-policyd-weight: using cached result; rate: -8.5 Received: from mail-pd0-f176.google.com (mail-pd0-f176.google.com [209.85.192.176]) by arrakis.dune.hu (Postfix) with ESMTPS for ; Wed, 5 Aug 2015 20:07:27 +0200 (CEST) Received: by pdco4 with SMTP id o4so21475973pdc.3 for ; Wed, 05 Aug 2015 11:08:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=loreIOWdvSHBA1gPMO6vtR0we2w0k/1t2az/FQFUlsI=; b=zuyyQiJEyweS0/Q2+8Vqvz5VeNsRTAoPPAylJYyZZbIWmxtn7sGg++YtrtAexdhbBQ 0Y4HV8h4nld9DE4jLyfvilm3qIcPh2+F0k/K8senztdYYcPZ+ljeKViEXrSW8OyCj22I C8upgIBDG4PK+BKwna5Vgo6lr0dSRdOXc40uOsDmpxAPSorn9LRZDIlLrT4iKvNPcxVg X+EHdp9po0EZNkEZny8UdgHuWLrs8cVv5+k4swGDgkOVSASz/dDTF/THSw1VU+6JZuz4 iBhVv0BZybOkKnWxyIH69Q6Zs82iq9gmHkclK3nM0CTW+4CMF+WsMUCpjKVIUc/Y6Slo Ai/w== X-Received: by 10.70.38.69 with SMTP id e5mr21729563pdk.27.1438798083589; Wed, 05 Aug 2015 11:08:03 -0700 (PDT) Received: from localhost ([2605:f700:40:c00::ab48:b246]) by smtp.gmail.com with ESMTPSA id xw4sm3621810pbc.69.2015.08.05.11.08.02 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 05 Aug 2015 11:08:02 -0700 (PDT) From: Weijie Gao To: openwrt-devel@lists.openwrt.org Date: Thu, 6 Aug 2015 02:07:57 +0800 Message-Id: <1438798077-31163-1-git-send-email-hackpascal@gmail.com> X-Mailer: git-send-email 2.1.4 Subject: [OpenWrt-Devel] [PATCH 2/3] ar71xx: add 64kb bootloader mtd parser for tplinkpart X-BeenThere: openwrt-devel@lists.openwrt.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: OpenWrt Development List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: openwrt-devel-bounces@lists.openwrt.org Sender: "openwrt-devel" Signed-off-by: Weijie Gao This patch adds flash layout parser for TP-Link firmwares which have a 64kb bootloader. This is used for TP-Link TL-WDR6500 v2. --- target/linux/ar71xx/files/drivers/mtd/tplinkpart.c | 35 ++++++++++++++++++---- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/target/linux/ar71xx/files/drivers/mtd/tplinkpart.c b/target/linux/ar71xx/files/drivers/mtd/tplinkpart.c index ab952b6..b967e25 100644 --- a/target/linux/ar71xx/files/drivers/mtd/tplinkpart.c +++ b/target/linux/ar71xx/files/drivers/mtd/tplinkpart.c @@ -18,10 +18,12 @@ #define TPLINK_NUM_PARTS 5 #define TPLINK_HEADER_V1 0x01000000 +#define TPLINK_HEADER_V2 0x02000000 #define MD5SUM_LEN 16 #define TPLINK_ART_LEN 0x10000 #define TPLINK_KERNEL_OFFS 0x20000 +#define TPLINK_64K_KERNEL_OFFS 0x10000 struct tplink_fw_header { uint32_t version; /* header version */ @@ -70,7 +72,7 @@ tplink_read_header(struct mtd_info *mtd, size_t offset) /* sanity checks */ t = be32_to_cpu(header->version); - if (t != TPLINK_HEADER_V1) + if ((t != TPLINK_HEADER_V1) && (t != TPLINK_HEADER_V2)) goto err_free_header; t = be32_to_cpu(header->kernel_ofs); @@ -106,14 +108,14 @@ static int tplink_check_rootfs_magic(struct mtd_info *mtd, size_t offset) return 0; } -static int tplink_parse_partitions(struct mtd_info *master, +static int tplink_parse_partitions_offset(struct mtd_info *master, struct mtd_partition **pparts, - struct mtd_part_parser_data *data) + struct mtd_part_parser_data *data, + size_t offset) { struct mtd_partition *parts; struct tplink_fw_header *header; int nr_parts; - size_t offset; size_t art_offset; size_t rootfs_offset; size_t squashfs_offset; @@ -126,8 +128,6 @@ static int tplink_parse_partitions(struct mtd_info *master, goto err; } - offset = TPLINK_KERNEL_OFFS; - header = tplink_read_header(master, offset); if (!header) { pr_notice("%s: no TP-Link header found\n", master->name); @@ -180,15 +180,38 @@ err: return ret; } +static int tplink_parse_partitions(struct mtd_info *master, + struct mtd_partition **pparts, + struct mtd_part_parser_data *data) +{ + return tplink_parse_partitions_offset(master, pparts, data, + TPLINK_KERNEL_OFFS); +} + +static int tplink_parse_64k_partitions(struct mtd_info *master, + struct mtd_partition **pparts, + struct mtd_part_parser_data *data) +{ + return tplink_parse_partitions_offset(master, pparts, data, + TPLINK_64K_KERNEL_OFFS); +} + static struct mtd_part_parser tplink_parser = { .owner = THIS_MODULE, .parse_fn = tplink_parse_partitions, .name = "tp-link", }; +static struct mtd_part_parser tplink_64k_parser = { + .owner = THIS_MODULE, + .parse_fn = tplink_parse_64k_partitions, + .name = "tp-link-64k", +}; + static int __init tplink_parser_init(void) { register_mtd_parser(&tplink_parser); + register_mtd_parser(&tplink_64k_parser); return 0; }