Menyetel ulang pengontrol MMC tanpa mengeluarkan kartu secara fisik?

9

Saya mencoba menyelamatkan data dari kartu SDHC menggunakan ddrescue:

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

Pengontrolnya, saya tidak yakin apakah itu yang ada di kartu atau yang ada di laptop saya, sepertinya mengembalikan kesalahan untuk semua sektor (yang muncul di syslog) setelah sejumlah sektor buruk dibaca (yang tidak t muncul di syslog), saya menemukan bahwa mengeluarkan kartu dan masuk ke dalam slot kembali me-reset ini dan melaporkan sektor yang baik lagi sampai terlalu banyak sektor buruk telah dibaca, dan seterusnya.

Saat ini saya menggunakan loop ini, mengawasi keluaran status ddrescue, mengatur ulang kartu secara manual. Apakah ada cara untuk mereset controller tanpa mengeluarkan kartu, sehingga proses penyelamatan dapat berjalan tanpa pengawasan?

Mungkin ini terkait, tetapi di laptop Dell ini, agar pembaca memperhatikan bahwa kartu telah dimasukkan, harus dilakukan saat boot atau menggunakan echo 1 > /sys/bus/pci/rescan, tetapi hanya sekali, setelah itu pembaca perangkat PCI muncul, dan semuanya berfungsi seperti yang diharapkan:

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 yang relevan:

# 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

Saya juga mencoba menggunakan pembaca kartu USB, alih-alih menghasilkan kesalahan ini di syslog, itu hanya menghilang dan perlu dipasang kembali untuk melanjutkan.


Tampaknya memuat kembali sdhci_pcimodul melakukan trik, tapi saya ingin tahu apakah ada opsi kurang kasar untuk melakukan ini:

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

Jawaban:

4

Saya memiliki masalah yang sama (kesalahan I / O seperti yang ditunjukkan di atas) setelah mengubah SD-card on the fly di perangkat yang disematkan (Kobo eBook Reader). Itu tidak akan mendeteksi kartu baru, kapasitasnya, dan seterusnya dan sebaliknya mengharapkan kartu lama tetap ada.

Reload modul tidak dimungkinkan karena driver sudah terpasang. device/deleteatau host/scantidak tersedia. Pengaturan parameter modul "yang dapat dilepas" tidak membuatnya berfungsi.

Solusi dalam kasus saya adalah unbind, dan kemudian bind, driver untuk perangkat blok 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

Yang menyenangkan adalah ini hanya mempengaruhi perangkat yang Anda minati. Jika ada kartu lain di slot eksternal (driver yang sama, /dev/mmcblk1) itu tidak terpengaruh.

frostschutz
sumber
2

Anda dapat mencoba mengatur ulang perangkat SATA menggunakan langkah-langkah berikut:

Dengan asumsi perangkat bernama: /dev/mmcblk0p1.

  1. Cari tahu pengontrol yang terhubung dengan perangkat ini (kami akan membutuhkan ini nanti):

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

    CATATAN: Bagian yang menarik jika jawabannya adalah host1, yang mengidentifikasi controller.

  2. Putuskan sambungan perangkat

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

    CATATAN: Ini akan menghapus perangkat dari bus (secara logis). Cari dmesgkonfirmasi.

  3. Pindai ulang pengontrol

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

    CATATAN: host1 adalah pengidentifikasi dari langkah pertama. Sekali lagi, dmesgharus menunjukkan perangkat sedang ditemukan kembali.

Referensi

slm
sumber