From nobody Thu Apr 2 07:43:58 2026 Received: from mail-m83211.xmail.ntesmail.com (mail-m83211.xmail.ntesmail.com [156.224.83.211]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3F48322A817; Mon, 30 Mar 2026 04:04:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=156.224.83.211 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774843461; cv=none; b=fw/R1UvX1IpaZR4nYE/CFXTka5h8Mb824bnn5w9Q4eM42AgfGRoeKlZ/Ru62iuFYpUCOAH8VUaLNJcvSA9eYivhXnxrnCxGAFRdzL3LrVMKT4JFLiIfdVKR2rweuCp/rpx+w0UA44wbyndNuKMJwa+5xVFVPGOOfighYHcf2w4c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774843461; c=relaxed/simple; bh=aarrtfUK43Eyg1nC9xtx8OTnJVXNDe2IP6IIoSlyeZ4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=fmjprhtSp01K2X+At+rt1mNd9jSglR80Hn6oAv8ZRWMSwPzF3aKHtq6msriOhpeBfpcHQGzY1T3tfCNgzUQ8UhDLN+6CUAnprAEGiTmFZ6JWStoimStEuQSmzPSSkxJzOFABWe+48PxS+ywLm0QXhssudvCp0URYmCUo5D0b+10= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com; spf=pass smtp.mailfrom=rock-chips.com; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b=JCav2phY; arc=none smtp.client-ip=156.224.83.211 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b="JCav2phY" Received: from localhost.localdomain (unknown [58.22.7.114]) by smtp.qiye.163.com (Hmail) with ESMTP id 38c2332b6; Mon, 30 Mar 2026 11:28:44 +0800 (GMT+08:00) From: Shawn Lin To: Ulf Hansson Cc: linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org, Shawn Lin Subject: [PATCH 1/4] mmc: core: Replace the hard-coded shift value 9 with SECTOR_SHIFT Date: Mon, 30 Mar 2026 11:28:29 +0800 Message-Id: <1774841312-92409-2-git-send-email-shawn.lin@rock-chips.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1774841312-92409-1-git-send-email-shawn.lin@rock-chips.com> References: <1774841312-92409-1-git-send-email-shawn.lin@rock-chips.com> X-HM-Tid: 0a9d3cc9624409cckunmd82a3513dfee39 X-HM-MType: 1 X-HM-Spam-Status: e1kfGhgUHx5ZQUpXWQgPGg8OCBgUHx5ZQUlOS1dZFg8aDwILHllBWSg2Ly tZV1koWUFDSUNOT01LS0k3V1ktWUFJV1kPCRoVCBIfWUFZGk1DQ1ZKGB0fGUlIHkgdSR1WFRQJFh oXVRMBExYaEhckFA4PWVdZGBILWUFZTkNVSUlVTFVKSk9ZV1kWGg8SFR0UWUFZT0tIVUpLSU9PT0 hVSktLVUpCS0tZBg++ DKIM-Signature: a=rsa-sha256; b=JCav2phYTlQbNVK3eZyY4SazB4gMLZEX2ax363o/1KrcBkwdoxi9tJUIJIVjEOTJoR5KKxGksZ70x32pcfXbAlrln/iEQc+AmZsDjmJI3UmX6vuZFmHX+HqnrjkRnfxuYAYkGVdmZDQyvCpQRXLkMN1ffegnAR07fekyGvvERJA=; s=default; c=relaxed/relaxed; d=rock-chips.com; v=1; bh=olYKjp1DeC2VMXdGqwr4sopBWXnXbK9QYUsln8LALS4=; h=date:mime-version:subject:message-id:from; Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" These shift-by-9 operations are for converting between bytes and sectors. Use the SECTOR_SHIFT macro to improve code readability and maintainability. No functional changes intended. Signed-off-by: Shawn Lin --- drivers/mmc/core/block.c | 8 ++++---- drivers/mmc/core/core.c | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c index db8c99c..5032f7a 100644 --- a/drivers/mmc/core/block.c +++ b/drivers/mmc/core/block.c @@ -1458,7 +1458,7 @@ static void mmc_blk_data_prep(struct mmc_queue *mq, s= truct mmc_queue_req *mqrq, * sectors can be read successfully. */ if (recovery_mode) - brq->data.blocks =3D queue_physical_block_size(mq->queue) >> 9; + brq->data.blocks =3D queue_physical_block_size(mq->queue) >> SECTOR_SHI= FT; =20 /* * Some controllers have HW issues while operating @@ -1976,7 +1976,7 @@ static void mmc_blk_mq_rw_recovery(struct mmc_queue *= mq, struct request *req) } =20 if (rq_data_dir(req) =3D=3D READ && brq->data.blocks > - queue_physical_block_size(mq->queue) >> 9) { + queue_physical_block_size(mq->queue) >> SECTOR_SHIFT) { /* Read one (native) sector at a time */ mmc_blk_read_single(mq, req); return; @@ -3025,14 +3025,14 @@ static int mmc_blk_alloc_parts(struct mmc_card *car= d, struct mmc_blk_data *md) */ ret =3D mmc_blk_alloc_rpmb_part(card, md, card->part[idx].part_cfg, - card->part[idx].size >> 9, + card->part[idx].size >> SECTOR_SHIFT, card->part[idx].name); if (ret) return ret; } else if (card->part[idx].size) { ret =3D mmc_blk_alloc_part(card, md, card->part[idx].part_cfg, - card->part[idx].size >> 9, + card->part[idx].size >> SECTOR_SHIFT, card->part[idx].force_ro, card->part[idx].name, card->part[idx].area_type); diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 860378b..29e80e5 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -97,7 +97,8 @@ static void mmc_should_fail_request(struct mmc_host *host, return; =20 data->error =3D data_errors[get_random_u32_below(ARRAY_SIZE(data_errors))= ]; - data->bytes_xfered =3D get_random_u32_below(data->bytes_xfered >> 9) << 9; + data->bytes_xfered =3D get_random_u32_below(data->bytes_xfered >> SECTOR_= SHIFT) + << SECTOR_SHIFT; } =20 #else /* CONFIG_FAIL_MMC_REQUEST */ --=20 2.7.4 From nobody Thu Apr 2 07:43:58 2026 Received: from mail-m49215.qiye.163.com (mail-m49215.qiye.163.com [45.254.49.215]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 44BC528C87C; Mon, 30 Mar 2026 03:34:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.254.49.215 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774841645; cv=none; b=nXQ4L0LqYf8NRLXZj4apXXBBZuyAF+XsW0GUvibubvm7SeyK+mR87mBsrxUzkoPZKYGsPq965istuQwHNk3/sN5KypWH4T0ZtKWDJp9ATZLVwC/Ugp+zQuGEsXFsqFNcCxwW7LRwGAf+eWfMwpZiFHvowNjirMxfOhOXZt3ZaFw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774841645; c=relaxed/simple; bh=Q+HfbO6f83LJ1/d8EoI2vQJJKXt7nlIPOJgGmkxd7VA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=TpMZxqzo2c1ktm26Wug4LZ7Mcjm4aahKfP0RyVZbWnSI0eRnYdeHBhssjerUspdM+KEzeWs8PHE7OTl9jMKzOrk6HQhi40mmPdA3XPLDeYfQILvZYF2n3Vq0/WlJrEhc1cQnF9QsCq1iUeU28VvjqcQXSjy5LXnIVx7I0RhKj5o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com; spf=pass smtp.mailfrom=rock-chips.com; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b=FPw06S1O; arc=none smtp.client-ip=45.254.49.215 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b="FPw06S1O" Received: from localhost.localdomain (unknown [58.22.7.114]) by smtp.qiye.163.com (Hmail) with ESMTP id 38c2332c2; Mon, 30 Mar 2026 11:28:46 +0800 (GMT+08:00) From: Shawn Lin To: Ulf Hansson Cc: linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org, Shawn Lin Subject: [PATCH 2/4] mmc: block: Convert to use DEFINE_SIMPLE_DEV_PM_OPS() Date: Mon, 30 Mar 2026 11:28:30 +0800 Message-Id: <1774841312-92409-3-git-send-email-shawn.lin@rock-chips.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1774841312-92409-1-git-send-email-shawn.lin@rock-chips.com> References: <1774841312-92409-1-git-send-email-shawn.lin@rock-chips.com> X-HM-Tid: 0a9d3cc96aa309cckunmd82a3513dfee53 X-HM-MType: 1 X-HM-Spam-Status: e1kfGhgUHx5ZQUpXWQgPGg8OCBgUHx5ZQUlOS1dZFg8aDwILHllBWSg2Ly tZV1koWUFDSUNOT01LS0k3V1ktWUFJV1kPCRoVCBIfWUFZQx0dH1ZKQh5CS0MfHxpKGh1WFRQJFh oXVRMBExYaEhckFA4PWVdZGBILWUFZTkNVSUlVTFVKSk9ZV1kWGg8SFR0UWUFZT0tIVUpLSU9PT0 hVSktLVUpCS0tZBg++ DKIM-Signature: a=rsa-sha256; b=FPw06S1OxkqnPIbCk+SSJdocR1N6ckS2hMxekdU/G2dGG8cfpAVXHrK2j005tVi/2UB05RAwyfTdpRPaLJtlbT51PuZ7qRYPH8o7x76aR7ReWSZ/GA/3GRuKiPpWW65q8Z3wlCPzX/4T6pwYk6Bpvgj2hvHuPP7f89Vh1LynJD8=; s=default; c=relaxed/relaxed; d=rock-chips.com; v=1; bh=h8GM9ZlCZqEiNxBVPLaHC5mxpL3bB986XLR9Mkv/lW8=; h=date:mime-version:subject:message-id:from; Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Convert to use DEFINE_SIMPLE_DEV_PM_OPS() and pm_sleep_ptr() to drop the CONFIG_PM_SLEEP to handle the conditional compilation when PM support is disabled. This allows the compiler to automatically optimize away the unused code paths when CONFIG_PM_SLEEP is not selected. Signed-off-by: Shawn Lin --- drivers/mmc/core/block.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c index 5032f7a..53c1b04 100644 --- a/drivers/mmc/core/block.c +++ b/drivers/mmc/core/block.c @@ -3362,7 +3362,6 @@ static void mmc_blk_shutdown(struct mmc_card *card) _mmc_blk_suspend(card); } =20 -#ifdef CONFIG_PM_SLEEP static int mmc_blk_suspend(struct device *dev) { struct mmc_card *card =3D mmc_dev_to_card(dev); @@ -3388,14 +3387,13 @@ static int mmc_blk_resume(struct device *dev) } return 0; } -#endif =20 -static SIMPLE_DEV_PM_OPS(mmc_blk_pm_ops, mmc_blk_suspend, mmc_blk_resume); +static DEFINE_SIMPLE_DEV_PM_OPS(mmc_blk_pm_ops, mmc_blk_suspend, mmc_blk_r= esume); =20 static struct mmc_driver mmc_driver =3D { .drv =3D { .name =3D "mmcblk", - .pm =3D &mmc_blk_pm_ops, + .pm =3D pm_sleep_ptr(&mmc_blk_pm_ops), }, .probe =3D mmc_blk_probe, .remove =3D mmc_blk_remove, --=20 2.7.4 From nobody Thu Apr 2 07:43:58 2026 Received: from mail-m15571.qiye.163.com (mail-m15571.qiye.163.com [101.71.155.71]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 47ABE1E5B70; Mon, 30 Mar 2026 03:28:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=101.71.155.71 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774841342; cv=none; b=gSqVmskxSoB4Ue8rniH3cyb2KTVWuU/bQCnWBMcxh9GrdC1SokplawAbLgy9cQDYRl7Yt7+k3UW5EY3orU2EwMCNrYwm7E40ab7jh1p/JIeXvVJkDNMRG1vplPU/86OeCDDXyCzXAHL4kXxVCz5hi+YYDYqg8WrRUpipK7hutaQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774841342; c=relaxed/simple; bh=a/qXiOrC3r7pBweKNSZ0Nrf8q4W1HTAVOZIGUZN6gvk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=Kyq2UFNPPaHkrC+dkLmCyneUWAJDOlMxwBa6dq0IylaSQVaYcb4oYeoOEPl2d6ZqBfq0JuexoJwVK9dlYwLzx8PTog7Kf1gX8spFSDaMm49bvmK6UKBaDffsmrSToOK2Eu3zxEYXD28/xetArVysqHg21HeoeM7EZ0h/cNh4lGQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com; spf=pass smtp.mailfrom=rock-chips.com; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b=dCVkJqWU; arc=none smtp.client-ip=101.71.155.71 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b="dCVkJqWU" Received: from localhost.localdomain (unknown [58.22.7.114]) by smtp.qiye.163.com (Hmail) with ESMTP id 38c2332d1; Mon, 30 Mar 2026 11:28:48 +0800 (GMT+08:00) From: Shawn Lin To: Ulf Hansson Cc: linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org, Shawn Lin Subject: [PATCH 3/4] mmc: mmc_test: Replace hard-coded values with macros and consolidate test parameters Date: Mon, 30 Mar 2026 11:28:31 +0800 Message-Id: <1774841312-92409-4-git-send-email-shawn.lin@rock-chips.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1774841312-92409-1-git-send-email-shawn.lin@rock-chips.com> References: <1774841312-92409-1-git-send-email-shawn.lin@rock-chips.com> X-HM-Tid: 0a9d3cc972f109cckunmd82a3513dfee6f X-HM-MType: 1 X-HM-Spam-Status: e1kfGhgUHx5ZQUpXWQgPGg8OCBgUHx5ZQUlOS1dZFg8aDwILHllBWSg2Ly tZV1koWUFDSUNOT01LS0k3V1ktWUFJV1kPCRoVCBIfWUFZGkxDH1ZMQ0kfSB9ITEtJTUJWFRQJFh oXVRMBExYaEhckFA4PWVdZGBILWUFZTkNVSUlVTFVKSk9ZV1kWGg8SFR0UWUFZT0tIVUpLSU9PT0 hVSktLVUpCS0tZBg++ DKIM-Signature: a=rsa-sha256; b=dCVkJqWU+jZh3CsaMLoOvBqvYnMmsnSwHc+Q5dMHherZOlPdSRUKZ6rTD1XpWcUE32TvfimvnseL42eciHvPvfPhHf0zJ21lHJ1TTaFchq0evfsWz0tL9kFKHs5teMCn4A2MjCFVvr5b/mn36IaLSfOqQ8Lj9MH4YSJD7gZOFrQ=; s=default; c=relaxed/relaxed; d=rock-chips.com; v=1; bh=SgtCjbBznjfVBC51np7tLPNDBQwKtzfM1Zq7tzDEf5M=; h=date:mime-version:subject:message-id:from; Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Replacing hard-coded values with standardized macros to improve code clarit= y, simplify future maintenance. Meanwhile, introduce global bs and sg_len arrays for block sizes and SG len= gths, eliminating redundant local definitions in multiple test functions. Signed-off-by: Shawn Lin --- drivers/mmc/core/mmc_test.c | 83 ++++++++++++++++++++---------------------= ---- 1 file changed, 36 insertions(+), 47 deletions(-) diff --git a/drivers/mmc/core/mmc_test.c b/drivers/mmc/core/mmc_test.c index f5c5428..ab38e4c 100644 --- a/drivers/mmc/core/mmc_test.c +++ b/drivers/mmc/core/mmc_test.c @@ -37,7 +37,7 @@ * Limit the test area size to the maximum MMC HC erase group size. Note = that * the maximum SD allocation unit size is just 4MiB. */ -#define TEST_AREA_MAX_SIZE (128 * 1024 * 1024) +#define TEST_AREA_MAX_SIZE SZ_128M =20 /** * struct mmc_test_pages - pages allocated by 'alloc_pages()'. @@ -169,6 +169,11 @@ struct mmc_test_multiple_rw { enum mmc_test_prep_media prepare; }; =20 +static unsigned int bs[] =3D {1 << 12, 1 << 13, 1 << 14, 1 << 15, 1 << 16, + 1 << 17, 1 << 18, 1 << 19, 1 << 20, 1 << 22}; + +static unsigned int sg_len[] =3D {1, 1 << 3, 1 << 4, 1 << 5, 1 << 6, + 1 << 7, 1 << 8, 1 << 9}; /*******************************************************************/ /* General helper functions */ /*******************************************************************/ @@ -502,7 +507,7 @@ static unsigned int mmc_test_rate(uint64_t bytes, struc= t timespec64 *ts) uint64_t ns; =20 ns =3D timespec64_to_ns(ts); - bytes *=3D 1000000000; + bytes *=3D NSEC_PER_SEC; =20 while (ns > UINT_MAX) { bytes >>=3D 1; @@ -548,7 +553,7 @@ static void mmc_test_save_transfer_result(struct mmc_te= st_card *test, static void mmc_test_print_rate(struct mmc_test_card *test, uint64_t bytes, struct timespec64 *ts1, struct timespec64 *ts2) { - unsigned int rate, iops, sectors =3D bytes >> 9; + unsigned int rate, iops, sectors =3D bytes >> SECTOR_SHIFT; struct timespec64 ts; =20 ts =3D timespec64_sub(*ts2, *ts1); @@ -573,7 +578,7 @@ static void mmc_test_print_avg_rate(struct mmc_test_car= d *test, uint64_t bytes, unsigned int count, struct timespec64 *ts1, struct timespec64 *ts2) { - unsigned int rate, iops, sectors =3D bytes >> 9; + unsigned int rate, iops, sectors =3D bytes >> SECTOR_SHIFT; uint64_t tot =3D bytes * count; struct timespec64 ts; =20 @@ -1374,7 +1379,7 @@ static int mmc_test_area_map(struct mmc_test_card *te= st, unsigned long sz, int err; unsigned int sg_len =3D 0; =20 - t->blocks =3D sz >> 9; + t->blocks =3D sz >> SECTOR_SHIFT; =20 if (max_scatter) { err =3D mmc_test_map_sg_max_scatter(t->mem, sz, t->sg, @@ -1457,7 +1462,7 @@ static int mmc_test_area_io_seq(struct mmc_test_card = *test, unsigned long sz, else for (i =3D 0; i < count && ret =3D=3D 0; i++) { ret =3D mmc_test_area_transfer(test, dev_addr, write); - dev_addr +=3D sz >> 9; + dev_addr +=3D sz >> SECTOR_SHIFT; } =20 if (ret) @@ -1500,7 +1505,7 @@ static int mmc_test_area_erase(struct mmc_test_card *= test) if (!mmc_card_can_erase(test->card)) return 0; =20 - return mmc_erase(test->card, t->dev_addr, t->max_sz >> 9, + return mmc_erase(test->card, t->dev_addr, t->max_sz >> SECTOR_SHIFT, MMC_ERASE_ARG); } =20 @@ -1528,7 +1533,7 @@ static int mmc_test_area_cleanup(struct mmc_test_card= *test) static int mmc_test_area_init(struct mmc_test_card *test, int erase, int f= ill) { struct mmc_test_area *t =3D &test->area; - unsigned long min_sz =3D 64 * 1024, sz; + unsigned long min_sz =3D SZ_64K, sz; int ret; =20 ret =3D mmc_test_set_blksize(test, 512); @@ -1536,9 +1541,9 @@ static int mmc_test_area_init(struct mmc_test_card *t= est, int erase, int fill) return ret; =20 /* Make the test area size about 4MiB */ - sz =3D (unsigned long)test->card->pref_erase << 9; + sz =3D (unsigned long)test->card->pref_erase << SECTOR_SHIFT; t->max_sz =3D sz; - while (t->max_sz < 4 * 1024 * 1024) + while (t->max_sz < SZ_4M) t->max_sz +=3D sz; while (t->max_sz > TEST_AREA_MAX_SIZE && t->max_sz > sz) t->max_sz -=3D sz; @@ -1548,8 +1553,8 @@ static int mmc_test_area_init(struct mmc_test_card *t= est, int erase, int fill) t->max_seg_sz -=3D t->max_seg_sz % 512; =20 t->max_tfr =3D t->max_sz; - if (t->max_tfr >> 9 > test->card->host->max_blk_count) - t->max_tfr =3D test->card->host->max_blk_count << 9; + if (t->max_tfr >> SECTOR_SHIFT > test->card->host->max_blk_count) + t->max_tfr =3D test->card->host->max_blk_count << SECTOR_SHIFT; if (t->max_tfr > test->card->host->max_req_size) t->max_tfr =3D test->card->host->max_req_size; if (t->max_tfr / t->max_seg_sz > t->max_segs) @@ -1579,7 +1584,7 @@ static int mmc_test_area_init(struct mmc_test_card *t= est, int erase, int fill) } =20 t->dev_addr =3D mmc_test_capacity(test->card) / 2; - t->dev_addr -=3D t->dev_addr % (t->max_sz >> 9); + t->dev_addr -=3D t->dev_addr % (t->max_sz >> SECTOR_SHIFT); =20 if (erase) { ret =3D mmc_test_area_erase(test); @@ -1684,7 +1689,7 @@ static int mmc_test_profile_read_perf(struct mmc_test= _card *test) int ret; =20 for (sz =3D 512; sz < t->max_tfr; sz <<=3D 1) { - dev_addr =3D t->dev_addr + (sz >> 9); + dev_addr =3D t->dev_addr + (sz >> SECTOR_SHIFT); ret =3D mmc_test_area_io(test, sz, dev_addr, 0, 0, 1); if (ret) return ret; @@ -1708,7 +1713,7 @@ static int mmc_test_profile_write_perf(struct mmc_tes= t_card *test) if (ret) return ret; for (sz =3D 512; sz < t->max_tfr; sz <<=3D 1) { - dev_addr =3D t->dev_addr + (sz >> 9); + dev_addr =3D t->dev_addr + (sz >> SECTOR_SHIFT); ret =3D mmc_test_area_io(test, sz, dev_addr, 1, 0, 1); if (ret) return ret; @@ -1739,9 +1744,9 @@ static int mmc_test_profile_trim_perf(struct mmc_test= _card *test) return RESULT_UNSUP_HOST; =20 for (sz =3D 512; sz < t->max_sz; sz <<=3D 1) { - dev_addr =3D t->dev_addr + (sz >> 9); + dev_addr =3D t->dev_addr + (sz >> SECTOR_SHIFT); ktime_get_ts64(&ts1); - ret =3D mmc_erase(test->card, dev_addr, sz >> 9, MMC_TRIM_ARG); + ret =3D mmc_erase(test->card, dev_addr, sz >> SECTOR_SHIFT, MMC_TRIM_ARG= ); if (ret) return ret; ktime_get_ts64(&ts2); @@ -1749,7 +1754,7 @@ static int mmc_test_profile_trim_perf(struct mmc_test= _card *test) } dev_addr =3D t->dev_addr; ktime_get_ts64(&ts1); - ret =3D mmc_erase(test->card, dev_addr, sz >> 9, MMC_TRIM_ARG); + ret =3D mmc_erase(test->card, dev_addr, sz >> SECTOR_SHIFT, MMC_TRIM_ARG); if (ret) return ret; ktime_get_ts64(&ts2); @@ -1771,7 +1776,7 @@ static int mmc_test_seq_read_perf(struct mmc_test_car= d *test, unsigned long sz) ret =3D mmc_test_area_io(test, sz, dev_addr, 0, 0, 0); if (ret) return ret; - dev_addr +=3D (sz >> 9); + dev_addr +=3D (sz >> SECTOR_SHIFT); } ktime_get_ts64(&ts2); mmc_test_print_avg_rate(test, sz, cnt, &ts1, &ts2); @@ -1813,7 +1818,7 @@ static int mmc_test_seq_write_perf(struct mmc_test_ca= rd *test, unsigned long sz) ret =3D mmc_test_area_io(test, sz, dev_addr, 1, 0, 0); if (ret) return ret; - dev_addr +=3D (sz >> 9); + dev_addr +=3D (sz >> SECTOR_SHIFT); } ktime_get_ts64(&ts2); mmc_test_print_avg_rate(test, sz, cnt, &ts1, &ts2); @@ -1866,11 +1871,11 @@ static int mmc_test_profile_seq_trim_perf(struct mm= c_test_card *test) dev_addr =3D t->dev_addr; ktime_get_ts64(&ts1); for (i =3D 0; i < cnt; i++) { - ret =3D mmc_erase(test->card, dev_addr, sz >> 9, + ret =3D mmc_erase(test->card, dev_addr, sz >> SECTOR_SHIFT, MMC_TRIM_ARG); if (ret) return ret; - dev_addr +=3D (sz >> 9); + dev_addr +=3D (sz >> SECTOR_SHIFT); } ktime_get_ts64(&ts2); mmc_test_print_avg_rate(test, sz, cnt, &ts1, &ts2); @@ -1897,7 +1902,7 @@ static int mmc_test_rnd_perf(struct mmc_test_card *te= st, int write, int print, struct timespec64 ts1, ts2, ts; int ret; =20 - ssz =3D sz >> 9; + ssz =3D sz >> SECTOR_SHIFT; =20 rnd_addr =3D mmc_test_capacity(test->card) / 4; range1 =3D rnd_addr / test->card->pref_erase; @@ -2013,10 +2018,10 @@ static int mmc_test_seq_perf(struct mmc_test_card *= test, int write, sz =3D max_tfr; } =20 - ssz =3D sz >> 9; + ssz =3D sz >> SECTOR_SHIFT; dev_addr =3D mmc_test_capacity(test->card) / 4; - if (tot_sz > dev_addr << 9) - tot_sz =3D dev_addr << 9; + if (tot_sz > dev_addr << SECTOR_SHIFT) + tot_sz =3D dev_addr << SECTOR_SHIFT; cnt =3D tot_sz / sz; dev_addr &=3D 0xffff0000; /* Round to 64MiB boundary */ =20 @@ -2040,17 +2045,17 @@ static int mmc_test_large_seq_perf(struct mmc_test_= card *test, int write) int ret, i; =20 for (i =3D 0; i < 10; i++) { - ret =3D mmc_test_seq_perf(test, write, 10 * 1024 * 1024, 1); + ret =3D mmc_test_seq_perf(test, write, 10 * SZ_1M, 1); if (ret) return ret; } for (i =3D 0; i < 5; i++) { - ret =3D mmc_test_seq_perf(test, write, 100 * 1024 * 1024, 1); + ret =3D mmc_test_seq_perf(test, write, 100 * SZ_1M, 1); if (ret) return ret; } for (i =3D 0; i < 3; i++) { - ret =3D mmc_test_seq_perf(test, write, 1000 * 1024 * 1024, 1); + ret =3D mmc_test_seq_perf(test, write, 1000 * SZ_1M, 1); if (ret) return ret; } @@ -2153,7 +2158,7 @@ static int mmc_test_rw_multiple_sg_len(struct mmc_tes= t_card *test, int i; =20 for (i =3D 0 ; i < rw->len && ret =3D=3D 0; i++) { - ret =3D mmc_test_rw_multiple(test, rw, 512 * 1024, rw->size, + ret =3D mmc_test_rw_multiple(test, rw, SZ_512K, rw->size, rw->sg_len[i]); if (ret) break; @@ -2166,8 +2171,6 @@ static int mmc_test_rw_multiple_sg_len(struct mmc_tes= t_card *test, */ static int mmc_test_profile_mult_write_blocking_perf(struct mmc_test_card = *test) { - unsigned int bs[] =3D {1 << 12, 1 << 13, 1 << 14, 1 << 15, 1 << 16, - 1 << 17, 1 << 18, 1 << 19, 1 << 20, 1 << 22}; struct mmc_test_multiple_rw test_data =3D { .bs =3D bs, .size =3D TEST_AREA_MAX_SIZE, @@ -2185,8 +2188,6 @@ static int mmc_test_profile_mult_write_blocking_perf(= struct mmc_test_card *test) */ static int mmc_test_profile_mult_write_nonblock_perf(struct mmc_test_card = *test) { - unsigned int bs[] =3D {1 << 12, 1 << 13, 1 << 14, 1 << 15, 1 << 16, - 1 << 17, 1 << 18, 1 << 19, 1 << 20, 1 << 22}; struct mmc_test_multiple_rw test_data =3D { .bs =3D bs, .size =3D TEST_AREA_MAX_SIZE, @@ -2204,8 +2205,6 @@ static int mmc_test_profile_mult_write_nonblock_perf(= struct mmc_test_card *test) */ static int mmc_test_profile_mult_read_blocking_perf(struct mmc_test_card *= test) { - unsigned int bs[] =3D {1 << 12, 1 << 13, 1 << 14, 1 << 15, 1 << 16, - 1 << 17, 1 << 18, 1 << 19, 1 << 20, 1 << 22}; struct mmc_test_multiple_rw test_data =3D { .bs =3D bs, .size =3D TEST_AREA_MAX_SIZE, @@ -2223,8 +2222,6 @@ static int mmc_test_profile_mult_read_blocking_perf(s= truct mmc_test_card *test) */ static int mmc_test_profile_mult_read_nonblock_perf(struct mmc_test_card *= test) { - unsigned int bs[] =3D {1 << 12, 1 << 13, 1 << 14, 1 << 15, 1 << 16, - 1 << 17, 1 << 18, 1 << 19, 1 << 20, 1 << 22}; struct mmc_test_multiple_rw test_data =3D { .bs =3D bs, .size =3D TEST_AREA_MAX_SIZE, @@ -2242,8 +2239,6 @@ static int mmc_test_profile_mult_read_nonblock_perf(s= truct mmc_test_card *test) */ static int mmc_test_profile_sglen_wr_blocking_perf(struct mmc_test_card *t= est) { - unsigned int sg_len[] =3D {1, 1 << 3, 1 << 4, 1 << 5, 1 << 6, - 1 << 7, 1 << 8, 1 << 9}; struct mmc_test_multiple_rw test_data =3D { .sg_len =3D sg_len, .size =3D TEST_AREA_MAX_SIZE, @@ -2261,8 +2256,6 @@ static int mmc_test_profile_sglen_wr_blocking_perf(st= ruct mmc_test_card *test) */ static int mmc_test_profile_sglen_wr_nonblock_perf(struct mmc_test_card *t= est) { - unsigned int sg_len[] =3D {1, 1 << 3, 1 << 4, 1 << 5, 1 << 6, - 1 << 7, 1 << 8, 1 << 9}; struct mmc_test_multiple_rw test_data =3D { .sg_len =3D sg_len, .size =3D TEST_AREA_MAX_SIZE, @@ -2280,8 +2273,6 @@ static int mmc_test_profile_sglen_wr_nonblock_perf(st= ruct mmc_test_card *test) */ static int mmc_test_profile_sglen_r_blocking_perf(struct mmc_test_card *te= st) { - unsigned int sg_len[] =3D {1, 1 << 3, 1 << 4, 1 << 5, 1 << 6, - 1 << 7, 1 << 8, 1 << 9}; struct mmc_test_multiple_rw test_data =3D { .sg_len =3D sg_len, .size =3D TEST_AREA_MAX_SIZE, @@ -2299,8 +2290,6 @@ static int mmc_test_profile_sglen_r_blocking_perf(str= uct mmc_test_card *test) */ static int mmc_test_profile_sglen_r_nonblock_perf(struct mmc_test_card *te= st) { - unsigned int sg_len[] =3D {1, 1 << 3, 1 << 4, 1 << 5, 1 << 6, - 1 << 7, 1 << 8, 1 << 9}; struct mmc_test_multiple_rw test_data =3D { .sg_len =3D sg_len, .size =3D TEST_AREA_MAX_SIZE, @@ -2452,7 +2441,7 @@ static int mmc_test_ongoing_transfer(struct mmc_test_= card *test, if (ret) goto out_free; =20 - if (repeat_cmd && (t->blocks + 1) << 9 > t->max_tfr) + if (repeat_cmd && (t->blocks + 1) << SECTOR_SHIFT > t->max_tfr) pr_info("%s: %d commands completed during transfer of %u blocks\n", mmc_hostname(test->card->host), count, t->blocks); =20 --=20 2.7.4 From nobody Thu Apr 2 07:43:58 2026 Received: from mail-m19731105.qiye.163.com (mail-m19731105.qiye.163.com [220.197.31.105]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AFA0E390C90; Mon, 30 Mar 2026 04:44:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=220.197.31.105 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774845872; cv=none; b=cuL8K778LddixkbR5FffJUHl7JFGpXaBHiVPlL6xQmcirMlHRqOFFXLUqIxoiXrcWdf0cGKYt+txgtyevdkh5zCAn9Sov6FSr3xL6PLREFbzGfpv08FadMCPnRAg7eVuRWuDq6YK+YtvKdRRmHdDizgaVF4oQ6MGC9IIDzBcNpE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774845872; c=relaxed/simple; bh=pFYeMsTf81Cl+Psok6PkYmttP6d07XXweNreOdZbpS8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version:Content-Type; b=VXeamE+Hb/C4KGFmJQMQ9M3Ai8jEiUJd8vdiPcwlJtrMDRswCjXFuLJ/m/Uo9Nzqbp15Dwhds5abhwI8Fy5IIHmLtxmeFYchVVIH1wM1L1h8DzkPicjjqmNOJ1J8sjvIhPH4Srejb/LR6ur46JHTWWPNLYzh73rnBwdQjNECxxA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com; spf=pass smtp.mailfrom=rock-chips.com; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b=dQe/l5CS; arc=none smtp.client-ip=220.197.31.105 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b="dQe/l5CS" Received: from localhost.localdomain (unknown [58.22.7.114]) by smtp.qiye.163.com (Hmail) with ESMTP id 38c2332df; Mon, 30 Mar 2026 11:28:51 +0800 (GMT+08:00) From: Shawn Lin To: Ulf Hansson Cc: linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org, Shawn Lin Subject: [PATCH 4/4] mmc: block: Use MQRQ_XFER_SINGLE_BLOCK for both read and write recovery Date: Mon, 30 Mar 2026 11:28:32 +0800 Message-Id: <1774841312-92409-5-git-send-email-shawn.lin@rock-chips.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1774841312-92409-1-git-send-email-shawn.lin@rock-chips.com> References: <1774841312-92409-1-git-send-email-shawn.lin@rock-chips.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-HM-Tid: 0a9d3cc9802f09cckunmd82a3513dfee94 X-HM-MType: 1 X-HM-Spam-Status: e1kfGhgUHx5ZQUpXWQgPGg8OCBgUHx5ZQUlOS1dZFg8aDwILHllBWSg2Ly tZV1koWUFDSUNOT01LS0k3V1ktWUFJV1kPCRoVCBIfWUFZGksZSFYdTkIfTUpKTU9LHUxWFRQJFh oXVRMBExYaEhckFA4PWVdZGBILWUFZTkNVSUlVTFVKSk9ZV1kWGg8SFR0UWUFZT0tIVUpLSU9PT0 hVSktLVUpCS0tZBg++ DKIM-Signature: a=rsa-sha256; b=dQe/l5CSKwnCIEGcAfXfWCnLENKT/QypsrG1kJTfBByUPxXhhazjIdLwTQKVzMIWa21SAZwmlkk64j4baSe//qO+U/575Dk5mQOkDUrSRepKNlI4J9K30u98cgFUFrlVXqOR+cB1uyoo/XFkVDy8iOj19aWewPTp0IFIY2gw6Vs=; s=default; c=relaxed/relaxed; d=rock-chips.com; v=1; bh=sCFuKJdZv28jAe2p5V34BEQSKdzuv40qyLTQNeXzpMY=; h=date:mime-version:subject:message-id:from; Content-Type: text/plain; charset="utf-8" Currently, the code uses the MQRQ_XFER_SINGLE_BLOCK flag to handle write failures by retrying with single-block transfers. However, read failures bypass this mechanism and instead use a dedicated legacy path mmc_blk_read_= single() that performs sector-by-sector retries. Extend the MQRQ_XFER_SINGLE_BLOCK logic to cover multi-block read failures as well. By doing so, we can remove the redundant and complex mmc_blk_read_= single() function, unifying the retry logic for both read and write operations under a single, consistent, easier-to-maintain mechanism. Signed-off-by: Shawn Lin --- drivers/mmc/core/block.c | 70 ++------------------------------------------= ---- 1 file changed, 2 insertions(+), 68 deletions(-) diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c index 53c1b04..0274e8d 100644 --- a/drivers/mmc/core/block.c +++ b/drivers/mmc/core/block.c @@ -1544,8 +1544,7 @@ static void mmc_blk_cqe_complete_rq(struct mmc_queue = *mq, struct request *req) =20 if (err) { if (mqrq->retries++ < MMC_CQE_RETRIES) { - if (rq_data_dir(req) =3D=3D WRITE) - mqrq->flags |=3D MQRQ_XFER_SINGLE_BLOCK; + mqrq->flags |=3D MQRQ_XFER_SINGLE_BLOCK; blk_mq_requeue_request(req, true); } else { blk_mq_end_request(req, BLK_STS_IOERR); @@ -1782,63 +1781,6 @@ static int mmc_blk_fix_state(struct mmc_card *card, = struct request *req) return err; } =20 -#define MMC_READ_SINGLE_RETRIES 2 - -/* Single (native) sector read during recovery */ -static void mmc_blk_read_single(struct mmc_queue *mq, struct request *req) -{ - struct mmc_queue_req *mqrq =3D req_to_mmc_queue_req(req); - struct mmc_request *mrq =3D &mqrq->brq.mrq; - struct mmc_card *card =3D mq->card; - struct mmc_host *host =3D card->host; - blk_status_t error =3D BLK_STS_OK; - size_t bytes_per_read =3D queue_physical_block_size(mq->queue); - - do { - u32 status; - int err; - int retries =3D 0; - - while (retries++ <=3D MMC_READ_SINGLE_RETRIES) { - mmc_blk_rw_rq_prep(mqrq, card, 1, mq); - - mmc_wait_for_req(host, mrq); - - err =3D mmc_send_status(card, &status); - if (err) - goto error_exit; - - if (!mmc_host_is_spi(host) && - !mmc_ready_for_data(status)) { - err =3D mmc_blk_fix_state(card, req); - if (err) - goto error_exit; - } - - if (!mrq->cmd->error) - break; - } - - if (mrq->cmd->error || - mrq->data->error || - (!mmc_host_is_spi(host) && - (mrq->cmd->resp[0] & CMD_ERRORS || status & CMD_ERRORS))) - error =3D BLK_STS_IOERR; - else - error =3D BLK_STS_OK; - - } while (blk_update_request(req, error, bytes_per_read)); - - return; - -error_exit: - mrq->data->bytes_xfered =3D 0; - blk_update_request(req, BLK_STS_IOERR, bytes_per_read); - /* Let it try the remaining request again */ - if (mqrq->retries > MMC_MAX_RETRIES - 1) - mqrq->retries =3D MMC_MAX_RETRIES - 1; -} - static inline bool mmc_blk_oor_valid(struct mmc_blk_request *brq) { return !!brq->mrq.sbc; @@ -1974,13 +1916,6 @@ static void mmc_blk_mq_rw_recovery(struct mmc_queue = *mq, struct request *req) mqrq->retries =3D MMC_MAX_RETRIES - MMC_DATA_RETRIES; return; } - - if (rq_data_dir(req) =3D=3D READ && brq->data.blocks > - queue_physical_block_size(mq->queue) >> SECTOR_SHIFT) { - /* Read one (native) sector at a time */ - mmc_blk_read_single(mq, req); - return; - } } =20 static inline bool mmc_blk_rq_error(struct mmc_blk_request *brq) @@ -2091,8 +2026,7 @@ static void mmc_blk_mq_complete_rq(struct mmc_queue *= mq, struct request *req) } else if (!blk_rq_bytes(req)) { __blk_mq_end_request(req, BLK_STS_IOERR); } else if (mqrq->retries++ < MMC_MAX_RETRIES) { - if (rq_data_dir(req) =3D=3D WRITE) - mqrq->flags |=3D MQRQ_XFER_SINGLE_BLOCK; + mqrq->flags |=3D MQRQ_XFER_SINGLE_BLOCK; blk_mq_requeue_request(req, true); } else { if (mmc_card_removed(mq->card)) --=20 2.7.4