下記に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中でも直接マジックナンバーとして利用されている。