Сброс контроллера MMC без физического извлечения карты?

9

Я пытаюсь спасти данные с SDHC-карты с помощью ddrescue:

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

Контроллер, я не уверен, является ли он на карте или на моем ноутбуке, похоже, возвращает ошибки для всех секторов (которые отображаются в системном журнале) после того, как определенное количество поврежденных секторов было прочитано (которые не не показывается в системном журнале), я обнаружил, что выталкивание карты в слот снова сбрасывает это и сообщает о хороших секторах как о хороших, пока не будет прочитано слишком много плохих секторов, и так далее.

В настоящее время я использую этот цикл, следя за выводом статуса ddrescue, сбрасывая карту вручную. Есть ли способ перезагрузить контроллер без извлечения карты, чтобы процесс восстановления мог выполняться без присмотра?

Может быть, это связано, но в этом ноутбуке Dell, чтобы читатель даже заметил, что карта вставлена, это нужно сделать во время загрузки или использования 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
паскаль
источник

Ответы:

4

У меня была такая же проблема (ошибки ввода-вывода, как показано выше) после замены SD-карт на лету во встроенном устройстве (Kobo eBook Reader). Он не будет обнаруживать новую карту, ее емкость и т. Д. И вместо этого будет ожидать, что старая карта все еще будет присутствовать.

Перезагрузка модуля была невозможна, поскольку драйвер был встроенным. device/deleteили host/scanбыл недоступен. Установка «съемного» параметра модуля не заставила его работать.

Решение в моем случае состояло в том unbind, чтобы , а впоследствии bind, в драйвере для блочного устройства MMC.

# 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), это не затрагивается.

frostschutz
источник
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должно показать, что устройство переоткрыто.

Ссылки

SLM
источник