From patchwork Tue Sep 24 13:11:09 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Szyprowski X-Patchwork-Id: 1166587 X-Patchwork-Delegate: matthias.bgg@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=samsung.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=samsung.com header.i=@samsung.com header.b="ZN5Q7HQ3"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 46d1qC3dtGz9sPD for ; Tue, 24 Sep 2019 23:13:59 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id 3BF8BC21E3E; Tue, 24 Sep 2019 13:12:07 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=SPF_HELO_PASS, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id A90FCC21E2F; Tue, 24 Sep 2019 13:11:26 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 48A7DC21D8E; Tue, 24 Sep 2019 13:11:24 +0000 (UTC) Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) by lists.denx.de (Postfix) with ESMTPS id 0F2E7C21DAF for ; Tue, 24 Sep 2019 13:11:23 +0000 (UTC) Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20190924131122euoutp01297a1b6432a9bebfe87b50a7d3610b36~HYfD4M9vO0825608256euoutp016 for ; Tue, 24 Sep 2019 13:11:22 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20190924131122euoutp01297a1b6432a9bebfe87b50a7d3610b36~HYfD4M9vO0825608256euoutp016 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1569330682; bh=7EYaJVBnqaoT1lE2q3Pfj3AePPKtjO60jDfyc9FUR4Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ZN5Q7HQ37TcNbaFnW6Tyq+Q2JtY0DYmLRQN1aN6YaXPbnccXGP4K03vhCYMA45gZf 6c3GjWHdB6fx3/sBGJgGZi2cDnneIeRViGi6ZVuNwHwu62CqiQCYp4I1zIvIbaBulG pTYHWufJ+0QTB4IE3Sf/ujjiHcE3jE5YX8qbN0Tg= Received: from eusmges2new.samsung.com (unknown [203.254.199.244]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20190924131122eucas1p2ac1f6f240fdec9034178cab5d66c8be6~HYfDdrOCz1618816188eucas1p2d; Tue, 24 Sep 2019 13:11:22 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges2new.samsung.com (EUCPMTA) with SMTP id 00.3B.04309.AF51A8D5; Tue, 24 Sep 2019 14:11:22 +0100 (BST) Received: from eusmtrp2.samsung.com (unknown [182.198.249.139]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20190924131121eucas1p1a84a6913a71070d85f733e0dce3106d5~HYfC5g6FE3143131431eucas1p1z; Tue, 24 Sep 2019 13:11:21 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eusmtrp2.samsung.com (KnoxPortal) with ESMTP id 20190924131121eusmtrp2c03cb6c795cabf508236d8228ff48bdb~HYfC48HtS1458114581eusmtrp2L; Tue, 24 Sep 2019 13:11:21 +0000 (GMT) X-AuditID: cbfec7f4-afbff700000010d5-b3-5d8a15fabb9b Received: from eusmtip2.samsung.com ( [203.254.199.222]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id BD.93.04117.9F51A8D5; Tue, 24 Sep 2019 14:11:21 +0100 (BST) Received: from AMDC2765.digital.local (unknown [106.120.51.73]) by eusmtip2.samsung.com (KnoxPortal) with ESMTPA id 20190924131121eusmtip27c1ce467917e5f9fdb45c782fbab5e4e~HYfCdJ50T0443604436eusmtip2A; Tue, 24 Sep 2019 13:11:21 +0000 (GMT) From: Marek Szyprowski To: u-boot@lists.denx.de Date: Tue, 24 Sep 2019 15:11:09 +0200 Message-Id: <20190924131111.1691-5-m.szyprowski@samsung.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190924131111.1691-1-m.szyprowski@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA0VSa0hTURz33Me8ria3zfKPldIoITFN6cONLLQkLoXQlyANyZWXqem0TWdW iKXNXJY2zUTyLT5m5oM1H2jk0pZK+coUKUixl7AKXA+Xj5xX7dvveX6Hw6FwcTrpRkUrEjml QhYrFQgJ44v5wX22rdrw/RkDm5jmwkaSmbBpSObzt1GMaeh578iU5c2QTFOphWAK874KGEtX lmMgxZYUvSTYV+/aEHvXoEdso2GMYFtm2VNkmDAgkouNVnNK3yMRwqjst2+wBK375ZzpcZSG boMWOVFAH4DqknxMi4SUmK5FMNhjXSNWBHV9ujUyh6C12EKuV7qnOkneqEFg+/4XbVT0XbWY PSWg/UBr0Qrs2IUGsOWMrYZwuhWDzJvjhN2Q0Cfg4eCX1RBB74Hhqj+4HYvoAMhY6nTk5zyg vunZqu5EHwbzqGl1GujfArDWlayFgmH4VwXGYwnMmg1r+g5Ybi/F+EI6gqnXDY48yUYweqMQ 8alD8Nw8vHIstXK/vdDY4cvLQaCv/YHZZaCdYcKyxS7jK1BnfIDzsghuacR82hOKzI83ZruH RnAes9BhXCD4F8pFYK1Kw3KRR9H/sTKE9MiVS1LFyTmVv4JL9lHJ4lRJCrnPhfi4FrTyNQaW zNY21LFw3oRoCkk3iwJJbbiYlKlVKXEmBBQudRG1eGnCxaJIWcoVThl/TpkUy6lMaDtFSF1F Vx0+nBXTclkid5HjEjjluotRTm5p6I5k4thxT41a0Xs69Ulza9jMfV3/JBta506FxGYkZumq vdUNGLtYWb5oOPloMjgiJnRnagGGj+xyPjr0tN+Yn7k7/EyBvlgycHAQPg5dq0/uC6iR9FbK vUc/zRlDtjF0Rfl1Xbsshtb2/7y0bJ6Yv9fjn7UclGway3KYFi2mSAlVlMzPC1eqZP8ARg+g ahYDAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrELMWRmVeSWpSXmKPExsVy+t/xe7o/RbtiDS7P0LDYOGM9q8WNX22s Fs/fXWayWHvkLrvFgslPWC02zH/LYjFj8ks2i7d7O9kdODzmzTrB4nH2zg5Gj74tqxg91m+5 yuKx6ZVHAGuUnk1RfmlJqkJGfnGJrVK0oYWRnqGlhZ6RiaWeobF5rJWRqZK+nU1Kak5mWWqR vl2CXkbPtStMBV1yFf2PrjM2MHZLdDFyckgImEgcfLiHFcQWEljKKLHvbDREXEbi5LQGVghb WOLPtS62LkYuoJpPjBLLd09nAUmwCRhKdL0FSXByiAhISPzqv8oIUsQssJtJ4vqqY4wgCWEB L4k551+AFbEIqEpcXPKDGcTmFbCRaPm3hx1ig7zE6g0HwOKcArYSxy8fgrrIRmL2kddsExj5 FjAyrGIUSS0tzk3PLTbSK07MLS7NS9dLzs/dxAgM323Hfm7Zwdj1LvgQowAHoxIPrwNrV6wQ a2JZcWXuIUYJDmYlEd5NWm2xQrwpiZVVqUX58UWlOanFhxhNgY6ayCwlmpwPjK28knhDU0Nz C0tDc2NzYzMLJXHeDoGDMUIC6YklqdmpqQWpRTB9TBycUg2Mnc43zSZlLvjE2K3h4qHwzkvM W3jTwkVeQSc+H0y6+UFwe7Lk3FufuZembNrt5xBy0ngrV8ANCZPC79pZWdnvFS96/K8q/h2S xi9ut+TvesVHnjGcm10WJvRzrwixs5i7u+WC39Q9KXYhT9zMmJbnry/eabjgfJj11WdTljzh iC7t9pl2T+CmEktxRqKhFnNRcSIA7FTMUnUCAAA= X-CMS-MailID: 20190924131121eucas1p1a84a6913a71070d85f733e0dce3106d5 X-Msg-Generator: CA X-RootMTR: 20190924131121eucas1p1a84a6913a71070d85f733e0dce3106d5 X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20190924131121eucas1p1a84a6913a71070d85f733e0dce3106d5 References: <20190924131111.1691-1-m.szyprowski@samsung.com> Cc: Matthias Brugger , Bartlomiej Zolnierkiewicz , Marek Szyprowski Subject: [U-Boot] [PATCH v2 4/6] dfu: mmc: remove file size limit for io operations X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Add support for operations on files larger than CONFIG_SYS_DFU_MAX_FILE_SIZE. The buffered io mechanism is still used for aggregating io requests, so for files up to CONFIG_SYS_DFU_MAX_FILE_SIZE nothing is changed and they will be handled in a single filesystem call. Signed-off-by: Marek Szyprowski Acked-by: Lukasz Majewski --- drivers/dfu/dfu_mmc.c | 46 ++++++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/drivers/dfu/dfu_mmc.c b/drivers/dfu/dfu_mmc.c index 2d97f4528c..b3174571ae 100644 --- a/drivers/dfu/dfu_mmc.c +++ b/drivers/dfu/dfu_mmc.c @@ -17,7 +17,7 @@ static unsigned char *dfu_file_buf; static u64 dfu_file_buf_len; -static long dfu_file_buf_filled; +static u64 dfu_file_buf_offset; static int mmc_block_op(enum dfu_op op, struct dfu_entity *dfu, u64 offset, void *buf, long *len) @@ -123,7 +123,7 @@ static int mmc_file_op(enum dfu_op op, struct dfu_entity *dfu, switch (op) { case DFU_OP_READ: - ret = fs_read(dfu->name, (size_t)buf, offset, 0, &size); + ret = fs_read(dfu->name, (size_t)buf, offset, *len, &size); if (ret) { puts("dfu: fs_read error!\n"); return ret; @@ -154,25 +154,38 @@ static int mmc_file_op(enum dfu_op op, struct dfu_entity *dfu, static int mmc_file_buf_write(struct dfu_entity *dfu, u64 offset, void *buf, long *len) { - if (dfu_file_buf_len + *len > CONFIG_SYS_DFU_MAX_FILE_SIZE) { + int ret = 0; + + if (offset == 0) { dfu_file_buf_len = 0; - return -EINVAL; + dfu_file_buf_offset = 0; } /* Add to the current buffer. */ + if (dfu_file_buf_len + *len > CONFIG_SYS_DFU_MAX_FILE_SIZE) + *len = CONFIG_SYS_DFU_MAX_FILE_SIZE - dfu_file_buf_len; memcpy(dfu_file_buf + dfu_file_buf_len, buf, *len); dfu_file_buf_len += *len; - return 0; + if (dfu_file_buf_len == CONFIG_SYS_DFU_MAX_FILE_SIZE) { + ret = mmc_file_op(DFU_OP_WRITE, dfu, dfu_file_buf_offset, + dfu_file_buf, &dfu_file_buf_len); + dfu_file_buf_offset += dfu_file_buf_len; + dfu_file_buf_len = 0; + } + + return ret; } static int mmc_file_buf_write_finish(struct dfu_entity *dfu) { - int ret = mmc_file_op(DFU_OP_WRITE, dfu, 0, dfu_file_buf, - &dfu_file_buf_len); + int ret = mmc_file_op(DFU_OP_WRITE, dfu, dfu_file_buf_offset, + dfu_file_buf, &dfu_file_buf_len); /* Now that we're done */ dfu_file_buf_len = 0; + dfu_file_buf_offset = 0; + return ret; } @@ -219,12 +232,9 @@ int dfu_get_medium_size_mmc(struct dfu_entity *dfu, u64 *size) return 0; case DFU_FS_FAT: case DFU_FS_EXT4: - dfu_file_buf_filled = -1; ret = mmc_file_op(DFU_OP_SIZE, dfu, 0, NULL, size); if (ret < 0) return ret; - if (*size > CONFIG_SYS_DFU_MAX_FILE_SIZE) - return -1; return 0; default: printf("%s: Layout (%s) not (yet) supported!\n", __func__, @@ -238,19 +248,23 @@ static int mmc_file_buf_read(struct dfu_entity *dfu, u64 offset, void *buf, long *len) { int ret; - u64 file_len; - if (dfu_file_buf_filled == -1) { - ret = mmc_file_op(DFU_OP_READ, dfu, 0, dfu_file_buf, &file_len); + if (offset == 0 || offset >= dfu_file_buf_offset + dfu_file_buf_len || + offset + *len < dfu_file_buf_offset) { + u64 file_len = CONFIG_SYS_DFU_MAX_FILE_SIZE; + + ret = mmc_file_op(DFU_OP_READ, dfu, offset, dfu_file_buf, + &file_len); if (ret < 0) return ret; - dfu_file_buf_filled = file_len; + dfu_file_buf_len = file_len; + dfu_file_buf_offset = offset; } - if (offset + *len > dfu_file_buf_filled) + if (offset + *len > dfu_file_buf_offset + dfu_file_buf_len) return -EINVAL; /* Add to the current buffer. */ - memcpy(buf, dfu_file_buf + offset, *len); + memcpy(buf, dfu_file_buf + offset - dfu_file_buf_offset, *len); return 0; }