症狀
話說在 Sony VAIO Pro 13 上跑 Gentoo Linux 有一陣子了,基本上硬體都可以正常工作,只有 SD 讀卡機有著奇怪的症頭--只有在開機的時候有 SD 卡在讀卡機裡面的時才,Linux 才會正確抓到讀卡機。
如果開機的時候讀卡機沒有卡片,等到開機後才把 SD 卡插到讀卡機的話,卡片不會被正確地偵測到。
因為我不常使用讀卡機,所以一直沒有去理他,不過趁著這次重新轉到 UEFI 的機會,決定順便解決這個問題。
解法
繞了許多冤枉路後才發現,原來是我在編 Kernel 的時候,沒有把 PCI-E 的熱插拔功能給編進去,所以卡片一定要在開機的時候就插進去。
要解決這個問題的話,只要把下面三個選項設定好就可以了:
CONFIG_HOTPLUG_PCI_PCIE=y
CONFIG_HOTPLUG_PCI=y
CONFIG_HOTPLUG_PCI_ACPI=y
如果是使用 menuconfig 來設定的話,這個設定在 Bus options (PCI etc,) 裡:
│ │ PCI host controller drivers ---- │ │
│ │ < > PCCard (PCMCIA/CardBus) support ---- │ │
│ │ [*] Support for PCI Hotplug ---> │ │
│ │ < > RapidIO support │ │
把 Support for PCI Hotplug 打鉤後,再往上捲把 PCI Express Hotplug driver 打鉤:
│ │ [*] PCI support │ │
│ │ [*] Support mmconfig PCI config space access │ │
│ │ [*] PCI Express Port Bus support │ │
│ │ [*] PCI Express Hotplug driver │ │
│ │ [*] Root Port Advanced Error Reporting support │ │
最後再進到 Support for PCI Hotplug 裡面把 ACPI PCI Hotplug driver 打鉤:
│ │ --- Support for PCI Hotplug │ │
│ │ [*] ACPI PCI Hotplug driver │ │
│ │ < > ACPI PCI Hotplug driver IBM extensions │ │
│ │ [ ] CompactPCI Hotplug driver │ │
│ │ < > SHPC PCI Hotplug driver │ │
之後重新編譯核心後,SD 讀卡機就可以正常工作囉!
找出問題的經過
說真的,這次解這個問題不是很順利,弄了兩三天才搞好,最後發現繞了許多冤枉路,就在這裡記一下警愓自己好了,明明解法就應該很簡單直覺的啊!
由於一開始就有注意到讀卡機在 SystemRescueCD 和 ArchLinux 的 LiveCD 裡是可以正常功作的,把 SD 卡放進讀卡機後 dmesg 都會出現,所以可以確定 Linux 是有支援這個讀卡機的。
而既然是硬體的問題,所以我第一個有想到是 Kernel 的問題,有可能有一些驅動模組沒有讀到,所以我交插比對了 SystemRescueCD / ArchLinux 和我的 Gentoo 上的核心模組,特別是在 SystemRescueCD 上插上 SD 卡後才在 lsmod 出現的那些模組。
不過比對後發現,SystemRescueCD 上有的那些模組我都有編進來,而且如果開機的時候就插著卡片,這些模組也會被正確地偵測到並且讀進系統中。
後來到 Gentoo 討論區上問了一下這個狀況,有人提出了一些可能性,但不幸的是還是沒有解決。
這個時候我開始懷疑不只是缺少驅動模組的問題而已,而是我的 Kernel 有什麼地方根本設錯了,所以我就想那乾脆不要用自己設定的 Kernel,改用 Gentoo 提供的 Genkernel 這個自動設定的系統吧--不幸的,弄完之後開不了機,因為 Genkernel 沒開 EFI_STUB,所以沒辦法用我現在用的 rEFInd 來開機。
成功把 EFI_STUB 設定之後終於可以開機,但是讀卡機還是沒辦法正常工作,而由於 Genkernel 把很多我根本用不到的模組都編譯進來了,所以我浪費了幾個小時在重新編這兩次核心,但實際上什麼做用都沒有……orz.
最後我才想到,如果真的是 Kernel 的問題,而 SystemRescueCD 開機後讀卡機可以正常工作,那我直接照搬 SystemResuceCD 開機後的 /proc/config.gz 到我的系統上應該是可以解決的吧?!
果然,這次直接用 LiveCD 上的 /proc/config.gz 來做為核心的設定,讀卡機就正常了,由於系統其他元件都沒有動,所以現在已經可以確認是 Kernel 設定的問題,已經把可能出問題的地方確定了。
既然知道是 Kernel 設定的問題,那現在就簡單了,用 diff -y 來比較 SystemRescueCD 和我的設定,然後找出可疑的地方--嗯,這個 HOTPLUGˍPCI_PCIE 的東西好像很可疑,用我的設定檔 make menuconfig 一下,這東西果然沒出現在選單上。
觀察了一下 Help 視窗的說明後,把這東西的相依的 HOTPLUG_PCI 打開,並且也順便把 LiveCD 上有開的 HOTPLUG_PCI_ACPI 打開,重編核心!
嘿!成功啦!所以確定就是只要把這三項打開就解決啦!
後來想一想,真是有夠笨的,一開始就懷疑是 Kernel 的問題的話,直接拉可以動的系統下的 /proc/config.gz 來當設定檔不是就是最簡單的確認方法嗎?這樣不管是我少編了模組,或少開了什麼設定都可以解決啊……結果我前面還繞了一堆遠路……=_=
回響