From patchwork Tue Nov 26 08:15:10 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Szyprowski X-Patchwork-Id: 1200795 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="J+lq8bRZ"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 47McGM6yF0z9sP3 for ; Tue, 26 Nov 2019 19:17:47 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 84FD1C21F16; Tue, 26 Nov 2019 08:16:49 +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 1CE82C21F1A; Tue, 26 Nov 2019 08:15:49 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 8F75CC21E3A; Tue, 26 Nov 2019 08:15:46 +0000 (UTC) Received: from mailout2.w1.samsung.com (mailout2.w1.samsung.com [210.118.77.12]) by lists.denx.de (Postfix) with ESMTPS id 52AC6C21E31 for ; Tue, 26 Nov 2019 08:15:46 +0000 (UTC) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20191126081546euoutp028eb96e5a5ee67c51c2b2b37e507ebabc~aqF8SU1kW0390903909euoutp02C for ; Tue, 26 Nov 2019 08:15:46 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20191126081546euoutp028eb96e5a5ee67c51c2b2b37e507ebabc~aqF8SU1kW0390903909euoutp02C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1574756146; bh=axemFk1mCGUEoTpVAS7qTO6ZWwkD/jLwjkjxbWY3/Rk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=J+lq8bRZYVVt+XFz1Ib3Bx1XeTMws8hNutWbDBTyfIyqorUncfiq6UEvcgP3S27sW rLr02W6CWBqp1vPPGjKap40+zPJ61VF+h/dyUyJ8384hXCRwj1++LECH+atZfEjhV3 6wV44MtbDq9sdEGzub2uXYlO54hvSlxrwI1ZKzRY= Received: from eusmges3new.samsung.com (unknown [203.254.199.245]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20191126081545eucas1p278698c504c64f7231975d5d6d73b67cb~aqF8Et-8R2636426364eucas1p2b; Tue, 26 Nov 2019 08:15:45 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges3new.samsung.com (EUCPMTA) with SMTP id 23.56.60698.13FDCDD5; Tue, 26 Nov 2019 08:15:45 +0000 (GMT) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20191126081545eucas1p16c5a6e0a8de5af3a1e06d7408b5a9f0c~aqF7tBOTF1207612076eucas1p1I; Tue, 26 Nov 2019 08:15:45 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20191126081545eusmtrp1eda25e13c6aa8317cc293ed02538de66~aqF7saT8P2279022790eusmtrp1x; Tue, 26 Nov 2019 08:15:45 +0000 (GMT) X-AuditID: cbfec7f5-a29ff7000001ed1a-03-5ddcdf310af2 Received: from eusmtip2.samsung.com ( [203.254.199.222]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 03.D3.08375.13FDCDD5; Tue, 26 Nov 2019 08:15:45 +0000 (GMT) Received: from AMDC2765.digital.local (unknown [106.120.51.73]) by eusmtip2.samsung.com (KnoxPortal) with ESMTPA id 20191126081544eusmtip280cf80fd29d2ab3a80e2915bc50a78f1~aqF7MZ09k2191321913eusmtip2P; Tue, 26 Nov 2019 08:15:44 +0000 (GMT) From: Marek Szyprowski To: u-boot@lists.denx.de Date: Tue, 26 Nov 2019 09:15:10 +0100 Message-Id: <20191126081512.5138-5-m.szyprowski@samsung.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191126081512.5138-1-m.szyprowski@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmpkleLIzCtJLcpLzFFi42LZduzneV3D+3diDRb36VlsnLGe1eLGrzZW i+fvLjNZrD1yl91iweQnrBYb5r9lsZgx+SWbxdu9newOHB7zZp1g8Th7ZwejR9+WVYwe67dc ZfHY9MojgDWKyyYlNSezLLVI3y6BK6Op9zBLwVa5imffLBsYN0p0MXJySAiYSMw82srSxcjF ISSwglFi8eJ5jBDOF0aJHY+XsUI4nxklzjbPZOti5ABrmXYxBCK+nFFi0qMjTHAdG973MIHM ZRMwlOh628UGYosISEj86r8KNpZZYDuTRHvrdRaQhLCAl8TsnxNZQWwWAVWJ69N3gMV5BWwk Dhx5xg5xoLzE6g0HmEFsTgFbiV/z/rGDDJIQ+M0mcbFvDzNEkYvEl1+tjBC2sMSr41ugmmUk Tk/uYYFoaGaUeHhuLVR3D6PE5aYZUB3WEoePX2QFeY5ZQFNi/S59iLCjxJoTJ5kgfuaTuPFW ECTMDGRO2jadGSLMK9HRJgRRrSYx6/g6uLUHL1yCOs1DYsGNu2yQEJrAKHH8RSvLBEb5WQjL FjAyrmIUTy0tzk1PLTbOSy3XK07MLS7NS9dLzs/dxAhMGKf/Hf+6g3Hfn6RDjAIcjEo8vD/O 3o4VYk0sK67MPcQowcGsJMKrffhOrBBvSmJlVWpRfnxRaU5q8SFGaQ4WJXHeaoYH0UIC6Ykl qdmpqQWpRTBZJg5OqQZGo0t9VaaC+X5vFn37M2OWkuSzzqMROUxF3fUPYkwytr2O0P+05HFB a/uxLLZ3D4/XTAkVehxb/+RuoVTzhcTYzfNSNtbKhf7m+h79ivH8DwmLCe+uq7042bHOR+Tn 1R8XGaNkq+ODk3/s52S+aHNvUvCPgqUL21Q9TvzfoRbA18UdnfbN9mCdEktxRqKhFnNRcSIA XZpZTxQDAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrILMWRmVeSWpSXmKPExsVy+t/xe7qG9+/EGkx9LmCxccZ6Vosbv9pY LZ6/u8xksfbIXXaLBZOfsFpsmP+WxWLG5JdsFm/3drI7cHjMm3WCxePsnR2MHn1bVjF6rN9y lcVj0yuPANYoPZui/NKSVIWM/OISW6VoQwsjPUNLCz0jE0s9Q2PzWCsjUyV9O5uU1JzMstQi fbsEvYym3sMsBVvlKp59s2xg3CjRxcjBISFgIjHtYkgXIxeHkMBSRol701exdzFyAsVlJE5O a2CFsIUl/lzrYoMo+sQo8fhbExNIgk3AUKLrLUiCk0NEQELiV/9VRpAiZoHdTBLXVx1jBEkI C3hJzP45EWwSi4CqxPXpO1hAbF4BG4kDR55BbZOXWL3hADOIzSlgK/Fr3j+wuBBQzcRj/5gn MPItYGRYxSiSWlqcm55bbKhXnJhbXJqXrpecn7uJERi824793LyD8dLG4EOMAhyMSjy8P87e jhViTSwrrsw9xCjBwawkwqt9+E6sEG9KYmVValF+fFFpTmrxIUZToKMmMkuJJucDIyuvJN7Q 1NDcwtLQ3Njc2MxCSZy3Q+BgjJBAemJJanZqakFqEUwfEwenVANji1Lt75WX1LpVD3ZZ1t5o u1Nn8mAHS2tKrIYBo5tQOROPZces/yUvLl+792C233LZC7HiW1nali19/a75p6XTf59zwvNr o6QtVm+T+V9w4jfXImc2oaVv1Tb/frO7YNtpj/IFqdNkj2gmb3/N0XOU6b2s8q7jP5o5ZhTV f88JXnFI4nSI9e55SizFGYmGWsxFxYkA0osmA3QCAAA= X-CMS-MailID: 20191126081545eucas1p16c5a6e0a8de5af3a1e06d7408b5a9f0c X-Msg-Generator: CA X-RootMTR: 20191126081545eucas1p16c5a6e0a8de5af3a1e06d7408b5a9f0c X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20191126081545eucas1p16c5a6e0a8de5af3a1e06d7408b5a9f0c References: <20191126081512.5138-1-m.szyprowski@samsung.com> Cc: Matthias Brugger , Bartlomiej Zolnierkiewicz , Marek Szyprowski Subject: [U-Boot] [PATCH v3 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; }