From: Jaehoon Chung <jh80.chung@samsung.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v3 7/9] dfu:mmc: raw data write fix
Date: Fri, 10 Jan 2014 14:03:54 +0900 [thread overview]
Message-ID: <52CF7F3A.9020706@samsung.com> (raw)
In-Reply-To: <1389277919-15279-7-git-send-email-m.zalega@samsung.com>
Hi, Mateusz,
This patch should be separated with dfu and mmc.
On 01/09/2014 11:31 PM, Mateusz Zalega wrote:
> When user attempted to perform a raw write using DFU (vide
> dfu_fill_entity_mmc) with MMC interface not initialized before,
> get_mmc_blk_size() reported invalid (zero) block size - it wasn't
> possible to write ie. a new u-boot image.
>
> This commit fixes that by initializing device in get_mmc_blk_size() when
> needed.
>
> Tested on Samsung Goni.
>
> v2 changes:
> - code cleanup
> - minor dfu_alt_info format change
>
> v3 changes:
> - moved invalid block length check to mmc core
> - removed redundant 'has_init' check
>
> Change-Id: Icb50bb9f805a9a78848acd19f682fad474cb9082
> Signed-off-by: Mateusz Zalega <m.zalega@samsung.com>
> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
> Reviewed-by: Lukasz Majewski <l.majewski@samsung.com>
> Cc: Minkyu Kang <mk7.kang@samsung.com>
> ---
> drivers/dfu/dfu_mmc.c | 106 ++++++++++++++++++++++++++-----------------
> drivers/mmc/mmc.c | 13 ++++--
> include/configs/am335x_evm.h | 8 ++--
> include/configs/trats.h | 2 +-
> include/configs/trats2.h | 2 +-
> include/dfu.h | 5 --
> 6 files changed, 80 insertions(+), 56 deletions(-)
>
> diff --git a/drivers/dfu/dfu_mmc.c b/drivers/dfu/dfu_mmc.c
> index f942758..075e4cd 100644
> --- a/drivers/dfu/dfu_mmc.c
> +++ b/drivers/dfu/dfu_mmc.c
> @@ -168,66 +168,88 @@ int dfu_read_medium_mmc(struct dfu_entity *dfu, u64 offset, void *buf,
> return ret;
> }
>
> +/*
> + * @param s Parameter string containing space-separated arguments:
> + * 1st:
> + * raw (raw read/write)
> + * fat (files)
> + * ext4 (^)
> + * part (partition image)
> + * 2nd and 3rd:
> + * lba_start and lba_size, for raw write
> + * mmc_dev and mmc_part, for filesystems and part
> + */
> int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *s)
> {
> - int dev, part;
> - struct mmc *mmc;
> - block_dev_desc_t *blk_dev;
> - disk_partition_t partinfo;
> - char *st;
> -
> - dfu->dev_type = DFU_DEV_MMC;
> - st = strsep(&s, " ");
> - if (!strcmp(st, "mmc")) {
> - dfu->layout = DFU_RAW_ADDR;
> - dfu->data.mmc.lba_start = simple_strtoul(s, &s, 16);
> - dfu->data.mmc.lba_size = simple_strtoul(++s, &s, 16);
> - dfu->data.mmc.lba_blk_size = get_mmc_blk_size(dfu->dev_num);
> - } else if (!strcmp(st, "fat")) {
> - dfu->layout = DFU_FS_FAT;
> - } else if (!strcmp(st, "ext4")) {
> - dfu->layout = DFU_FS_EXT4;
> - } else if (!strcmp(st, "part")) {
> + const char *argv[3];
> + const char **parg = argv;
> + for (; parg < argv + sizeof(argv) / sizeof(*argv); ++parg) {
> + *parg = strsep(&s, " ");
> + if (*parg == NULL) {
> + error("Invalid number of arguments.\n");
> + return -ENODEV;
> + }
> + }
>
> - dfu->layout = DFU_RAW_ADDR;
> + const char *entity_type = argv[0];
> + /*
> + * Base 0 means we'll accept (prefixed with 0x or 0) base 16, 8,
> + * with default 10.
> + */
> + size_t second_arg = simple_strtoul(argv[1], NULL, 0);
> + size_t third_arg = simple_strtoul(argv[2], NULL, 0);
>
> - dev = simple_strtoul(s, &s, 10);
> - s++;
> - part = simple_strtoul(s, &s, 10);
> + struct mmc *mmc = find_mmc_device(dfu->dev_num);
> + if (mmc == NULL) {
> + error("Couldn't find MMC device no. %d.\n", dfu->dev_num);
> + return -ENODEV;
> + }
>
> - mmc = find_mmc_device(dev);
> - if (mmc == NULL || mmc_init(mmc)) {
> - printf("%s: could not find mmc device #%d!\n",
> - __func__, dev);
> - return -ENODEV;
> - }
> + if (mmc_init(mmc)) {
> + error("Couldn't init MMC device.\n");
> + return -ENODEV;
> + }
>
> - blk_dev = &mmc->block_dev;
> - if (get_partition_info(blk_dev, part, &partinfo) != 0) {
> - printf("%s: could not find partition #%d on mmc device #%d!\n",
> - __func__, part, dev);
> + if (!strcmp(entity_type, "raw")) {
> + dfu->layout = DFU_RAW_ADDR;
> + dfu->data.mmc.lba_start = second_arg;
> + dfu->data.mmc.lba_size = third_arg;
> + dfu->data.mmc.lba_blk_size = mmc->read_bl_len;
> + } else if (!strcmp(entity_type, "part")) {
> + disk_partition_t partinfo;
> + block_dev_desc_t *blk_dev = &mmc->block_dev;
> + int mmcdev = second_arg;
> + int mmcpart = third_arg;
> +
> + if (get_partition_info(blk_dev, mmcpart, &partinfo) != 0) {
> + error("Couldn't find part #%d on mmc device #%d\n",
> + mmcpart, mmcdev);
> return -ENODEV;
> }
>
> - dfu->data.mmc.lba_start = partinfo.start;
> - dfu->data.mmc.lba_size = partinfo.size;
> - dfu->data.mmc.lba_blk_size = partinfo.blksz;
> -
> + dfu->layout = DFU_RAW_ADDR;
> + dfu->data.mmc.lba_start = partinfo.start;
> + dfu->data.mmc.lba_size = partinfo.size;
> + dfu->data.mmc.lba_blk_size = partinfo.blksz;
> + } else if (!strcmp(entity_type, "fat")) {
> + dfu->layout = DFU_FS_FAT;
> + } else if (!strcmp(entity_type, "ext4")) {
> + dfu->layout = DFU_FS_EXT4;
> } else {
> - printf("%s: Memory layout (%s) not supported!\n", __func__, st);
> + error("Memory layout (%s) not supported!\n", entity_type);
> return -ENODEV;
> }
>
> - if (dfu->layout == DFU_FS_EXT4 || dfu->layout == DFU_FS_FAT) {
> - dfu->data.mmc.dev = simple_strtoul(s, &s, 10);
> - dfu->data.mmc.part = simple_strtoul(++s, &s, 10);
> + /* if it's NOT a raw write */
> + if (strcmp(entity_type, "raw")) {
> + dfu->data.mmc.dev = second_arg;
> + dfu->data.mmc.part = third_arg;
> }
>
> + dfu->dev_type = DFU_DEV_MMC;
> dfu->read_medium = dfu_read_medium_mmc;
> dfu->write_medium = dfu_write_medium_mmc;
> dfu->flush_medium = dfu_flush_medium_mmc;
> -
> - /* initial state */
> dfu->inited = 0;
>
> return 0;
> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
> index e1461a9..f2fa230 100644
> --- a/drivers/mmc/mmc.c
> +++ b/drivers/mmc/mmc.c
> @@ -15,6 +15,7 @@
> #include <malloc.h>
> #include <linux/list.h>
> #include <div64.h>
> +#include <errno.h>
> #include "mmc_private.h"
>
> /* Set block count limit because of 16 bit register limit on some hardware*/
> @@ -1266,17 +1267,23 @@ static int mmc_complete_init(struct mmc *mmc)
>
> int mmc_init(struct mmc *mmc)
> {
> + if (mmc->has_init)
> + return 0;
> +
What difference before?
> int err = IN_PROGRESS;
> unsigned start = get_timer(0);
>
> - if (mmc->has_init)
> - return 0;
> if (!mmc->init_in_progress)
> err = mmc_start_init(mmc);
> -
Need not to change.
> if (!err || err == IN_PROGRESS)
> err = mmc_complete_init(mmc);
> +
Ditto.
> debug("%s: %d, time %lu\n", __func__, err, get_timer(start));
> +
> + if (!mmc->read_bl_len || !mmc->write_bl_len) {
> + error("invalid block length\n");
> + return -ENODEV;
> + }
I know mmc->read_bl_len and write_bl_len is set at init time.
Why this condition needs?
> return err;
> }
>
> diff --git a/include/configs/am335x_evm.h b/include/configs/am335x_evm.h
> index 8af4d6a..d76962f 100644
> --- a/include/configs/am335x_evm.h
> +++ b/include/configs/am335x_evm.h
> @@ -312,10 +312,10 @@
> "boot part 0 1;" \
> "rootfs part 0 2;" \
> "MLO fat 0 1;" \
> - "MLO.raw mmc 100 100;" \
> - "u-boot.img.raw mmc 300 400;" \
> - "spl-os-args.raw mmc 80 80;" \
> - "spl-os-image.raw mmc 900 2000;" \
> + "MLO.raw mmc 0x100 0x100;" \
> + "u-boot.img.raw mmc 0x300 0x400;" \
> + "spl-os-args.raw mmc 0x80 0x80;" \
> + "spl-os-image.raw mmc 0x900 0x2000;" \
> "spl-os-args fat 0 1;" \
> "spl-os-image fat 0 1;" \
> "u-boot.img fat 0 1;" \
> diff --git a/include/configs/trats.h b/include/configs/trats.h
> index 6cd15c2..ed3b278 100644
> --- a/include/configs/trats.h
> +++ b/include/configs/trats.h
> @@ -140,7 +140,7 @@
> "name="PARTS_UMS",size=-,uuid=${uuid_gpt_"PARTS_UMS"}\0" \
>
> #define CONFIG_DFU_ALT \
> - "u-boot mmc 80 400;" \
> + "u-boot raw 0x80 0x400;" \
> "uImage ext4 0 2;" \
> "exynos4210-trats.dtb ext4 0 2;" \
> ""PARTS_ROOT" part 0 5\0"
> diff --git a/include/configs/trats2.h b/include/configs/trats2.h
> index 5d86a3d..a22be63 100644
> --- a/include/configs/trats2.h
> +++ b/include/configs/trats2.h
> @@ -169,7 +169,7 @@
> "name="PARTS_UMS",size=-,uuid=${uuid_gpt_"PARTS_UMS"}\0" \
>
> #define CONFIG_DFU_ALT \
> - "u-boot mmc 80 800;" \
> + "u-boot mmc 0x80 0x800;" \
u-boot mmc? u-boot raw? what's correct?
Best Regards,
Jaehoon Chung
> "uImage ext4 0 2;" \
> "exynos4412-trats2.dtb ext4 0 2;" \
> ""PARTS_ROOT" part 0 5\0"
> diff --git a/include/dfu.h b/include/dfu.h
> index f973426..f2e83db 100644
> --- a/include/dfu.h
> +++ b/include/dfu.h
> @@ -64,11 +64,6 @@ struct ram_internal_data {
> unsigned int size;
> };
>
> -static inline unsigned int get_mmc_blk_size(int dev)
> -{
> - return find_mmc_device(dev)->read_bl_len;
> -}
> -
> #define DFU_NAME_SIZE 32
> #define DFU_CMD_BUF_SIZE 128
> #ifndef CONFIG_SYS_DFU_DATA_BUF_SIZE
>
next prev parent reply other threads:[~2014-01-10 5:03 UTC|newest]
Thread overview: 127+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-01-09 14:31 [U-Boot] [PATCH 1/9] mmc: mmc header fix Mateusz Zalega
2014-01-09 14:31 ` [U-Boot] [PATCH 2/9] part: " Mateusz Zalega
2014-01-09 14:31 ` [U-Boot] [PATCH v3 3/9] arm:goni: Update configuration for goni target Mateusz Zalega
2014-01-09 14:31 ` [U-Boot] [PATCH 4/9] arm:goni:dfu Add support for DFU to Goni target Mateusz Zalega
2014-01-10 4:55 ` Jaehoon Chung
2014-01-13 14:45 ` Mateusz Zalega
2014-01-09 14:31 ` [U-Boot] [PATCH 5/9] arm:goni: enable GPT command Mateusz Zalega
2014-01-09 14:31 ` [U-Boot] [PATCH 6/9] arm:goni: enable USB Mass Storage Mateusz Zalega
2014-01-09 14:31 ` [U-Boot] [PATCH v3 7/9] dfu:mmc: raw data write fix Mateusz Zalega
2014-01-10 5:03 ` Jaehoon Chung [this message]
2014-01-13 13:34 ` Mateusz Zalega
2014-01-09 14:31 ` [U-Boot] [PATCH 8/9] ums: always initialize mmc before ums_disk_init() Mateusz Zalega
2014-01-10 5:08 ` Jaehoon Chung
2014-01-13 14:39 ` Mateusz Zalega
2014-01-13 14:43 ` Michael Trimarchi
2014-01-13 15:00 ` Mateusz Zalega
2014-01-13 10:16 ` Lukasz Majewski
2014-01-14 0:49 ` Minkyu Kang
2014-01-14 10:55 ` Mateusz Zalega
2014-01-09 14:31 ` [U-Boot] [PATCH 9/9] USB: gadget: added a saner gadget downloader registration API Mateusz Zalega
2014-01-10 8:23 ` Lukasz Majewski
2014-01-13 7:07 ` Heiko Schocher
2014-01-13 10:16 ` Lukasz Majewski
2014-01-10 4:46 ` [U-Boot] [PATCH 1/9] mmc: mmc header fix Jaehoon Chung
2014-02-04 17:02 ` [U-Boot] [PATCH v2 00/12] Series v2 Mateusz Zalega
2014-02-04 17:02 ` [U-Boot] [PATCH v2 01/12] mmc: mmc header fix Mateusz Zalega
2014-02-04 17:02 ` [U-Boot] [PATCH v2 02/12] part: " Mateusz Zalega
2014-02-04 17:02 ` [U-Boot] [PATCH v2 03/12] arm:goni: Update configuration for goni target Mateusz Zalega
2014-02-04 17:02 ` [U-Boot] [PATCH v2 04/12] dfu: fix boards wo USB cable detection Mateusz Zalega
2014-02-22 5:06 ` Marek Vasut
2014-02-04 17:02 ` [U-Boot] [PATCH v2 05/12] am335x: dfu: disable DFU in am335x_evm SPL build Mateusz Zalega
2014-02-04 17:02 ` [U-Boot] [PATCH v2 06/12] USB: gadget: added a saner gadget downloader registration API Mateusz Zalega
2014-02-05 7:13 ` Marek Vasut
2014-02-05 12:40 ` Mateusz Zalega
2014-02-05 18:00 ` Marek Vasut
2014-02-06 11:56 ` Mateusz Zalega
2014-02-06 19:59 ` Marek Vasut
2014-02-04 17:02 ` [U-Boot] [PATCH v2 07/12] arm:goni:dfu Add support for DFU to Goni target Mateusz Zalega
2014-02-04 17:02 ` [U-Boot] [PATCH v2 08/12] arm:goni: enable GPT command Mateusz Zalega
2014-02-04 17:02 ` [U-Boot] [PATCH v2 09/12] arm:goni: enable USB Mass Storage Mateusz Zalega
2014-02-04 17:02 ` [U-Boot] [PATCH v2 10/12] dfu:mmc: raw data write fix Mateusz Zalega
2014-02-22 5:09 ` Marek Vasut
2014-02-04 17:02 ` [U-Boot] [PATCH v2 11/12] mmc: postponed needless timer initialization Mateusz Zalega
2014-02-04 17:02 ` [U-Boot] [PATCH v2 12/12] ums: always initialize mmc before ums_disk_init() Mateusz Zalega
2014-02-22 5:12 ` Marek Vasut
2014-03-31 15:48 ` [U-Boot] [PATCH v3 00/13] DFU, MMC, Gadget, Goni, misc Mateusz Zalega
2014-03-31 15:49 ` [U-Boot] [PATCH v3 01/13] mmc: mmc header fix Mateusz Zalega
2014-03-31 15:49 ` [U-Boot] [PATCH v3 02/13] part: " Mateusz Zalega
2014-03-31 15:49 ` [U-Boot] [PATCH v3 03/13] arm:goni: Update configuration for goni target Mateusz Zalega
2014-03-31 15:49 ` [U-Boot] [PATCH v3 04/13] dfu: fix boards wo USB cable detection Mateusz Zalega
2014-04-02 6:33 ` Lukasz Majewski
2014-03-31 15:49 ` [U-Boot] [PATCH v3 05/13] am335x: dfu: disable DFU in am335x_evm SPL build Mateusz Zalega
2014-03-31 15:49 ` [U-Boot] [PATCH v3 06/13] USB: gadget: added a saner gadget downloader registration API Mateusz Zalega
2014-03-31 16:14 ` Marek Vasut
2014-04-02 6:35 ` Lukasz Majewski
2014-04-02 22:28 ` Marek Vasut
2014-04-03 7:46 ` Lukasz Majewski
2014-04-03 8:52 ` Marek Vasut
2014-04-11 11:43 ` Mateusz Zalega
2014-04-11 12:02 ` Marek Vasut
2014-04-15 11:04 ` Mateusz Zalega
2014-04-15 13:26 ` Marek Vasut
2014-03-31 15:49 ` [U-Boot] [PATCH v3 07/13] arm:goni:dfu Add support for DFU to Goni target Mateusz Zalega
2014-03-31 15:49 ` [U-Boot] [PATCH v3 08/13] arm:goni: enable GPT command Mateusz Zalega
2014-03-31 15:49 ` [U-Boot] [PATCH v3 09/13] arm:goni: enable USB Mass Storage Mateusz Zalega
2014-03-31 15:49 ` [U-Boot] [PATCH v3 10/13] dfu:mmc: raw data write fix Mateusz Zalega
2014-03-31 15:49 ` [U-Boot] [PATCH v3 11/13] mmc: postponed needless timer initialization Mateusz Zalega
2014-03-31 15:49 ` [U-Boot] [PATCH v3 12/13] ums: always initialize mmc before ums_disk_init() Mateusz Zalega
2014-04-02 6:36 ` Lukasz Majewski
2014-03-31 15:49 ` [U-Boot] [PATCH v3 13/13] common: fixed linker-list example Mateusz Zalega
2014-03-31 16:12 ` Marek Vasut
2014-04-01 7:42 ` Lukasz Majewski
2014-04-15 13:06 ` [U-Boot] [PATCH v4 00/13] DFU, MMC, Gadget, Goni, misc Mateusz Zalega
2014-04-15 13:06 ` [U-Boot] [PATCH v4 01/13] mmc: mmc header fix Mateusz Zalega
2014-04-15 13:06 ` [U-Boot] [PATCH v4 02/13] part: " Mateusz Zalega
2014-04-15 13:06 ` [U-Boot] [PATCH v4 03/13] common: fixed linker-list example Mateusz Zalega
2014-04-15 13:36 ` Marek Vasut
2014-04-15 13:06 ` [U-Boot] [PATCH v4 04/13] usb: dfu: fix boards wo USB cable detection Mateusz Zalega
2014-04-15 13:38 ` Marek Vasut
2014-04-15 14:23 ` Lukasz Majewski
2014-04-15 13:06 ` [U-Boot] [PATCH v4 05/13] mmc: postponed needless timer initialization Mateusz Zalega
2014-04-15 13:06 ` [U-Boot] [PATCH v4 06/13] dfu: mmc: raw data write fix Mateusz Zalega
2014-04-15 13:06 ` [U-Boot] [PATCH v4 07/13] ums: always initialize mmc before ums_disk_init() Mateusz Zalega
2014-04-15 14:24 ` Lukasz Majewski
2014-04-15 13:06 ` [U-Boot] [PATCH v4 08/13] am335x: dfu: disable DFU in am335x_evm SPL build Mateusz Zalega
2014-04-15 14:25 ` Lukasz Majewski
2014-04-15 13:06 ` [U-Boot] [PATCH v4 09/13] USB: gadget: added a saner gadget downloader registration API Mateusz Zalega
2014-04-15 13:39 ` Marek Vasut
2014-04-15 14:28 ` Lukasz Majewski
2014-04-16 4:23 ` Jaehoon Chung
2014-04-16 9:25 ` Mateusz Zalega
2014-04-15 13:06 ` [U-Boot] [PATCH v4 10/13] arm: goni: Update configuration for Goni target Mateusz Zalega
2014-04-15 13:06 ` [U-Boot] [PATCH v4 11/13] arm: goni: dfu: Add support for DFU to " Mateusz Zalega
2014-04-15 13:07 ` [U-Boot] [PATCH v4 12/13] arm: goni: enable GPT command Mateusz Zalega
2014-04-15 13:07 ` [U-Boot] [PATCH v4 13/13] arm: goni: enable USB Mass Storage Mateusz Zalega
2014-04-28 19:13 ` [U-Boot] [PATCH v5 00/12] DFU, MMC, Gadget, Goni, misc Mateusz Zalega
2014-04-28 19:13 ` [U-Boot] [PATCH v5 01/12] mmc: mmc header fix Mateusz Zalega
2014-04-30 8:35 ` Lukasz Majewski
2014-04-30 10:02 ` Pantelis Antoniou
2014-05-05 7:45 ` Lukasz Majewski
2014-04-28 19:13 ` [U-Boot] [PATCH v5 02/12] part: " Mateusz Zalega
2014-04-30 8:33 ` Lukasz Majewski
2014-05-05 7:48 ` Lukasz Majewski
2014-04-28 19:13 ` [U-Boot] [PATCH v5 03/12] usb: dfu: fix boards wo USB cable detection Mateusz Zalega
2014-04-30 8:18 ` Marek Vasut
2014-05-05 7:50 ` Lukasz Majewski
2014-04-28 19:13 ` [U-Boot] [PATCH v5 04/12] dfu: mmc: raw data write fix Mateusz Zalega
2014-05-05 8:00 ` Lukasz Majewski
2014-04-28 19:13 ` [U-Boot] [PATCH v5 05/12] dfu: mmc: change offset base handling Mateusz Zalega
2014-05-05 8:03 ` Lukasz Majewski
2014-04-28 19:13 ` [U-Boot] [PATCH v5 06/12] ums: always initialize mmc before ums_disk_init() Mateusz Zalega
2014-05-01 20:03 ` Stephen Warren
2014-05-05 8:05 ` Lukasz Majewski
2014-04-28 19:13 ` [U-Boot] [PATCH v5 07/12] am335x: dfu: disable DFU in am335x_evm SPL build Mateusz Zalega
2014-05-05 8:06 ` Lukasz Majewski
2014-04-28 19:13 ` [U-Boot] [PATCH v5 08/12] USB: gadget: added a saner gadget downloader registration API Mateusz Zalega
2014-05-05 8:07 ` Lukasz Majewski
2014-04-28 19:13 ` [U-Boot] [PATCH v5 09/12] arm: goni: Update configuration for Goni target Mateusz Zalega
2014-04-30 11:24 ` Lukasz Majewski
2014-04-30 11:55 ` Minkyu Kang
2014-05-16 6:53 ` Minkyu Kang
2014-04-28 19:13 ` [U-Boot] [PATCH v5 10/12] arm: goni: dfu: Add support for DFU to " Mateusz Zalega
2014-05-16 6:53 ` Minkyu Kang
2014-04-28 19:13 ` [U-Boot] [PATCH v5 11/12] arm: goni: enable GPT command Mateusz Zalega
2014-05-16 6:53 ` Minkyu Kang
2014-04-28 19:13 ` [U-Boot] [PATCH v5 12/12] arm: goni: enable USB Mass Storage Mateusz Zalega
2014-05-16 6:53 ` Minkyu Kang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=52CF7F3A.9020706@samsung.com \
--to=jh80.chung@samsung.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).