web-dev-qa-db-ja.com

カードを物理的に取り外さずにMMCコントローラをリセットしますか?

Ddrescueを使用してSDHCカードからデータをレスキューしようとしています:

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

コントローラーは、カード上のものか、ラップトップ内のものかはわかりませんが、特定の数の不良セクターが読み取られた後(syslogに表示される)、すべてのセクターでエラーが返されるようです(これはSyslogに表示されます)、カードを取り出してスロットに再度入れると、これがリセットされ、読み取られた不良セクターが多すぎるまで、正常なセクターが再び良好であることが報告されます。

現在、私はこのループを使用しており、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

関連するsyslog:

# 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

私はまた、syslogでこれらのエラーを生成する代わりに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
9
pascal

組み込みデバイス(Kobo eBook Reader)でオンザフライでSDカードを変更した後、同じ問題(上記のI/Oエラー)が発生しました。新しいカードやその容量などを検出せず、代わりに古いカードがまだ存在することを期待します。

ドライバーが組み込まれているため、モジュールを再ロードできませんでした。 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)影響を受けません。

4
frostschutz

次の手順で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は、手順1の識別子です。繰り返しますが、dmesgには、再検出されているデバイスが表示されます。

参考文献

2
slm