From patchwork Mon Dec 2 11:11:16 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Szyprowski X-Patchwork-Id: 1203104 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 (no SPF record) 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="NMXH8G7S"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 47RMtB526Vz9sP3 for ; Mon, 2 Dec 2019 22:13:22 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 64382C21C6A; Mon, 2 Dec 2019 11:12:09 +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 756E3C21E13; Mon, 2 Dec 2019 11:11:36 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id BC9F9C21C57; Mon, 2 Dec 2019 11:11:33 +0000 (UTC) Received: from mailout2.w1.samsung.com (mailout2.w1.samsung.com [210.118.77.12]) by lists.denx.de (Postfix) with ESMTPS id D0488C21C38 for ; Mon, 2 Dec 2019 11:11:32 +0000 (UTC) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20191202111131euoutp023c75cb31a910cb7898686fe37cf2ce4b~ciXHZV3KB0636006360euoutp02D for ; Mon, 2 Dec 2019 11:11:31 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20191202111131euoutp023c75cb31a910cb7898686fe37cf2ce4b~ciXHZV3KB0636006360euoutp02D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1575285091; bh=axemFk1mCGUEoTpVAS7qTO6ZWwkD/jLwjkjxbWY3/Rk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NMXH8G7SMHTdMY49iyyDGC48C82pY1XwHtSdQueDU5ChtnuMbRfYeTYa95af86fK6 YIKpxXoFkHV8AE97f8oZ+2ifRQPmu3Ew2yaYLEL9Z9UASn4aP4PCo68cLu4EtIPExG AvVGq5KbkADQeOn5kvCMCjE9paWrfyn6VL/98ijM= Received: from eusmges2new.samsung.com (unknown [203.254.199.244]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20191202111131eucas1p118f019687d0587ab71996df1d50a075e~ciXHLUDbA1010610106eucas1p1x; Mon, 2 Dec 2019 11:11:31 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges2new.samsung.com (EUCPMTA) with SMTP id 4C.87.60679.361F4ED5; Mon, 2 Dec 2019 11:11:31 +0000 (GMT) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20191202111131eucas1p1ed88eead5f2dc4cb4bd6218aefde50fe~ciXG2dX3C1987819878eucas1p1H; Mon, 2 Dec 2019 11:11:31 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20191202111131eusmtrp14a75d0149f0f15546231e62287baf4eb~ciXG12vGu1442414424eusmtrp16; Mon, 2 Dec 2019 11:11:31 +0000 (GMT) X-AuditID: cbfec7f4-0e5ff7000001ed07-7b-5de4f163b49b Received: from eusmtip2.samsung.com ( [203.254.199.222]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id 14.F8.07950.361F4ED5; Mon, 2 Dec 2019 11:11:31 +0000 (GMT) Received: from AMDC2765.digital.local (unknown [106.120.51.73]) by eusmtip2.samsung.com (KnoxPortal) with ESMTPA id 20191202111130eusmtip2aacc37ce51ad10108752d2fa24701929~ciXGQehiC1824718247eusmtip2N; Mon, 2 Dec 2019 11:11:30 +0000 (GMT) From: Marek Szyprowski To: u-boot@lists.denx.de Date: Mon, 2 Dec 2019 12:11:16 +0100 Message-Id: <20191202111118.12868-5-m.szyprowski@samsung.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191202111118.12868-1-m.szyprowski@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprDKsWRmVeSWpSXmKPExsWy7djP87rJH5/EGixslbTYOGM9q8WNX22s Fs/fXWayWHvkLrvFgslPWC02zH/LYjFj8ks2iz/7f7JYTJ20md3i7d5OdovDUz8wOnB7zJt1 gsXjw8c4j1cHVrF73Lm2h83j7J0djB59W1YxeqzfcpXFY9MrjwCOKC6blNSczLLUIn27BK6M pt7DLAVb5SqefbNsYNwo0cXIySEhYCKxbusGZhBbSGAFo8TyCQpdjFxA9hdGibbGg8wQzmdG iX/n3rDAdFzu7mGFSCxnlNjauJARrmVz3xOwWWwChhJdb7vYQGwRAQmJX/1XwYqYBTYwS9xr O8QIkhAW8JLY/O0dWBGLgKrE85VbmUBsXgFbiX+zf0Gtk5dYveEA2FBOATuJ/Z2LWUAGSQgs Y5f4MucbG0SRi8T6y7+YIWxhiVfHt7BD2DISpyf3QDU0M0o8PLeWHcLpYZS43DSDEaLKWuLw 8YtAH3EA3acpsX6XPkTYUeLdlRvMIGEJAT6JG28FQcLMQOakbdOhwrwSHW1CENVqErOOr4Nb e/DCJagSD4nmedDwncgo8bSnbAKj/CyEVQsYGVcxiqeWFuempxYb5aWW6xUn5haX5qXrJefn bmIEppnT/45/2cG460/SIUYBDkYlHt6OV49jhVgTy4orcw8xSnAwK4nwXld6GCvEm5JYWZVa lB9fVJqTWnyIUZqDRUmct5rhQbSQQHpiSWp2ampBahFMlomDU6qB0VTuf0zdtk+y4tPlsov7 4qdJn/779XN02Tef//UmXHbdu9c8+sBr1fDr6mWbqhoXiSTNlujbsWLf0iZNu1RpzxXPGN/4 NGXXfb/lVxiFTUNPnEoJLJP/v7P1PF/LuSvhwsdPsfL81Z7w/vg84wcvXTaEJ73asZ/3YPxV 1Vkc5w2d+6bnHkj+osRSnJFoqMVcVJwIACiiMX4vAwAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrHLMWRmVeSWpSXmKPExsVy+t/xe7rJH5/EGhy/zmqxccZ6Vosbv9pY LZ6/u8xksfbIXXaLBZOfsFpsmP+WxWLG5JdsFn/2/2SxmDppM7vF272d7BaHp35gdOD2mDfr BIvHh49xHq8OrGL3uHNtD5vH2Ts7GD36tqxi9Fi/5SqLx6ZXHgEcUXo2RfmlJakKGfnFJbZK 0YYWRnqGlhZ6RiaWeobG5rFWRqZK+nY2Kak5mWWpRfp2CXoZTb2HWQq2ylU8+2bZwLhRoouR k0NCwETicncPaxcjF4eQwFJGiaa15xkhEjISJ6c1sELYwhJ/rnWxQRR9YpQ4+foGG0iCTcBQ outtF5gtIiAh8av/KiNIEbPADmaJxW9bmUESwgJeEpu/vQMrYhFQlXi+cisTiM0rYCvxb/Yv FogN8hKrNxwAq+cUsJPY37kYKM4BtM1W4v37uAmMfAsYGVYxiqSWFuem5xYb6RUn5haX5qXr JefnbmIEhv22Yz+37GDsehd8iFGAg1GJh7fj1eNYIdbEsuLK3EOMEhzMSiK815UexgrxpiRW VqUW5ccXleakFh9iNAW6aSKzlGhyPjAm80riDU0NzS0sDc2NzY3NLJTEeTsEDsYICaQnlqRm p6YWpBbB9DFxcEo1MO669+D9DENDKbuIgGLRadUrZG5cP1MvILDlSf3Nxqau6ykNsTtWWIoe 7ljkt0v7mWXj3Rf2DSzHrhr/XVTOk7OcLWuaXNaTtg89aWpLpnM6iRycxXmipv3E640Bf/fN /HK5ZaeX55pL517qnlDPufL5yzaHQzsmrmZwf6a7P/FuzYQ8zgTtrM1KLMUZiYZazEXFiQAG gJOMkQIAAA== X-CMS-MailID: 20191202111131eucas1p1ed88eead5f2dc4cb4bd6218aefde50fe X-Msg-Generator: CA X-RootMTR: 20191202111131eucas1p1ed88eead5f2dc4cb4bd6218aefde50fe X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20191202111131eucas1p1ed88eead5f2dc4cb4bd6218aefde50fe References: <20191202111118.12868-1-m.szyprowski@samsung.com> Cc: Matthias Brugger , Bartlomiej Zolnierkiewicz , Heinrich Schuchardt , Tom Rini , Marek Szyprowski Subject: [U-Boot] [PATCH v4 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 e52c02be10..0d495a785b 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; }