Redefinindo o controlador MMC sem remover fisicamente o cartão?

8

Estou tentando resgatar dados de um cartão SDHC usando o ddrescue:

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

O controlador, não tenho certeza se é o que está no cartão ou no meu laptop, parece retornar erros para todos os setores (que aparecem no syslog) depois que um certo número de setores defeituosos foi lido ( que não aparecem no syslog), descobri que recolocar o cartão no slot novamente redefine isso e informa bons setores novamente até que muitos setores defeituosos tenham sido lidos, e assim por diante.

Atualmente estou usando este loop, mantendo um olho na saída de status do ddrescue, redefinindo o cartão manualmente. Existe uma maneira de redefinir o controlador sem remover a placa, para que o processo de resgate possa ser executado sem supervisão?

Talvez isso esteja relacionado, mas neste laptop da Dell, para o leitor notar que um cartão foi inserido, ele deve ser feito durante a inicialização ou usando echo 1 > /sys/bus/pci/rescan , mas apenas uma vez, depois disso o dispositivo PCI da leitora aparece e tudo funciona como esperado:

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

Eu também tentei usar um leitor de cartão USB, em vez de gerar esses erros no syslog, ele simplesmente desaparece e precisa ser plugado novamente para continuar.

Parece que recarregar o módulo sdhci_pci faz o truque, mas me pergunto se há uma opção de força bruta menor para fazer isso:

while sleep 1 ; do
    ddrescue -d -T 1 /dev/mmcblk0p1 mmc.img mmc.log 
    modprobe -r sdhci_pci
    modprobe sdhci_pci
done
    
por pascal 03.09.2013 / 04:59

2 respostas

4

Eu tive o mesmo problema (erros de E / S como mostrado acima) depois de trocar cartões SD rapidamente em um dispositivo incorporado (Kobo eBook Reader). Ele não detectaria o novo cartão, sua capacidade e assim por diante e, em vez disso, esperaria que o cartão antigo ainda estivesse presente.

O recarregamento de um módulo não foi possível desde que o driver foi incorporado. device/delete ou host/scan não estava disponível. Definir um parâmetro de módulo "removível" não fez com que funcionasse.

A solução no meu caso foi para unbind e, posteriormente, bind , o driver para o dispositivo de bloco 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

O interessante é que isso afeta apenas o dispositivo em que você está interessado. Se houver outro cartão no slot externo (mesmo driver, /dev/mmcblk1 ) ele não será afetado.

    
por 09.06.2015 / 12:39
2

Você pode tentar redefinir um dispositivo SATA usando as seguintes etapas:

Supondo que o dispositivo tenha o nome: /dev/mmcblk0p1 .

  1. Descubra em qual controlador o dispositivo está conectado (precisaremos disso mais tarde):

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

    NOTA: A parte interessante se a resposta for host1, que identifica o controlador.

  2. Desconecte o dispositivo

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

    NOTA: Isso removerá o dispositivo do barramento (logicamente). Procure em dmesg para confirmação.

  3. Reexaminar o controlador

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

    NOTA: host1 é o identificador da etapa um. Novamente, dmesg deve mostrar o dispositivo que está sendo redescoberto.

Referências

por 03.09.2013 / 14:02