2011年2月20日 星期日

2011-02-20 22:10 Farewell, FreeNAS!

話說最近「弄」來了一顆K7 XP 1700+ (還是號稱可超性高的Thoroughbred-B XD)以及512MB SDRAM,打算把穀倉大修一番......開始了與FreeNAS離別的序曲~

為了那兩樣「寶貝」(K7 1700+ / 512MB SDRAM),在網拍尋尋覓覓終於相中一張微星的KM2M--支援SDRAM、DDR SDRAM、All in one還是KM266等級當中條件比較好的。Perfect!就是它了!

一番折騰後、新穀倉開放啦~耶,怎麼跑不順? 寫入時SNMP Traffic Graph (STG)起伏很嚴重啊,雖然CPU loading明顯降低(由K6-2 500的70%甚至100%降到K7 1700+的30%以下!),但傳輸上並無明顯改善(其實原本最大的用意是藉由較快的CPU提升Freenas中RAR檔案檢驗速率、網路傳輸上沒期望多大幅度的提升、畢竟已經藉由兩台K7 / K8先行測試過可能的傳輸能力)。

回到熟悉的XP(另一個「升級好處」之一 -- 剛好手邊現有的K7 Ghost image能夠直接移轉到CF上,雖然是nForce2的image但HAL匹配上並無問題、也正常開機。PE先滾一邊去。)用HDtune測了起來......吼!太誇張了,兩台WD7500AACS同時跑竟然平均速率只剩下40MB/s不到,SATA成了USB 2.0!

(圖片來源失效orz)

老K6-2 MVP3C2也沒這麼扯 = =

