Skip to content

Commit e7b4276

Browse files
shawn1221storulf
authored andcommitted
mmc: block: cast a informative log for no devidx available
The intention for this patch is to help folks debug the failure like this: dwmmc_rockchip fe320000.dwmmc: IDMAC supports 32-bit address mode. dwmmc_rockchip fe320000.dwmmc: Using internal DMA controller. dwmmc_rockchip fe320000.dwmmc: Version ID is 270a dwmmc_rockchip fe320000.dwmmc: DW MMC controller at irq 28,32 bit host data width,256 deep fifo dwmmc_rockchip fe320000.dwmmc: Got CD GPIO mmc_host mmc0: Bus speed (slot 0) = 400000Hz (slot req 400000Hz, actual 400000HZ div = 0) mmc_host mmc0: Bus speed (slot 0) = 50000000Hz (slot req 50000000Hz, actual 50000000HZ div = 0) mmc0: new high speed SDHC card at address 0007 mmcblk: probe of mmc0:0007 failed with error -28 The reason may be some buggy userspace daemon miss the disk remove uevent sometimes so it would finally make the SD card not work. So from the dmesg it only shows a errno of -28 but still don't understand what happened. For quick reproduce this, we could set max_devices to 8 and run for i in $(seq 1 9); do echo "========================" $i echo fe320000.dwmmc > /sys/bus/platform/drivers/dwmmc_rockchip/unbind sleep .5 echo fe320000.dwmmc > /sys/bus/platform/drivers/dwmmc_rockchip/bind sleep .5 mount -t vfat /dev/mmcblk0 /mnt sleep .5 done Another possible reason would be the device has more partitions than what we support, so that they have to increase their max_devices. Signed-off-by: Shawn Lin <[email protected]> Signed-off-by: Ulf Hansson <[email protected]>
1 parent 83a7b32 commit e7b4276

File tree

1 file changed

+13
-1
lines changed

1 file changed

+13
-1
lines changed

drivers/mmc/core/block.c

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2034,8 +2034,20 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card,
20342034
int devidx, ret;
20352035

20362036
devidx = ida_simple_get(&mmc_blk_ida, 0, max_devices, GFP_KERNEL);
2037-
if (devidx < 0)
2037+
if (devidx < 0) {
2038+
/*
2039+
* We get -ENOSPC because there are no more any available
2040+
* devidx. The reason may be that, either userspace haven't yet
2041+
* unmounted the partitions, which postpones mmc_blk_release()
2042+
* from being called, or the device has more partitions than
2043+
* what we support.
2044+
*/
2045+
if (devidx == -ENOSPC)
2046+
dev_err(mmc_dev(card->host),
2047+
"no more device IDs available\n");
2048+
20382049
return ERR_PTR(devidx);
2050+
}
20392051

20402052
md = kzalloc(sizeof(struct mmc_blk_data), GFP_KERNEL);
20412053
if (!md) {

0 commit comments

Comments
 (0)