在不物理移除卡的情况下重置 MMC 控制器?

在不物理移除卡的情况下重置 MMC 控制器?

我正在尝试使用 ddrescue 从 SDHC 卡中拯救数据:

while true ; do ddrescue -d /dev/mmcblk0p1 mmc.img mmc.log ; done

控制器,我不确定它是卡上的控制器还是我的笔记本电脑中的控制器,在读取一定数量的坏扇区后(这不会在系统日志中显示),似乎会返回所有扇区的错误(这会显示在系统日志中) t 显示在系统日志中),我发现将卡弹出并再次插入插槽会重置此设置,并再次将好扇区报告为好扇区,直到读取了太多坏扇区,依此类推。

目前我正在使用这个循环,密切关注 ddrescue 的状态输出,手动重置卡。有没有办法在不移除卡的情况下重置控制器,以便救援过程可以在无人值守的情况下运行?

也许这是相关的,但在这台戴尔笔记本电脑中,为了让读卡器注意到卡已插入,必须在启动或使用期间完成echo 1 > /sys/bus/pci/rescan,但只有一次,之后读卡器 PCI 设备出现,一切都按预期工作:

07:00.0 System peripheral: JMicron Technology Corp. SD/MMC Host Controller (rev 30)
        Subsystem: Dell Device 046e
        Flags: bus master, fast devsel, latency 0, IRQ 16
        Memory at f0600000 (32-bit, non-prefetchable) [size=256]
        Capabilities: [a4] Power Management version 3
        Capabilities: [80] Express Endpoint, MSI 00
        Capabilities: [94] MSI: Enable- Count=1/1 Maskable- 64bit-
        Kernel driver in use: sdhci-pci

相关系统日志:

# pop in card
mmc0: new SDHC card at address b368
mmcblk0: mmc0:b368 NCard 15.0 GiB (ro)
mmcblk0: p1
# ddrescue begins to read, error count increases, until at some point:
mmcblk0: error -110 transferring data, sector 12854624, nr 1, cmd response 0x900, card status 0x0
end_request: I/O error, dev mmcblk0, sector 12854624
mmcblk0: error -110 transferring data, sector 12854625, nr 1, cmd response 0x900, card status 0x0
end_request: I/O error, dev mmcblk0, sector 12854625
mmcblk0: error -110 transferring data, sector 12854626, nr 1, cmd response 0x900, card status 0x0
end_request: I/O error, dev mmcblk0, sector 12854626
mmcblk0: error -110 transferring data, sector 12854627, nr 1, cmd response 0x900, card status 0x0
end_request: I/O error, dev mmcblk0, sector 12854627
mmcblk0: error -110 transferring data, sector 12854628, nr 1, cmd response 0x900, card status 0x0
end_request: I/O error, dev mmcblk0, sector 12854628
# time since last successful read increases, pop out card
mmc0: Card removed during transfer!
mmc0: Resetting controller.
mmcblk0: error -123 sending status command, retrying
mmcblk0: error -123 sending status command, retrying
mmcblk0: error -123 sending status command, aborting
mmc0: card b368 removed
# GOTO 10

我还尝试使用 USB 读卡器,而不是在系统日志中生成这些错误,它只是消失并且需要重新插入才能继续。


看来重新加载sdhci_pci模块可以解决问题,但我想知道是否有一个不那么暴力的选项可以做到这一点:

while sleep 1 ; do
    ddrescue -d -T 1 /dev/mmcblk0p1 mmc.img mmc.log 
    modprobe -r sdhci_pci
    modprobe sdhci_pci
done

答案1

在嵌入式设备(Kobo 电子书阅读器)中动态更改 SD 卡后,我遇到了同样的问题(如上所示的 I/O 错误)。它不会检测新卡及其容量等,而是期望旧卡仍然存在。

由于驱动程序是内置的,因此无法重新加载模块。device/deletehost/scan不可用。设置“可移动”模块参数并不能使其工作。

我的案例的解决方案是unbind,然后是bindMMC 块设备的驱动程序。

# blockdev --getsize64 /dev/mmcblk0
3965190144
# readlink /sys/block/mmcblk0
../devices/platform/mxsdhci.2/mmc_host/mmc0/mmc0:af9e/block/mmcblk0
# echo mxsdhci.2 > /sys/bus/platform/drivers/mxsdhci/unbind
~~~ change card ~~~
# echo mxsdhci.2 > /sys/bus/platform/drivers/mxsdhci/bind
# blockdev --getsize64 /dev/mmcblk0
8168931328

好处是这只会影响您感兴趣的设备。如果外部插槽中有另一张卡(相同的驱动程序/dev/mmcblk1),则不会受到影响。

答案2

您可以尝试使用以下步骤重置 SATA 设备:

假设设备名称为:/dev/mmcblk0p1

  1. 找出设备连接到哪个控制器(稍后我们将需要它):

    $ readlink /sys/block/mmcblk0p1
     ../devices/pci0000:00/0000:00:1f.2/host1/target1:0:0/1:0:0:0/block/mmcblk0p1
    

    笔记:有趣的部分是,如果答案是 host1,它标识控制器。

  2. 断开设备连接

    $ echo 1 > /sys/block/mmcblk0p1/device/delete
    

    笔记:这将从总线上删除设备(逻辑上)。进去dmesg确认一下。

  3. 重新扫描控制器

    $ echo "- - -" > /sys/class/scsi_host/host1/scan
    

    笔记:host1 是第一步中的标识符。再次,dmesg应该显示设备被重新发现。

参考

相关内容