當下上PCDVD論壇求救、經由熱心網友的指導,是VIA的PCI Latency bug!暈倒!!之前的升級研究完全沒碰到這塊(升上K7後用的都是nForce2,僅一小段時間用過KT600+VT8237,據稱VT8237是K7最後穩定的南橋--但對於VIA也為時已晚!


掛上VIA PCI Latency patch後,再次測試

(圖片來源失效orz)

GOOD!像樣多了。不過這僅限於Windows、FreeBSD的FreeNAS怎辦?又Google了各方關於Freebsd PCI Latency調試的方法、無解!(起碼不是我能理解的 = =" 知道使用PCICONF設置但不知從和下手)好像用FreeBSD的都沒使用VT82C686到VT8235一系列的VIA南橋晶片、或者只有我碰上如此問題?


失望之餘想起先前一位網友關於他的NAS計畫--他決定採用XP而不用FreeNAS......XP當NAS?!XP這玩藝既笨重又遲緩,沒搞錯吧!但想想現成的使用經驗、似乎也沒那麼糟(CF上XP開機還蠻快的!反正只是當個NAS也不需裝太多拖負載的軟體),再說其實就只是當個個人農莊、檔案櫃,也沒特別需要,網芳即可、頂多再裝個FilezillaServer弄出個FTP就成了,另外NTFS也比UFS對於磁碟的使用空間大(但UFS的說法是耗用的空間包含安全設置、效能調整之用 -- 一顆750GB實際僅可用不到700GB,為此UFS又將近耗用20G!)好吧,趁兩顆HD半滿之際先進入FreeNAS將其中之一的檔案以cp指令複製到另一顆好進行移轉測試......


耶?!Input/Ouput Error?見鬼了,怎麼回事?檔案才copy不到1%啊!再cp一次,一樣error!心底念頭一閃--肯定是該死的VIA PCI Latency bug!暫時移轉回K6-2,經過一晚的運作終於順利移轉近300GB的檔案(EP-MVP3C2的南橋VT82C596B,這也是VIA沒PCI Latency問題的VT8237上市前,最後一個穩定的南橋--進入K7起VT82C686、VT8231、VT8233、VT8235,VIA大半的K7/P4南橋都這麼完了!)。這下更是徹底絕望!

 

一定有人會懷疑為了一套不值2000的K7、值得這麼幹嗎?大不了再換張主機板、甚至回頭用K6-2!不過說實話,除了以上的問題,近二個月的FreeNAS使用經驗並非如此愉快:

1.WD7500AACS上線的當下,測試省電管理,出現DMA48 error、死機!FreeNAS的硬碟電源管理失敗~(當然已經關閉SMARTD。硬體相容問題也是難以由模擬環境預先探知的。


2.FreeBSD的RAR並不「好用」--對於我這種已經被XP GUI麻痺的懶鬼、再回去用CLI?何況command shell下所有DBCS都成了亂碼,就算檢測出哪個檔案有問題也不知道!也無法輕易的圈選要測試檔案(當然這樣的責難並不公平 -- 哪套NAS能夠讓用戶進行檔案檢查的?不過就是有這樣的需要、才會選擇彈性較大的FreeNAS)。


3.FreeNAS/FreeBSD的可用資源太少--起碼對於不懂寫程式、還是個中文用戶,像上述的PCI Latency問題就不知從何下手(wait!那是VIA的問題、怎麼不怪VIA?當然怪VIA!不過他們往後也出不了啥晶片組、也不會再買他家的產品,這樣的「責難」夠狠了吧?


4.我就是習慣Windows GUI。沒辦法、用好幾年了,要是慢慢把玩FreeBSD也許另一個兩年後我會愛上它。不過我的NAS趕著上線啊 = = 再說為了一套家用NAS得學習一套OS也太......


5.有人認為FreeNAS的檔案權限管理不夠--但對我這種個人用戶而言又太複雜。先前的測試經驗發現兩個帳戶所儲存的檔案無法相互管理。當然是基於多人使用的安全性。但萬一系統重建喪失帳號備份資料的情況下,還得以root身份重新設置權限。對於個人用戶麻煩透了!(當然可設置匿名存取,但也喪失安全性)對於定期妥善備份設定的使用者而言、帳號管理並不會造成任何問題。


好了、FreeNAS落幕了,短暫而燦爛、讓停機三年的K6-2再次發光發熱二個月後終於停歇了。不止FreeNAS,經由這次體驗同時也決定讓K6-2徹底「除役」了(另一張T2P4在測試時也發現早已蒙主寵召--感謝這兩個老傢伙前後伴隨我幾個寒暑。


終於知道為何M$會搞出Windows Home Server這種東西、即便存在檔案損壞的風險還是有人用= =


最 後、對於VIA、那種不問蒼生問鬼神的經營者,讓下頭一路搞出瑕疵產品不思修正連續蒙混、還得讓外人幫他出patch、最後扔了市場,讓公司走到今天的地 步完全是咎由自取!不是不支持國貨,但這種宗教迷信經營者所塑造出的企業、搞出的產品,別碰為妙!!否則就等著一起喊「天靈靈、地靈靈,求求上帝幫幫 我」!


補充:其實FreeNAS對於習慣以網芳傳檔的使用者也算是不錯的NAS--CIFS(Windows網芳連線)提供Recycle Bin(資源回收桶)的功能。一般由網芳/網路磁碟機不慎刪除檔案得用3rd party工具救回,但FreeNAS本身提供資源回收桶的功能算是個貼心的設計。不貼心的一點是假若傳輸中斷線,沒傳送完畢的檔案依然會佔用相同大小、 萬一沒注意到發生傳輸中斷的狀況會誤以為傳輸成功;重傳時會移入資源回收桶而非覆蓋(所有覆蓋動作都視同刪除,原檔皆移入資源回收桶)。

建議使用FreeNAS的朋友還是優先考慮FTP,一樣良好的UNICODE支援性、傳輸速度也比CIFS穩定且快速許多(缺點是包括日期時間等屬性無法一併移轉)。

 

2011年2月8日 星期二

2011-02-08 15:30 系統移轉Windows XP免重裝

 網路上許許多多XP移轉的方式,但以下這篇對於AMD-Intel平台間的系統移轉最為有效!

適用於AMD K8 / Intel P4以上硬體系統。


廢話不多說、直接開始。

步驟一,先備份。最基本且必須的(又說了廢話......)。

步驟二
1.由「控制台-新增移除應用程式」移除所有硬體驅動程式。
2. 進入被移轉系統的裝置管理員,將所有使用由AMD / Intel或其他硬體廠商的驅動程式或者指定型號者改為XP預設標準驅動(例如Intel PCI Bus Master IDE Controller改為標準雙通道PCI IDE控制器,以及系統裝置中各項橋接裝置、USB控制器等)。

步驟三由Intel轉移AMD平台最需要注意的(AMD轉移Intel平台可忽略),移除IntelPPM服務。
1.首先在裝置管理員將處理器驅動程式由Intel Processor改為「處理器」。完成後可在「驅動程式詳細資料」見到「驅動程式檔案」由原本的intelppm.sys改為processor.sys

2.開啟「命令提示字元」,執行regedit.exe。將以下位置機碼、系統服務intelppm
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\intelppm]
整個移除(原文的說法是將當中的"Start"值改為"4"、並且將intelppm.sys改名避免載入。但既然AMD平台不需此服務、直接砍掉即可終止服務並避免載入、也可省去改名步驟)。

或者按後述M$ KB953356連結說明,使用 Windows XP CD 執行「修復主控台」。
在「修復主控台」命令提示字元中,輸入下列命令
disable intelppm
然後按下 ENTER。之後執行 exit 離開「修復主控台」。

步驟四,不可再進入Windows,進行系統移轉(ex:關機轉移硬碟)、完工。

將使用非 Intel 處理器的電腦升級至 Windows XP Service Pack 2 或 Windows XP Service Pack 3 後,出現錯誤訊息:「STOP:0x0000007E」

2011-02-08 15:10 Skype工具--記錄檢視器

喜歡在外使用Skype又不習慣清除記錄的人倒楣了。

不需要使用者的帳號密碼,任何人皆可在不登入的狀態下檢查電腦中存放的任何Skype紀錄。

SkypeLogView

下次在外操作他人機器使用Skype、又不願以隨身碟模式運行,請千萬先清除所有紀錄再登出吧。或者登入後先設定不保留任何紀錄,這是最保險的方法。即便用後清除仍有可能透過檔案救援工具修補記錄。

2011-02-08 14:50 Skype工具--SkypeLauncher,快速建立隨身Skype與多重Skype登入

前面介紹的多重Skype帳號&隨身版Skype設定繁雜、而且多重Skype帳號也無法適用於Skype隨身碟模式,要是能二合一豈不完美!

(不過目前Skype付費三通服務被Skype/PChome玩殘了、一般人幾乎沒多帳號的需求.....)

進入正題。首先先下載SkypeLauncher

下載執行安裝,將運作中的Skype「啟動Winodws後,自動執行Skype」的設定取消,並登出帳號同時取消勾選記憶密碼(這部份之後將由SkypeLauncher進行。若不取消SkypeLauncher進行自動登入可能發生錯誤。)接著關閉運作中的Skype,點擊SkypeLauncher_Config.exe進行帳號設定。

Add鈕可以新增需要自動登入的帳號,Modify鈕可以對選定的帳號進行編輯,Delete鈕可以刪除選定的帳號。

USB Export鈕則是將目前的帳號設定以及Skype主程式、用戶記錄一併匯出到SkypeLauncher-USB這個資料夾中。稍後將SkypeLauncher-USB資料夾中所有的檔案拖往隨身碟存放即可。若未結束運作中的Skype便進行匯出作業將會發生檔案複製錯誤。

Save鈕則將目前的帳號設定儲存至registry中並離開設定工具,Cancel鈕則取消所有設定並離開。

往後執行SkypeLauncher.exe便會進行多帳號自動登入。

夠簡單吧!絕對比之前在下提供的方式簡單多了!科技就是要如此才夠人性。

不過千萬注意,由於隨身碟模式會將所有帳號密碼一併存放於skypelauncher.usb這個記錄檔中,一旦遺失隨身碟代表任何人都有可能藉由執行SkypeLauncher輕鬆存取在隨身碟上的Skype紀錄並濫用你的Skype帳號,所以使用SkypeLauncher隨身碟模式請務必謹慎保管隨身碟。

2011-02-08 14:43 Skype小訣竅--隨身Skype與多重Skype登入

是否覺得在外執行Skype缺乏便利性與安全性--既不能透過諸如meebo之類的Web IM執行、而且也需要安裝。記錄又存放在他人主機、Skype又缺乏自動登出功能......如此種種弄個USB隨身碟將Skype與設定記錄隨身攜帶不就安心多了!

Skype大促銷,三通打到爆--但服務組合是否感到不便?如何以多個帳號執行多個三通呢?

本文將告訴你如何在Windows XP下達成以上目標~


首先、先看看如何建立隨身Skype~

1.插入你的USB隨身碟(容量起碼32MB、愈大愈好!若設定不保存記錄,32MB隨身碟即可~)

2.由「開始-程式集-附屬應用程式」開啟「命令提示字元」,進入USB磁碟機路徑

3.輸入引號中指令 "COPY CON Skype.cmd" (不含引號、注意空白!由此複製貼上亦可),按下Enter換行

4.輸入以下字串


START ..\SKYPE\SKYPE.EXE /NOSPLASH /REMOVABLE /DATAPATH:..\SKYPE\


按下Enter換行、然後按住ShiftF6結束編輯。

5.由「檔案總管」開啟USB隨身碟、看看是否有個白底藍框中間帶個金色齒輪名為Skype的檔案。若有表示步驟1~4成功(除內容輸入有誤以外)。接著建立一個名為Skype的資料夾

6.接著另開一個「檔案總管」,進入路徑C:\Program Files\Skype\Phone(預設的Skype安裝路徑),將資料夾中僅有的兩個檔案複製到USB隨身碟的Skype資料夾中。至此大功告成~

順便介紹一下步驟4中所使用的參數。/REMOVABLE表示要求Skype以可攜模式執行;/DATAPATH:..\SKYPE\以相對路徑格式指定Skype設定與記錄存放在隨身碟的Skype路徑中(當中也包含步驟6複製的兩個檔案)

沒圖、看不懂?請由此下載。SkypeUSB.zip當中包含一個額外的Autorun.inf可設定USB隨身碟自動執行Skype,將SkypeUSB.zip中的東西全部拖往USB隨身碟存放、執行步驟5之後的動作即可。


再來、看看如何以多個Skype帳號執行多個三通

Skype提供了目前最超值的節費方案、但可能是最不便的組合--撥打台灣市話長途需用一國通(台灣、或台灣通),亞洲通一個月200分鐘專打台灣手機(當然要浪費亞洲通打台灣市話長途亦非不可~),一個Skype帳號只能綁「一通」。


山不轉路轉、既然Skype提供這麼不便的資費組合、咱們用戶自救以多個Skype帳號個別申請「一通」如何?反正申請Skype帳號不用錢~

但同一時間僅能登入一個Skype帳號、如何同時登入多個Skype帳號?目前網路上提供的多重帳號登入不外乎以設置「執行身份」方式配合多個XP帳號執行多個Skype程式同時以多個Skype身份登入。

 


好處是「似乎」很容易--在Skype捷徑按個滑鼠右鍵選擇帳號輸入密碼就能以另一個XP使用者執行另一個Skype帳號。

但每次開機或登出都得重來,要是有3~4個Skype帳號、如多個一國通(寰宇通建議撥打四國以上才划算!),就算以Runas.exe執行、不輸入帳號的情況下每次也得輸入密碼,多個帳號一樣很不便!


以下介紹另一個替代Runas的多重執行身份小工具,CPAU.exe

要執行幾個Skype帳號請建立幾組對應的系統用戶(管理員身份)。關於建立XP具管理身份使用者的教學請至Google搜尋,此處省略。


1.請先到此下載CPAU.zip。開啟「檔案總管」進入C:\Windows\System32,將CPAU.zip中的CPAU.exe拖往C:\Windows\System32。

2.由「開始-程式集-附屬應用程式」開啟「命令提示字元」。進入C:\根目錄,輸入引號中指令 "COPY CON MultiSkype.cmd" (不含引號、注意空白!由此複製貼上亦可),按下Enter換行

3.輸入以下字串(每個CPAU.exe開頭為一行、請按Enter換行)


CPAU.exe -u USER1 -p PASSWORD1 -ex "C:\Program Files\Skype\Phone\Skype.exe" -lwp

CPAU.exe -u USER2 -p PASSWORD2 -ex "C:\Program Files\Skype\Phone\Skype.exe" -lwp


按下Enter換行、然後按住ShiftF6結束編輯。


#請注意,以上的範例是以另兩個XP帳戶(假設另外建立的兩組Windows XP帳戶ID分別為USER1USER2、密碼分別為PASSWORD1PASSWORD2請注意此處的帳號密碼非Skype帳號密碼)執行額外兩個Skype,所以同時一共執行三組Skype帳號。實際需執行幾個Skype請自行增減命令行。

4.接著開啟「檔案總管」進入C磁碟機,看看是否有個白底藍框中間帶個金色齒輪名為MultiSkype的檔案,拖到桌面每次開機後點擊執行即可。若希望每次開機自動執行,直接拖入「開始-程式集-啟動」當中即可。

沒圖、看不懂?請由此下載。SkypeMulti.zip當中包含一個範例MultiSkype.cmd(可以「開始-程式集-附屬應用程式」當中的「記事本」進行編輯)、以及一個Windows資料夾,將Windows資料夾拖往C磁碟即可將CPAU.exe置入C:\Windows\System32中。

2011-02-08 13:56 老主機板不用關閉ACPI、如何讓PCI裝置在FreeBSD正常運作

在下鄙人我為了省錢、打算用一套老K6配合FreeNAS弄套窮人版NAS。算是跨出了進入FreeBSD的第一步(大概也不會跨更多步了!被GUI寵壞了 XD)。

沒想到第一步還沒落地就跌倒:該死的ACPI讓我的PCI裝置在FreeBSD下失靈了!!

這次窮人版FreeNAS的規格:K6-2 500、磐英MVP3C2、384MB SDRAM、ATI Radeon LE、偽3com 3C905C-TXM、另購SIL3114 RAIDcard以及IDE/CF轉卡搭配PhotoFast SuperCF 4G(我知道FreeNAS只要32MB = =,但沒比這更便宜高速的CF卡了!),稍後可能的儲存裝置為WD7500AACS*2。

早先已經先用VirtualPC2007大致上摸了一遍FreeNAS,功能相當不錯。除了飽經風霜的機殼,雖說是窮人版NAS但實際上也不比一般入門級專用NAS差到哪--更別說低價!(不過沒法取下VGA卡、電力耗用不會比專用NAS低就是,有得必有失)

廢話不多說、回到主題,老主機板啟用ACPI後、如何讓PCI裝置在FreeBSD下正常運作。話說先前的模擬運作相當滿意,進入實機安裝後...... 耶!怎麼網路不通了!還猛刷xl0:watchdog timeout!完蛋了剛出師就出事!趕緊上FreeNAS討論區、Google查詢,瞥見似乎與ACPI有關!趕緊把ACPI關閉了試試先~

哇!關閉ACPI後所有PCI裝置都正常了......咦、怎麼shutdown失效Power Button也失靈了!又是一陣搜尋,原來Soft Power on/off必須配合ACPI!頓時省錢高效能的美夢成了費事的惡夢......

由於FreeNAS本身是精簡版的FreeBSD、欠缺某些BSD核心功能,只能執行dmesg擷取log,為此又特地安裝FreeBSD 7.0RC1。

開機時選擇完整記錄(verbose)登入後再以dmesg取得開機記錄--結果不光PCI、連FDD都出問題(其實壓根也沒打算用FDD、NAS要FDD幹啥?!但修正後的FDD在之後的ACPI調試幫了大忙!)

ACPI Error (dsopcode-0671): Field [IRQL] at 208 exceeds Buffer [BUF0] size 192 (bits) [20070320]

ACPI Error (psparse-0626): Method parse/execution failed [\\_SB_.PCI0.ISA_.FDC0._CRS] (Node 0xc284cd60), AE_AML_BUFFER_LIMIT

ACPI Error (uteval-0309): Method execution failed [\\_SB_.PCI0.ISA_.FDC0._CRS] (Node 0xc284cd60), AE_AML_BUFFER_LIMIT

can't fetch resources for \\_SB_.PCI0.ISA_.FDC0 - AE_AML_BUFFER_LIMIT

acpi0: reservation of 0, a0000 (3) failed

acpi0: reservation of 100000, 17ef0000 (3) failed

ACPI timer: 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 -> 10

Timecounter "ACPI-fast" frequency 3579545 Hz quality 1000

acpi_timer0: <24-bit timer at 3.579545MHz> port 0x4008-0x400b on acpi0

pci_link0:        Index  IRQ  Rtd  Ref  IRQs

 Initial Probe       0   15   N     0  1 3 4 5 6 7 10 11 12 14 15

 Validation          0   15   N     0  1 3 4 5 6 7 10 11 12 14 15

acpi: bad read from port 0x4d1 (8)

acpi: bad write to port 0x4d1 (8), val 0xc

 After Disable       0  255   N     0  1 3 4 5 6 7 10 11 12 14 15

pci_link1:        Index  IRQ  Rtd  Ref  IRQs

 Initial Probe       0   10   N     0  1 3 4 5 6 7 10 11 12 14 15

 Validation          0   10   N     0  1 3 4 5 6 7 10 11 12 14 15

acpi: bad read from port 0x4d1 (8)

acpi: bad write to port 0x4d1 (8), val 0x8

 After Disable       0  255   N     0  1 3 4 5 6 7 10 11 12 14 15

pci_link2:        Index  IRQ  Rtd  Ref  IRQs

 Initial Probe       0    5   N     0  1 3 4 5 6 7 10 11 12 14 15

 Validation          0    5   N     0  1 3 4 5 6 7 10 11 12 14 15

acpi: bad read from port 0x4d0 (8)

acpi: bad write to port 0x4d0 (8), val 0x8

 After Disable       0  255   N     0  1 3 4 5 6 7 10 11 12 14 15


之後以acpidump取得DSDT。後來發現以CBROM將ACPITBL.BIN由BIOS取出後,以HexEditor如Ultraedit將前端部分砍除,保留DSDT[ .....以下部分、透過ACPICA iasl以參數 -d 一樣可decompile還原出所需的DSDT。


先看看DSDT關於Device (FDC0)的敘述


               Device (FDC0)

               {

                   Name (_HID, EisaId ("PNP0700"))

                   Method (_STA, 0, NotSerialized)

                   {

                       ENFG ()

                       If (LEqual (0xFC, CR20))

                       {

                           EXFG ()

                           Return (0x0F)

                       }

                       Else

                       {

                           EXFG ()

                           Return (0x0D)

                       }

                   }

                   Method (_DIS, 0, NotSerialized)

                   {

                       ENFG ()

                       Store (0x00, CR20)

                       EXFG ()

                   }

                   Method (_CRS, 0, NotSerialized)

                   {

                       Name (BUF0, ResourceTemplate ()

                       {

                           IO (Decode16,

                               0x03F2,             // Range Minimum

                               0x03F2,             // Range Maximum

                               0x00,               // Alignment

                               0x04,               // Length

                               _Y0C)

                           IO (Decode16,

                               0x03F7,             // Range Minimum

                               0x03F7,             // Range Maximum

                               0x00,               // Alignment

                               0x01,               // Length

                               )

                           IRQNoFlags ()

                               {6}

                           DMA (Compatibility, NotBusMaster, Transfer8, )

                               {2}

                       })

                       CreateByteField (BUF0, \_SB.PCI0.ISA.FDC0._CRS._Y0C._MIN, IOLO)

                       CreateByteField (BUF0, 0x03, IOHI)

                       CreateByteField (BUF0, \_SB.PCI0.ISA.FDC0._CRS._Y0C._MAX, IORL)

                       CreateByteField (BUF0, 0x05, IORH)

                       CreateByteField (BUF0, 0x19, IRQL)

                       CreateByteField (BUF0, 0x1C, DMAV)

                       Return (BUF0)

                   }

                   Name (_PRS, ResourceTemplate ()

                   {

                       StartDependentFnNoPri ()

                       {

                           IO (Decode16,

                               0x03F2,             // Range Minimum

                               0x03F2,             // Range Maximum

                               0x00,               // Alignment

                               0x04,               // Length

                               )

                           IO (Decode16,

                               0x03F7,             // Range Minimum

                               0x03F7,             // Range Maximum

                               0x00,               // Alignment

                               0x01,               // Length

                               )

                           IRQNoFlags ()

                               {6}

                           DMA (Compatibility, NotBusMaster, Transfer8, )

                               {2}

                       }

                       EndDependentFn ()

                   })

                   Method (_SRS, 1, NotSerialized)

                   {

                       CreateByteField (Arg0, 0x02, IOLO)

                       CreateByteField (Arg0, 0x03, IOHI)

                       CreateWordField (Arg0, 0x19, IRQL)

                       CreateByteField (Arg0, 0x1C, DMAV)

                       ENFG ()

                       Store (0xFC, CR20)

                       EXFG ()

                   }

               }


哈哈、有看沒有懂!再看PCI的(太多了!點這看吧)應該是Device (LNKx)那些吧?更看不懂了!頓時兩腿發軟......


FDD算是最早獲得解答的,搜尋Google後根據一位老外的說法,要將FDC0當中Method (_CRS, 0, NotSerialized)的

                       CreateByteField (BUF0, 0x19, IRQL)

                       CreateByteField (BUF0, 0x1C, DMAV)

改為

                       CreateByteField (BUF0, 0x11, IRQL)

                       CreateByteField (BUF0, 0x14, DMAV)

以及下面的Method (_SRS, 1, NotSerialized)當中

                       CreateWordField (Arg0, 0x19, IRQL)

                       CreateByteField (Arg0, 0x1C, DMAV)

改為

                       CreateWordField (BUF0, 0x11, IRQL)

                       CreateByteField (BUF0, 0x14, DMAV)


接著將改好的DSDT重新compile為AML掛回去......FDD正常了!(這下測試工作可省事了、不用為了靠網路傳檔來來回回啟用關閉ACPI。 沒辦法、我不會用vi,所有log檢視、DSDT的修改、AML的compile仍在Windows下進行 = = 稍後研究AX59Pro的DSDT時發現Aopen也早已對FDC0做同樣修正)。


跳過跳過再跳過(大約一週的時間 = =),無窮無盡的搜尋,由M$網站得知目前Windows ACPI限制BIOS本身經直接存取並嘗試操控系統硬體資源、FreeBSD應當也是有此限制--而本次的問題就是在MVP3C2的BIOS透過ACPI要取得ELCR的控制、結果FreeBSD就出事了(我也搞不清自己在說啥XD)。


接著以Abit NF7-S運作FreeBSD 7.0RC1測試,也是一切正常。顯然MVP3C2的ACPI確實有問題。問題是總不可能把K7的ACPI table套在K6頭上吧!更別說完全不同的廠商與晶片組!

總之又回到了原點、知道不能讓BIOS進行控制、但要如何修改迴避?比對眾家MVP3主機板BIOS、竟在Aopen AX59Pro的BIOS找到答案!


回到MVP3C2的DSDT,看看關於0x4D0、ELCR中斷暫存器的部分


    OperationRegion (ELCR, SystemIO, 0x04D0, 0x02)

    Field (ELCR, ByteAcc, NoLock, Preserve)

    {

       ELC1,   8,

       ELC2,   8

    }


找到了、AX59Pro的DSDT也找到了。再找找ELC1/ELC2,在PCI0/LNKx中,以DEVICE (LNKA)為例,原本MVP3C2的Method (_DIS, 0, NotSerialized)內容如下


                   Method (_DIS, 0, NotSerialized)

                   {

                       Store (0x01, Local3)

                       And (PIRA, 0xF0, Local1)

                       ShiftRight (Local1, 0x04, Local1)

                       Store (Local1, Local2)

                       If (LGreater (Local1, 0x07))

                       {

                           Subtract (Local1, 0x08, Local1)

                       }

                       ShiftLeft (Local3, Local1, Local3)

                       Not (Local3, Local3)

                       If (LGreater (Local2, 0x07))

                       {

                           And (ELC2, Local3, ELC2)

                       }

                       Else

                       {

                           If (LNotEqual (Local2, 0x00))

                           {

                               And (ELC1, Local3, ELC1)

                           }

                       }

                       And (PIRA, 0x0F, PIRA)

                   }

再看看AX59Pro的

                   Method (_DIS, 0, NotSerialized)

                   {

                                               And (PIRA, 0x0F, PIRA)

                   }


哇差那麼多!這部分跟NF7-S的DSDT相當相近!趕緊將MVP3C2的比照修改、上機測試......看看載入修正的AML所跑出的dmesg(FDC0正常運作錯誤訊息從缺!)


ACPI timer: 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 -> 10

Timecounter "ACPI-fast" frequency 3579545 Hz quality 1000

acpi_timer0: <24-bit timer at 3.579545MHz> port 0x4008-0x400b on acpi0

pci_link0:        Index  IRQ  Rtd  Ref  IRQs

 Initial Probe       0   15   N     0  3 4 5 7 9 10 11 12 14 15

 Validation          0   15   N     0  3 4 5 7 9 10 11 12 14 15

 After Disable       0  255   N     0  3 4 5 7 9 10 11 12 14 15

pci_link1:        Index  IRQ  Rtd  Ref  IRQs

 Initial Probe       0   10   N     0  3 4 5 7 9 10 11 12 14 15

 Validation          0   10   N     0  3 4 5 7 9 10 11 12 14 15

 After Disable       0  255   N     0  3 4 5 7 9 10 11 12 14 15

pci_link2:        Index  IRQ  Rtd  Ref  IRQs

 Initial Probe       0   12   N     0  3 4 5 7 9 10 11 12 14 15

 Validation          0   12   N     0  3 4 5 7 9 10 11 12 14 15

 After Disable       0  255   N     0  3 4 5 7 9 10 11 12 14 15

pci_link3:        Index  IRQ  Rtd  Ref  IRQs

 Initial Probe       0    5   N     0  3 4 5 7 9 10 11 12 14 15

 Validation          0    5   N     0  3 4 5 7 9 10 11 12 14 15

 After Disable       0  255   N     0  3 4 5 7 9 10 11 12 14 15


爽呼、不再發生ACPI read/write error!就算插上3張網卡都由FreeBSD正確控制也沒一張會watchdog timeout啦!


Aopen 工程師好樣的、最後的改版竟然已經改到這一步,AX59Pro同時也在DSDT中加入OS_敘述讓作業系統決定ACPI控制權,將過時的MVP3板子進一 部提升對WinXP ACPI相容性(FreeBSD也因此跟著受惠......更意外的是MVP3C2以及其他老主機板與現有OS ACPI衝突的因此雨露均霑 XD)


到此對於磐英MVP3C2與FreeBSD ACPI造成FDD與PCI裝置失效的處理算是告一段落、非MVP3的晶片組應當也是差不多的方式迴避BIOS直接存取中斷暫存器所造成的裝置失效問題(起碼看過NF7-S的DSDT也是如此)~


修改過的磐英MVP3C2 AML / BIOS可由此取得(擔心BIOS刷出毛病的可用掛載AML方式overide FreeBSD ACPI。不怕刷BIOS出問題想一勞永逸的就刷吧!記得備份!)


後記:

1. 過程當中、首先以1806版的BIOS修改、結果以CBROM重新打包後發生寫入錯誤、BIOS失效的情況(完蛋了、上哪弄ISA顯卡?)。幸好插上 SiS6326 PCI後可進入緊急救援畫面。救援模式重刷BIOS時必須先將BIOS檔改名為AWARDEXT.ROM才可正常回刷!

2.由於習慣Windows的工具、包含磁碟偵錯(HDDtune/HDDscan以及各廠商的HD diagnostic tool),打算將CF卡另搞分割區安裝WinPE以執行這類工具。

結果WinPE掛了!趕緊刷回原本BIOS、WinPE可正常執行!幾經週折,發現以iasl compile AML時不可採最佳化模式,需要以參數 -oa 取消最佳化。另外原本的ASL也存在error,若不想修正的情況下也需以參數 -f 強制compile(強制compile過程中的error並未造成稍後運作的顯著問題。不過在下的修正AML已將有問題的code一併修改)。