2008年2月16日 星期六

解決 Atheros AR5007EG driver 和 bus numbers 不正確的問題

Standard
買新的 Laptop 本該是快樂的,但為了讓新電腦能夠好好的跑 Linux ,卻讓我睡不好覺好幾天,一點快樂的心情都沒有!

在抗戰了整整一個星期,挖遍了 madwifi.org 每個角落,請 google 大神解答了無數個問題後,終於成功的使我新買 Laptop -『 Toshiba Satellite L40 PSL48T-00K00J 』的 Wireless 動起來了!宣告戰勝的心情真是難以言喻! :P

扣除掉 Wireless,這台機器對 Linux 的支援度非常好,所有 Device 都能很順利的跑起來。由於顯示晶片是 Intel 965 ,Compiz 3D Desktop 不必特別設定就能順利的運作,3D 特效的效能也相當令人滿意﹝不能跑3D桌面我就不買了﹞。最重要的是整台機器只需要 2 萬元不到,實在是非常划算,對於預算不高的我,可以不必花大錢就足以應付 coding 、 presentation 、 炫麗的視覺效果等需求,有一分錢都沒浪費的感覺。﹝有些電腦就不知道在貴什麼了,令人想不透!﹞

因為目前的 Linux 並不支援這機器的 Wireless chipset -『 Atheros AR5007EG 』(與 EeePC 同系列的晶片),必須使用 Atheros 公司 patch 後的 madwifi driver 才能驅動 Wireless,這是比較麻煩的地方。﹝該 patch 並未 opensource 給 madwifi team,導致 madwifi team 不能接受此 patch,因此近期要看見 madwifi 正式支援 AR5007EG,恐怕是很困難的一件事﹞

關於該 patch 的取得和其詳細討論可在這找到:

http://madwifi.org/ticket/1679


But, 別高興太早,如果是這麼簡單,我也不必奮戰一整個星期了。

如果你的 NB 在 patch driver 後就能使 AR5007EG chipset 正常啟動,非常恭喜你。但是,如果你跟我一樣是
『 Toshiba Satellite L40 PSL48T-00K00J 』這台機器,你應該會發現你的 wireless 還是不會動才對。:(

原本以為是驅動程式的問題,但經過多天的更換 madwifi driver 或使用 ndiswrapper 都無法搞定,甚至還瘋狂的將 madwifi 的 HAL 整個反組譯看個究竟。直到最後要放棄時才發現,某些 Laptop 的 BIOS 會令 kernel 無法正確指定『 PCI/cardbus bridge secondary/subordinate bus number 』,所以 kernel 無法控制位於那些 bridge 上的裝置。要解決這問題,你可以在電腦啟動時加入 "pci=assign-busses" boot option。

經查過一些資料後,發現此 option 是在 Linux kernel 2.6.13.3 時被加入的,其原 kernel patch 說明如下:

In some cases, especially on modern laptops with a lot of PCI and
cardbus bridges, we're unable to assign correct secondary/subordinate
bus numbers to all cardbus bridges due to BIOS limitations unless
we are using "pci=assign-busses" boot option.
So some cardbus controllers may not have attached subordinate pci_bus
structure, and yenta driver must cope with it - just ignore such cardbus
bridges.


加入 boot option 再重新開機後,我新買的 Toshiba Satellite L40 PSL48T-00K00J 就可以順利的連接無線網路了。﹝笑﹞

註:由於
assign bus number 的問題可能發生在任何裝置上,要是你確定 NB 上的 Sound、Ethernet 等晶片或裝置 Linux 都有支援,可是卻無法正確運作,也請試試用本文的方法解決看看。

後記

Wireless 不動,誰也想
到是 bus number 錯誤惹的禍。這種底層 IO 通道指定錯誤的問題,雖曾在過去 Window 95/98 年代發生過,但今天恐怕不會有什麼人會相信它再次發生了,尤其還是發生在『企鵝』身上。

另外,多謝『 Kiss of Death 』這部老電影,提醒了我該注意更底層會忽略的事,臥底往往比看得見的敵人來得有威脅性多了,時時謹慎對他人搜身可以保證『邪惡』的事不被曝光洩露。看完這部電影,當下我就決定從 BIOS 和 kernel 的部份著手,沒想到不到半小時就搞定了一個星期無法解決的問題 XD