¿Restablecer el controlador MMC sin quitar físicamente la tarjeta?

9

Estoy tratando de rescatar datos de una tarjeta SDHC usando ddrescue:

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

El controlador, no estoy seguro de si es el de la tarjeta o el de mi computadora portátil, parece devolver errores para todos los sectores (que aparece en syslog) después de que se haya leído un cierto número de sectores defectuosos (que no no aparece en el registro del sistema), descubrí que al volver a colocar la tarjeta en la ranura se restablece esto e informa que los sectores buenos son buenos nuevamente hasta que se hayan leído demasiados sectores defectuosos, y así sucesivamente.

Actualmente estoy usando este bucle, vigilando la salida de estado de ddrescue, restableciendo la tarjeta manualmente. ¿Hay alguna manera de restablecer el controlador sin quitar la tarjeta, para que el proceso de rescate pueda ejecutarse sin supervisión?

Tal vez esto esté relacionado, pero en esta computadora portátil Dell, para que el lector note que se ha insertado una tarjeta, debe hacerse durante el arranque o el uso echo 1 > /sys/bus/pci/rescan, pero solo una vez, después de eso, aparece el dispositivo PCI del lector y todo funciona como se esperaba:

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

Syslog relevante:

# 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

También intenté usar un lector de tarjetas USB, en lugar de generar estos errores en syslog, simplemente desaparece y necesita volver a enchufarlo para continuar.


Parece que recargar el sdhci_pcimódulo hace el truco, pero me pregunto si hay una opción menos de fuerza bruta para hacer esto:

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

Respuestas:

4

Tuve el mismo problema (errores de E / S como se muestra arriba) después de cambiar las tarjetas SD sobre la marcha en un dispositivo incorporado (Kobo eBook Reader). No detectaría la nueva tarjeta, su capacidad, etc., y esperaría que la tarjeta anterior aún estuviera presente.

No fue posible recargar un módulo ya que el controlador estaba incorporado. device/deleteo host/scanno estaba disponible. Establecer un parámetro de módulo "extraíble" no lo hizo funcionar.

La solución en mi caso fue unbind, y posteriormente bind, el controlador para el dispositivo de bloque 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

Lo bueno es que esto solo afecta el dispositivo que le interesa. Si hay otra tarjeta en la ranura externa (mismo controlador /dev/mmcblk1) , no se ve afectada.

Frostschutz
fuente
2

Puede intentar restablecer un dispositivo SATA mediante los siguientes pasos:

Suponiendo que el dispositivo se denomina: /dev/mmcblk0p1.

  1. Averigüe a qué controlador está conectado el dispositivo (lo necesitaremos más adelante):

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

    NOTA: La parte interesante si la respuesta es host1, que identifica el controlador.

  2. Desconectar el dispositivo

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

    NOTA: Esto eliminará el dispositivo del bus (lógicamente). Busca dmesgconfirmación.

  3. Vuelva a escanear el controlador

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

    NOTA: host1 es el identificador del paso uno. Nuevamente, dmesgdebería mostrar el dispositivo que se está redescubriendo.

Referencias

slm
fuente