[Gentoo Linux] Sony VAIO Pro 13 SD 讀卡機設定

症狀

話說在 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 來當設定檔不是就是最簡單的確認方法嗎?這樣不管是我少編了模組,或少開了什麼設定都可以解決啊……結果我前面還繞了一堆遠路……=_=

回響