Réinitialisation du contrôleur MMC sans retirer physiquement la carte?

9

J'essaie de récupérer des données d'une carte SDHC en utilisant ddrescue:

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

Le contrôleur, je ne sais pas si c'est celui de la carte ou celui de mon ordinateur portable, semble renvoyer des erreurs pour tous les secteurs (qui apparaît dans syslog) après qu'un certain nombre de secteurs défectueux ont été lus (qui ne ' t apparaît dans syslog), j'ai trouvé que le fait de sortir la carte et de la réinstaller réinitialise cela et signale les bons secteurs comme bons jusqu'à ce que trop de mauvais secteurs aient été lus, et ainsi de suite.

Actuellement, j'utilise cette boucle, en gardant un œil sur la sortie d'état de ddrescue, en réinitialisant la carte manuellement. Existe-t-il un moyen de réinitialiser le contrôleur sans retirer la carte, afin que le processus de sauvetage puisse s'exécuter sans surveillance?

Peut-être que cela est lié, mais dans cet ordinateur portable Dell, pour que le lecteur remarque même qu'une carte a été insérée, cela doit être fait lors du démarrage ou de l'utilisation echo 1 > /sys/bus/pci/rescan, mais une seule fois, après que le périphérique PCI du lecteur apparaît, et tout fonctionne comme prévu:

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

Journal système pertinent:

# 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

J'ai également essayé d'utiliser un lecteur de carte USB, au lieu de générer ces erreurs dans syslog, il disparaît simplement et doit être rebranché pour continuer.


Il semble que le rechargement du sdhci_pcimodule fasse l'affaire, mais je me demande s'il existe une option moins brutale pour ce faire:

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

Réponses:

4

J'ai eu le même problème (erreurs d'E / S comme indiqué ci-dessus) après avoir changé les cartes SD à la volée dans un appareil intégré (Kobo eBook Reader). Il ne détecterait pas la nouvelle carte, sa capacité, etc. et s'attendrait plutôt à ce que l'ancienne carte soit toujours présente.

Le rechargement d'un module n'a pas été possible car le pilote était intégré. device/deleteou host/scann'était pas disponible. La définition d'un paramètre de module "amovible" ne l'a pas fait fonctionner.

La solution dans mon cas était unbind, et par la suite bind, le pilote du périphérique de bloc 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

La bonne chose est que cela n'affecte que le périphérique qui vous intéresse. S'il y a une autre carte dans la fente externe (même pilote, /dev/mmcblk1) elle n'est pas affectée.

frostschutz
la source
2

Vous pouvez essayer de réinitialiser un périphérique SATA en procédant comme suit:

En supposant que le dispositif est nommé: /dev/mmcblk0p1.

  1. Découvrez à quel contrôleur l'appareil est connecté (nous en aurons besoin plus tard):

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

    REMARQUE: La partie intéressante si la réponse est host1, qui identifie le contrôleur.

  2. Déconnectez l'appareil

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

    REMARQUE: cela supprimera le périphérique du bus (logiquement). Cherchez la dmesgconfirmation.

  3. Nouvelle analyse du contrôleur

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

    REMARQUE: host1 est l'identifiant de la première étape. Encore une fois, dmesgdevrait montrer que l'appareil est redécouvert.

Références

slm
la source