[PR]キャリアアップ費に50万当る:ビジネスに+なスキルアップを♪車も当る


                                                                                   
下記にieee1394は利用できないと記載していますが、以下の設定を行う事でカーネル標準のドライ
バでIEEE1394が動作する可能性がある。

WinXP コントロールパネルの「東芝HWセットアップ」にある「デバイスの設定」を「全デバイス設
定」へ変更し「適用」or「OK」ボタンを押す。
Redhat9では確認済み。
電源投入時ESCを押しっぱなしにした後にF1キーを押すことでデフォルト設定に戻ります。


LibrettoL1 Redhat8.0のieee1394


LibrettoL1の1394はRedhat8.0カーネルで動作しない。
原因は、1394デバイスのPCI Configuration Registersにある以下の内容が0にクリアされているため。
・OHCI registers base address
・Interrupt line
また直接影響は無いが、TI extension registers base addressもクリアされている。
PCIデバイスのenableを行う pci_enable_device()の中でパワーマネージメント設定値を変更することで0にクリアされる。
直接値を0クリアしている動作は行っていないため、デバイスのパワーマネージメント仕様なのだろう。
実際に8139のネットワークドライバでは、Resume処理でD0モードへ変更した後にコンフィグレーション空間を再設定いているコードがある。
(PCI Bus Power Management Interface Specificationには、D3からD0へ移行した場合、PCIコンフェィグレーション空間の最初期化が必要と記載されている)

電源投入時1394はD3モードとなっている。
今後ACPI系パワーマネージメント処理が改善される事を期待しながら現状のカーネルで1394を利用できるようにしてみる。
Kernel初期化段階のPCIデバイス情報作成時、このエリアのデータは正しい値を保持しているので、PCIデバイス情報にオリジナル設定値が確保されている。
そこで、0クリアされた値をこのPCIデバイス情報から元に戻すことにする。
Patchは、これ
Latency Timer and Class Cache Line Size Register Description値(address 0x0cから1Word)も0クリアされるためpci_enable_device()実行前に保存し戻している。


--- drivers/ieee1394/ohci1394.c.orig    2003-04-05 17:28:40.000000000 +0900
+++ drivers/ieee1394/ohci1394.c 2003-04-08 20:16:48.000000000 +0900
@@ -2027,12 +2027,22 @@
        unsigned long ohci_base, ohci_len;
        int i;

+       u16     data;
+
        if (version_printed++ == 0)
                PRINT_G(KERN_INFO, "%s", version);

+       pci_read_config_word(dev,PCI_CACHE_LINE_SIZE,&data);
        if (pci_enable_device(dev))
                FAIL(-ENXIO, "Failed to enable OHCI hardware %d",
                        card_id_counter++);
+
+       mdelay(10);
+       pci_write_config_word(dev,PCI_CACHE_LINE_SIZE,data);
+       pci_write_config_word(dev,PCI_INTERRUPT_LINE,dev->irq);
+       pci_write_config_dword(dev,PCI_BASE_ADDRESS_0,pci_resource_start(dev, 0));  
+       pci_write_config_dword(dev,PCI_BASE_ADDRESS_1,pci_resource_start(dev, 1));  
+
        pci_set_master(dev);

        host = hpsb_alloc_host(ohci1394_driver, sizeof(struct ti_ohci));


kernelソースは2.4.18-27。利用した.configはこれ
問題無く起動できれば、ieee1394デバイスが認識される。
ここから先は、各々のデバイス用に必要な設定を行うこと。
私はHDDを接続し動作確認しOK。

swsuspとieee1394

swsuspに用いたバージョンは、Kernel 2.4.21-pre6/ACPI Patch 2.4.21-pre6/swsusp 2.4.21-pre5。
swsusp 2.4.21-pre5パッチを当てると、drivers/acpi/system.cの一ヶ所がrejectされるため、手作業で修正。
この修正は、良くソースを見て正しく設定する事。
swsusp 2.4.21-pre6が出るまで待つのも吉かも。
  また、drivers/usb/usb-ohci.cへ当てていたReBoot用パッチは、drivers/usb/host/usb-ohci.cファイルへ当てなければならない。

Kernel 2.4.18-27用1394パッチでは、hibernate/resume後動かない。
そこで、Patchはこれを利用する。


--- drivers/ieee1394/ohci1394.c.orig    2003-04-05 22:31:51.000000000 +0900
+++ drivers/ieee1394/ohci1394.c 2003-04-08 20:17:43.000000000 +0900
@@ -3212,11 +3212,22 @@
        struct ti_ohci *ohci;   /* shortcut to currently handled device */
        unsigned long ohci_base;

+       u16     data;
+
        if (version_printed++ == 0)
                PRINT_G(KERN_INFO, "%s", version);
+       dev->current_state = 4;
+       pci_read_config_word(dev,PCI_CACHE_LINE_SIZE,&data);
        if (pci_enable_device(dev))
                FAIL(-ENXIO, "Failed to enable OHCI hardware %d",
                        card_id_counter++);
+
+       mdelay(10);
+       pci_write_config_word(dev,PCI_CACHE_LINE_SIZE,data);
+       pci_write_config_word(dev,PCI_INTERRUPT_LINE,dev->irq);
+       pci_write_config_dword(dev,PCI_BASE_ADDRESS_0,pci_resource_start(dev, 0));
+       pci_write_config_dword(dev,PCI_BASE_ADDRESS_1,pci_resource_start(dev, 1)); 
+
        pci_set_master(dev);

        host = hpsb_alloc_host(&ohci1394_driver, sizeof(struct ti_ohci));


利用した.configはこれ
swsusp用/usr/sbin/hibernateファイルはこれ、/etc/suspend.confファイルはこれ

元々ohci1394ソースは、パワーマネージメント動作に対応していない上に再初期化可能な構造になっていない。
このソースを大幅に修正する気力はないし、パワーマネージメント対策はオリジナルソースが対応してくれる事を期待。
上記パッチは、1394をモジュール化する事を前提に記述している。
また、hibernate実行前に1394デバイスをmountしている場合は必ずumountしておくこと。

一応swsuspでの流れを簡単に記述する。
hibernateによりモジュールは一度removeされる。
そして電源ON(resume)時ohci1394モジュールをmodprobe(insmod)するが、PCIデバイス情報が既に動作している情報(D0モード)を保持しているため、電源ON時D3モードとなっている1394をD0モードに変更しない。
そのため、1394のPCIデバイス情報を初期化時と思わせるようステータスへ値4を設定した。
値4を直接記述するのは気が引けたが、driver/pci/pci.c中でも直接マジックナンバーとして利用されている。


2003/7/16更新

[PR]何かを探す前に無料占い:当たる!無料占い『スピリチュアルの館』