* [PATCH] mmc: block: Use .card_busy() to detect busy state in card_busy_detect
@ 2021-06-07 9:18 Shawn Lin
2021-06-07 13:28 ` kernel test robot
` (3 more replies)
0 siblings, 4 replies; 10+ messages in thread
From: Shawn Lin @ 2021-06-07 9:18 UTC (permalink / raw)
To: Ulf Hansson; +Cc: linux-mmc, Shawn Lin
No need to send CMD13 if host driver supports .card_busy().
Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
---
drivers/mmc/core/block.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
index 88f4c215..23623a9 100644
--- a/drivers/mmc/core/block.c
+++ b/drivers/mmc/core/block.c
@@ -417,10 +417,17 @@ static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms,
unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms);
int err = 0;
u32 status;
+ bool busy;
do {
bool done = time_after(jiffies, timeout);
+ if (card->host->ops->card_busy) {
+ busy = card->host->ops->card_busy(card->host);
+ status = busy ? 0 : R1_READY_FOR_DATA | R1_STATE_TRAN << 9;
+ goto cb;
+ }
+
err = __mmc_send_status(card, &status, 5);
if (err) {
dev_err(mmc_dev(card->host),
@@ -442,6 +449,7 @@ static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms,
__func__, status);
return -ETIMEDOUT;
}
+cb:
} while (!mmc_ready_for_data(status));
return err;
--
2.7.4
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH] mmc: block: Use .card_busy() to detect busy state in card_busy_detect
2021-06-07 9:18 [PATCH] mmc: block: Use .card_busy() to detect busy state in card_busy_detect Shawn Lin
@ 2021-06-07 13:28 ` kernel test robot
2021-06-07 14:03 ` kernel test robot
` (2 subsequent siblings)
3 siblings, 0 replies; 10+ messages in thread
From: kernel test robot @ 2021-06-07 13:28 UTC (permalink / raw)
To: Shawn Lin, Ulf Hansson; +Cc: kbuild-all, linux-mmc, Shawn Lin
[-- Attachment #1: Type: text/plain, Size: 3122 bytes --]
Hi Shawn,
I love your patch! Yet something to improve:
[auto build test ERROR on linus/master]
[also build test ERROR on v5.13-rc5 next-20210607]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Shawn-Lin/mmc-block-Use-card_busy-to-detect-busy-state-in-card_busy_detect/20210607-172028
base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 614124bea77e452aa6df7a8714e8bc820b489922
config: alpha-randconfig-r034-20210607 (attached as .config)
compiler: alpha-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/2224db607cd2136af3a045ca8b2b8442705f8752
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Shawn-Lin/mmc-block-Use-card_busy-to-detect-busy-state-in-card_busy_detect/20210607-172028
git checkout 2224db607cd2136af3a045ca8b2b8442705f8752
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=alpha
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
drivers/mmc/core/block.c: In function 'card_busy_detect':
>> drivers/mmc/core/block.c:451:1: error: label at end of compound statement
451 | cb:
| ^~
vim +451 drivers/mmc/core/block.c
412
413 static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms,
414 u32 *resp_errs)
415 {
416 unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms);
417 int err = 0;
418 u32 status;
419 bool busy;
420
421 do {
422 bool done = time_after(jiffies, timeout);
423
424 if (card->host->ops->card_busy) {
425 busy = card->host->ops->card_busy(card->host);
426 status = busy ? 0 : R1_READY_FOR_DATA | R1_STATE_TRAN << 9;
427 goto cb;
428 }
429
430 err = __mmc_send_status(card, &status, 5);
431 if (err) {
432 dev_err(mmc_dev(card->host),
433 "error %d requesting status\n", err);
434 return err;
435 }
436
437 /* Accumulate any response error bits seen */
438 if (resp_errs)
439 *resp_errs |= status;
440
441 /*
442 * Timeout if the device never becomes ready for data and never
443 * leaves the program state.
444 */
445 if (done) {
446 dev_err(mmc_dev(card->host),
447 "Card stuck in wrong state! %s status: %#x\n",
448 __func__, status);
449 return -ETIMEDOUT;
450 }
> 451 cb:
452 } while (!mmc_ready_for_data(status));
453
454 return err;
455 }
456
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 42627 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] mmc: block: Use .card_busy() to detect busy state in card_busy_detect
@ 2021-06-07 13:28 ` kernel test robot
0 siblings, 0 replies; 10+ messages in thread
From: kernel test robot @ 2021-06-07 13:28 UTC (permalink / raw)
To: kbuild-all
[-- Attachment #1: Type: text/plain, Size: 3210 bytes --]
Hi Shawn,
I love your patch! Yet something to improve:
[auto build test ERROR on linus/master]
[also build test ERROR on v5.13-rc5 next-20210607]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Shawn-Lin/mmc-block-Use-card_busy-to-detect-busy-state-in-card_busy_detect/20210607-172028
base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 614124bea77e452aa6df7a8714e8bc820b489922
config: alpha-randconfig-r034-20210607 (attached as .config)
compiler: alpha-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/2224db607cd2136af3a045ca8b2b8442705f8752
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Shawn-Lin/mmc-block-Use-card_busy-to-detect-busy-state-in-card_busy_detect/20210607-172028
git checkout 2224db607cd2136af3a045ca8b2b8442705f8752
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=alpha
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
drivers/mmc/core/block.c: In function 'card_busy_detect':
>> drivers/mmc/core/block.c:451:1: error: label at end of compound statement
451 | cb:
| ^~
vim +451 drivers/mmc/core/block.c
412
413 static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms,
414 u32 *resp_errs)
415 {
416 unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms);
417 int err = 0;
418 u32 status;
419 bool busy;
420
421 do {
422 bool done = time_after(jiffies, timeout);
423
424 if (card->host->ops->card_busy) {
425 busy = card->host->ops->card_busy(card->host);
426 status = busy ? 0 : R1_READY_FOR_DATA | R1_STATE_TRAN << 9;
427 goto cb;
428 }
429
430 err = __mmc_send_status(card, &status, 5);
431 if (err) {
432 dev_err(mmc_dev(card->host),
433 "error %d requesting status\n", err);
434 return err;
435 }
436
437 /* Accumulate any response error bits seen */
438 if (resp_errs)
439 *resp_errs |= status;
440
441 /*
442 * Timeout if the device never becomes ready for data and never
443 * leaves the program state.
444 */
445 if (done) {
446 dev_err(mmc_dev(card->host),
447 "Card stuck in wrong state! %s status: %#x\n",
448 __func__, status);
449 return -ETIMEDOUT;
450 }
> 451 cb:
452 } while (!mmc_ready_for_data(status));
453
454 return err;
455 }
456
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 42627 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] mmc: block: Use .card_busy() to detect busy state in card_busy_detect
2021-06-07 9:18 [PATCH] mmc: block: Use .card_busy() to detect busy state in card_busy_detect Shawn Lin
@ 2021-06-07 14:03 ` kernel test robot
2021-06-07 14:03 ` kernel test robot
` (2 subsequent siblings)
3 siblings, 0 replies; 10+ messages in thread
From: kernel test robot @ 2021-06-07 14:03 UTC (permalink / raw)
To: Shawn Lin, Ulf Hansson
Cc: kbuild-all, clang-built-linux, linux-mmc, Shawn Lin
[-- Attachment #1: Type: text/plain, Size: 6166 bytes --]
Hi Shawn,
I love your patch! Yet something to improve:
[auto build test ERROR on linus/master]
[also build test ERROR on v5.13-rc5 next-20210607]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Shawn-Lin/mmc-block-Use-card_busy-to-detect-busy-state-in-card_busy_detect/20210607-172028
base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 614124bea77e452aa6df7a8714e8bc820b489922
config: x86_64-randconfig-a002-20210607 (attached as .config)
compiler: clang version 13.0.0 (https://github.com/llvm/llvm-project ae973380c5f6be77ce395022be40350942260be9)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install x86_64 cross compiling tool for clang build
# apt-get install binutils-x86-64-linux-gnu
# https://github.com/0day-ci/linux/commit/2224db607cd2136af3a045ca8b2b8442705f8752
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Shawn-Lin/mmc-block-Use-card_busy-to-detect-busy-state-in-card_busy_detect/20210607-172028
git checkout 2224db607cd2136af3a045ca8b2b8442705f8752
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
>> drivers/mmc/core/block.c:452:2: error: expected statement
} while (!mmc_ready_for_data(status));
^
1 error generated.
vim +452 drivers/mmc/core/block.c
a5f5774c55a2e3 drivers/mmc/card/block.c Jon Hunter 2015-09-22 412
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 413 static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms,
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 414 u32 *resp_errs)
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 415 {
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 416 unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms);
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 417 int err = 0;
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 418 u32 status;
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 419 bool busy;
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 420
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 421 do {
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 422 bool done = time_after(jiffies, timeout);
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 423
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 424 if (card->host->ops->card_busy) {
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 425 busy = card->host->ops->card_busy(card->host);
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 426 status = busy ? 0 : R1_READY_FOR_DATA | R1_STATE_TRAN << 9;
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 427 goto cb;
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 428 }
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 429
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 430 err = __mmc_send_status(card, &status, 5);
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 431 if (err) {
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 432 dev_err(mmc_dev(card->host),
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 433 "error %d requesting status\n", err);
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 434 return err;
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 435 }
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 436
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 437 /* Accumulate any response error bits seen */
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 438 if (resp_errs)
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 439 *resp_errs |= status;
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 440
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 441 /*
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 442 * Timeout if the device never becomes ready for data and never
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 443 * leaves the program state.
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 444 */
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 445 if (done) {
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 446 dev_err(mmc_dev(card->host),
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 447 "Card stuck in wrong state! %s status: %#x\n",
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 448 __func__, status);
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 449 return -ETIMEDOUT;
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 450 }
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 451 cb:
40c96853fef1bd drivers/mmc/core/block.c Ulf Hansson 2020-02-04 @452 } while (!mmc_ready_for_data(status));
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 453
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 454 return err;
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 455 }
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 456
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 30922 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] mmc: block: Use .card_busy() to detect busy state in card_busy_detect
@ 2021-06-07 14:03 ` kernel test robot
0 siblings, 0 replies; 10+ messages in thread
From: kernel test robot @ 2021-06-07 14:03 UTC (permalink / raw)
To: kbuild-all
[-- Attachment #1: Type: text/plain, Size: 6256 bytes --]
Hi Shawn,
I love your patch! Yet something to improve:
[auto build test ERROR on linus/master]
[also build test ERROR on v5.13-rc5 next-20210607]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Shawn-Lin/mmc-block-Use-card_busy-to-detect-busy-state-in-card_busy_detect/20210607-172028
base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 614124bea77e452aa6df7a8714e8bc820b489922
config: x86_64-randconfig-a002-20210607 (attached as .config)
compiler: clang version 13.0.0 (https://github.com/llvm/llvm-project ae973380c5f6be77ce395022be40350942260be9)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install x86_64 cross compiling tool for clang build
# apt-get install binutils-x86-64-linux-gnu
# https://github.com/0day-ci/linux/commit/2224db607cd2136af3a045ca8b2b8442705f8752
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Shawn-Lin/mmc-block-Use-card_busy-to-detect-busy-state-in-card_busy_detect/20210607-172028
git checkout 2224db607cd2136af3a045ca8b2b8442705f8752
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
>> drivers/mmc/core/block.c:452:2: error: expected statement
} while (!mmc_ready_for_data(status));
^
1 error generated.
vim +452 drivers/mmc/core/block.c
a5f5774c55a2e3 drivers/mmc/card/block.c Jon Hunter 2015-09-22 412
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 413 static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms,
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 414 u32 *resp_errs)
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 415 {
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 416 unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms);
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 417 int err = 0;
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 418 u32 status;
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 419 bool busy;
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 420
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 421 do {
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 422 bool done = time_after(jiffies, timeout);
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 423
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 424 if (card->host->ops->card_busy) {
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 425 busy = card->host->ops->card_busy(card->host);
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 426 status = busy ? 0 : R1_READY_FOR_DATA | R1_STATE_TRAN << 9;
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 427 goto cb;
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 428 }
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 429
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 430 err = __mmc_send_status(card, &status, 5);
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 431 if (err) {
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 432 dev_err(mmc_dev(card->host),
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 433 "error %d requesting status\n", err);
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 434 return err;
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 435 }
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 436
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 437 /* Accumulate any response error bits seen */
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 438 if (resp_errs)
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 439 *resp_errs |= status;
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 440
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 441 /*
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 442 * Timeout if the device never becomes ready for data and never
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 443 * leaves the program state.
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 444 */
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 445 if (done) {
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 446 dev_err(mmc_dev(card->host),
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 447 "Card stuck in wrong state! %s status: %#x\n",
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 448 __func__, status);
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 449 return -ETIMEDOUT;
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 450 }
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 451 cb:
40c96853fef1bd drivers/mmc/core/block.c Ulf Hansson 2020-02-04 @452 } while (!mmc_ready_for_data(status));
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 453
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 454 return err;
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 455 }
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 456
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 30922 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] mmc: block: Use .card_busy() to detect busy state in card_busy_detect
2021-06-07 9:18 [PATCH] mmc: block: Use .card_busy() to detect busy state in card_busy_detect Shawn Lin
@ 2021-06-07 14:28 ` kernel test robot
2021-06-07 14:03 ` kernel test robot
` (2 subsequent siblings)
3 siblings, 0 replies; 10+ messages in thread
From: kernel test robot @ 2021-06-07 14:28 UTC (permalink / raw)
To: Shawn Lin, Ulf Hansson
Cc: kbuild-all, clang-built-linux, linux-mmc, Shawn Lin
[-- Attachment #1: Type: text/plain, Size: 6642 bytes --]
Hi Shawn,
I love your patch! Yet something to improve:
[auto build test ERROR on linus/master]
[also build test ERROR on v5.13-rc5 next-20210607]
[cannot apply to ulf.hansson-mmc/next mmc/mmc-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Shawn-Lin/mmc-block-Use-card_busy-to-detect-busy-state-in-card_busy_detect/20210607-172028
base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 614124bea77e452aa6df7a8714e8bc820b489922
config: riscv-randconfig-r002-20210607 (attached as .config)
compiler: clang version 13.0.0 (https://github.com/llvm/llvm-project ae973380c5f6be77ce395022be40350942260be9)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install riscv cross compiling tool for clang build
# apt-get install binutils-riscv64-linux-gnu
# https://github.com/0day-ci/linux/commit/2224db607cd2136af3a045ca8b2b8442705f8752
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Shawn-Lin/mmc-block-Use-card_busy-to-detect-busy-state-in-card_busy_detect/20210607-172028
git checkout 2224db607cd2136af3a045ca8b2b8442705f8752
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=riscv
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
>> drivers/mmc/core/block.c:452:2: error: expected statement
} while (!mmc_ready_for_data(status));
^
1 error generated.
Kconfig warnings: (for reference only)
WARNING: unmet direct dependencies detected for LOCKDEP
Depends on DEBUG_KERNEL && LOCK_DEBUGGING_SUPPORT && (FRAME_POINTER || MIPS || PPC || S390 || MICROBLAZE || ARM || ARC || X86)
Selected by
- PROVE_LOCKING && DEBUG_KERNEL && LOCK_DEBUGGING_SUPPORT
- LOCK_STAT && DEBUG_KERNEL && LOCK_DEBUGGING_SUPPORT
- DEBUG_LOCK_ALLOC && DEBUG_KERNEL && LOCK_DEBUGGING_SUPPORT
vim +452 drivers/mmc/core/block.c
a5f5774c55a2e3 drivers/mmc/card/block.c Jon Hunter 2015-09-22 412
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 413 static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms,
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 414 u32 *resp_errs)
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 415 {
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 416 unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms);
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 417 int err = 0;
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 418 u32 status;
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 419 bool busy;
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 420
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 421 do {
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 422 bool done = time_after(jiffies, timeout);
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 423
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 424 if (card->host->ops->card_busy) {
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 425 busy = card->host->ops->card_busy(card->host);
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 426 status = busy ? 0 : R1_READY_FOR_DATA | R1_STATE_TRAN << 9;
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 427 goto cb;
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 428 }
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 429
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 430 err = __mmc_send_status(card, &status, 5);
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 431 if (err) {
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 432 dev_err(mmc_dev(card->host),
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 433 "error %d requesting status\n", err);
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 434 return err;
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 435 }
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 436
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 437 /* Accumulate any response error bits seen */
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 438 if (resp_errs)
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 439 *resp_errs |= status;
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 440
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 441 /*
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 442 * Timeout if the device never becomes ready for data and never
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 443 * leaves the program state.
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 444 */
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 445 if (done) {
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 446 dev_err(mmc_dev(card->host),
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 447 "Card stuck in wrong state! %s status: %#x\n",
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 448 __func__, status);
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 449 return -ETIMEDOUT;
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 450 }
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 451 cb:
40c96853fef1bd drivers/mmc/core/block.c Ulf Hansson 2020-02-04 @452 } while (!mmc_ready_for_data(status));
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 453
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 454 return err;
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 455 }
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 456
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 28306 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] mmc: block: Use .card_busy() to detect busy state in card_busy_detect
@ 2021-06-07 14:28 ` kernel test robot
0 siblings, 0 replies; 10+ messages in thread
From: kernel test robot @ 2021-06-07 14:28 UTC (permalink / raw)
To: kbuild-all
[-- Attachment #1: Type: text/plain, Size: 6741 bytes --]
Hi Shawn,
I love your patch! Yet something to improve:
[auto build test ERROR on linus/master]
[also build test ERROR on v5.13-rc5 next-20210607]
[cannot apply to ulf.hansson-mmc/next mmc/mmc-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Shawn-Lin/mmc-block-Use-card_busy-to-detect-busy-state-in-card_busy_detect/20210607-172028
base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 614124bea77e452aa6df7a8714e8bc820b489922
config: riscv-randconfig-r002-20210607 (attached as .config)
compiler: clang version 13.0.0 (https://github.com/llvm/llvm-project ae973380c5f6be77ce395022be40350942260be9)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install riscv cross compiling tool for clang build
# apt-get install binutils-riscv64-linux-gnu
# https://github.com/0day-ci/linux/commit/2224db607cd2136af3a045ca8b2b8442705f8752
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Shawn-Lin/mmc-block-Use-card_busy-to-detect-busy-state-in-card_busy_detect/20210607-172028
git checkout 2224db607cd2136af3a045ca8b2b8442705f8752
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=riscv
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
>> drivers/mmc/core/block.c:452:2: error: expected statement
} while (!mmc_ready_for_data(status));
^
1 error generated.
Kconfig warnings: (for reference only)
WARNING: unmet direct dependencies detected for LOCKDEP
Depends on DEBUG_KERNEL && LOCK_DEBUGGING_SUPPORT && (FRAME_POINTER || MIPS || PPC || S390 || MICROBLAZE || ARM || ARC || X86)
Selected by
- PROVE_LOCKING && DEBUG_KERNEL && LOCK_DEBUGGING_SUPPORT
- LOCK_STAT && DEBUG_KERNEL && LOCK_DEBUGGING_SUPPORT
- DEBUG_LOCK_ALLOC && DEBUG_KERNEL && LOCK_DEBUGGING_SUPPORT
vim +452 drivers/mmc/core/block.c
a5f5774c55a2e3 drivers/mmc/card/block.c Jon Hunter 2015-09-22 412
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 413 static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms,
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 414 u32 *resp_errs)
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 415 {
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 416 unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms);
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 417 int err = 0;
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 418 u32 status;
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 419 bool busy;
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 420
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 421 do {
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 422 bool done = time_after(jiffies, timeout);
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 423
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 424 if (card->host->ops->card_busy) {
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 425 busy = card->host->ops->card_busy(card->host);
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 426 status = busy ? 0 : R1_READY_FOR_DATA | R1_STATE_TRAN << 9;
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 427 goto cb;
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 428 }
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 429
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 430 err = __mmc_send_status(card, &status, 5);
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 431 if (err) {
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 432 dev_err(mmc_dev(card->host),
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 433 "error %d requesting status\n", err);
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 434 return err;
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 435 }
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 436
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 437 /* Accumulate any response error bits seen */
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 438 if (resp_errs)
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 439 *resp_errs |= status;
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 440
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 441 /*
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 442 * Timeout if the device never becomes ready for data and never
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 443 * leaves the program state.
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 444 */
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 445 if (done) {
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 446 dev_err(mmc_dev(card->host),
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 447 "Card stuck in wrong state! %s status: %#x\n",
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 448 __func__, status);
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 449 return -ETIMEDOUT;
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 450 }
2224db607cd213 drivers/mmc/core/block.c Shawn Lin 2021-06-07 451 cb:
40c96853fef1bd drivers/mmc/core/block.c Ulf Hansson 2020-02-04 @452 } while (!mmc_ready_for_data(status));
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 453
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 454 return err;
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 455 }
a0d4c7eb71dd08 drivers/mmc/core/block.c Chaotian Jing 2019-09-05 456
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 28306 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] mmc: block: Use .card_busy() to detect busy state in card_busy_detect
2021-06-07 9:18 [PATCH] mmc: block: Use .card_busy() to detect busy state in card_busy_detect Shawn Lin
` (2 preceding siblings ...)
2021-06-07 14:28 ` kernel test robot
@ 2021-06-08 6:28 ` Christian Löhle
2021-06-08 6:58 ` Shawn Lin
3 siblings, 1 reply; 10+ messages in thread
From: Christian Löhle @ 2021-06-08 6:28 UTC (permalink / raw)
To: Shawn Lin, Ulf Hansson; +Cc: linux-mmc
Hey Shawn,
You're assuming a card not signalling busy indicates TRAN state, and set the state manually,
but a card might not be pulling DAT lines in PROG state.
I will send a patch later that reworks card_busy_detect, as there are some issues
with some command sequences in practice. I'd ask to wait with the patch until then.
Regards,
Christian
From: Shawn Lin <shawn.lin@rock-chips.com>
Sent: Monday, June 7, 2021 11:18 AM
To: Ulf Hansson <ulf.hansson@linaro.org>
Cc: linux-mmc@vger.kernel.org <linux-mmc@vger.kernel.org>; Shawn Lin <shawn.lin@rock-chips.com>
Subject: [PATCH] mmc: block: Use .card_busy() to detect busy state in card_busy_detect
No need to send CMD13 if host driver supports .card_busy().
Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
---
drivers/mmc/core/block.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
index 88f4c215..23623a9 100644
--- a/drivers/mmc/core/block.c
+++ b/drivers/mmc/core/block.c
@@ -417,10 +417,17 @@ static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms,
unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms);
int err = 0;
u32 status;
+ bool busy;
do {
bool done = time_after(jiffies, timeout);
+ if (card->host->ops->card_busy) {
+ busy = card->host->ops->card_busy(card->host);
+ status = busy ? 0 : R1_READY_FOR_DATA | R1_STATE_TRAN << 9;
+ goto cb;
+ }
+
err = __mmc_send_status(card, &status, 5);
if (err) {
dev_err(mmc_dev(card->host),
@@ -442,6 +449,7 @@ static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms,
__func__, status);
return -ETIMEDOUT;
}
+cb:
} while (!mmc_ready_for_data(status));
return err;
--
2.7.4
Hyperstone GmbH | Line-Eid-Strasse 3 | 78467 Konstanz
Managing Directors: Dr. Jan Peter Berns.
Commercial register of local courts: Freiburg HRB381782
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH] mmc: block: Use .card_busy() to detect busy state in card_busy_detect
2021-06-08 6:28 ` Christian Löhle
@ 2021-06-08 6:58 ` Shawn Lin
2021-06-08 7:51 ` Christian Löhle
0 siblings, 1 reply; 10+ messages in thread
From: Shawn Lin @ 2021-06-08 6:58 UTC (permalink / raw)
To: Christian Löhle, Ulf Hansson; +Cc: shawn.lin, linux-mmc
Hi Christian
On 2021/6/8 14:28, Christian Löhle wrote:
> Hey Shawn,
> You're assuming a card not signalling busy indicates TRAN state, and set the state manually,
> but a card might not be pulling DAT lines in PROG state.
Refer to JESD84-B51 for emmc spec, section 6.5.13 clearly says that. And
SD spec V4 also has a similar statement in section 4.3.4.
So I guess if that was the case you point out, most of all operations in
mmc_ops.c would suffer from this.
> I will send a patch later that reworks card_busy_detect, as there are some issues
> with some command sequences in practice. I'd ask to wait with the patch until then.
>
> Regards,
> Christian
>
>
> From: Shawn Lin <shawn.lin@rock-chips.com>
> Sent: Monday, June 7, 2021 11:18 AM
> To: Ulf Hansson <ulf.hansson@linaro.org>
> Cc: linux-mmc@vger.kernel.org <linux-mmc@vger.kernel.org>; Shawn Lin <shawn.lin@rock-chips.com>
> Subject: [PATCH] mmc: block: Use .card_busy() to detect busy state in card_busy_detect
>
> No need to send CMD13 if host driver supports .card_busy().
>
> Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
> ---
>
> drivers/mmc/core/block.c | 8 ++++++++
> 1 file changed, 8 insertions(+)
>
> diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
> index 88f4c215..23623a9 100644
> --- a/drivers/mmc/core/block.c
> +++ b/drivers/mmc/core/block.c
> @@ -417,10 +417,17 @@ static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms,
> unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms);
> int err = 0;
> u32 status;
> + bool busy;
>
> do {
> bool done = time_after(jiffies, timeout);
>
> + if (card->host->ops->card_busy) {
> + busy = card->host->ops->card_busy(card->host);
> + status = busy ? 0 : R1_READY_FOR_DATA | R1_STATE_TRAN << 9;
> + goto cb;
> + }
> +
> err = __mmc_send_status(card, &status, 5);
> if (err) {
> dev_err(mmc_dev(card->host),
> @@ -442,6 +449,7 @@ static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms,
> __func__, status);
> return -ETIMEDOUT;
> }
> +cb:
> } while (!mmc_ready_for_data(status));
>
> return err;
>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] mmc: block: Use .card_busy() to detect busy state in card_busy_detect
2021-06-08 6:58 ` Shawn Lin
@ 2021-06-08 7:51 ` Christian Löhle
0 siblings, 0 replies; 10+ messages in thread
From: Christian Löhle @ 2021-06-08 7:51 UTC (permalink / raw)
To: Shawn Lin, linux-mmc, ulf.hansson
From: Shawn Lin <shawn.lin@rock-chips.com>
Sent: Tuesday, June 8, 2021 8:58 AM
>>You're assuming a card not signalling busy indicates TRAN state, and
>>set the state manually, but a card might not be pulling DAT lines in PROG state
>>
>Refer to JESD84-B51 for emmc spec, section 6.5.13 clearly says that. And
>SD spec V4 also has a similar statement in section 4.3.4.
>
>So I guess if that was the case you point out, most of all operations in
>mmc_ops.c would suffer from this.
Im not sure what youre referring to as 6.5.13 is inside of 6.5 (no further subsections)
in JESD84-B51 and 4.3.4 in the SD spec is "4.3.4. Data Write"
The patch itself is fine, i just think that card_busy_detect should not actually
be a busy detect but rather a TRAN detect. I will send a patch now, but if anyone
wants to check this out, a full SDSC card that receives CMD16->CMD42 Lock -> CMD42 Force Erase
-> CMD16 (Reset to 512) -> Read like CMD17 will hit this race condition
pretty consistently as the CMD42 Force Erase will be in PROG for a while on
most cards. If the commands are sent through ioctl in a batch that is.
If card_busy_detect is changed to card_tran_detect then using .card_busy no
longer makes sense.
Regards,
Christian
Hyperstone GmbH | Line-Eid-Strasse 3 | 78467 Konstanz
Managing Directors: Dr. Jan Peter Berns.
Commercial register of local courts: Freiburg HRB381782
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2021-06-08 7:51 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-07 9:18 [PATCH] mmc: block: Use .card_busy() to detect busy state in card_busy_detect Shawn Lin
2021-06-07 13:28 ` kernel test robot
2021-06-07 13:28 ` kernel test robot
2021-06-07 14:03 ` kernel test robot
2021-06-07 14:03 ` kernel test robot
2021-06-07 14:28 ` kernel test robot
2021-06-07 14:28 ` kernel test robot
2021-06-08 6:28 ` Christian Löhle
2021-06-08 6:58 ` Shawn Lin
2021-06-08 7:51 ` Christian Löhle
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.